如何查看.so文件的目标文件内容

2024-04-07

如何查看.o文件构成.so文件?

意味着如何注意到哪些目标文件用于从 .so 文件构建 .so 文件(如果我只有 .so 文件)


你不能know,给定一个共享库,目标文件是什么 编译到其中。如果你幸运的话,你也许能够做出合理的猜测。

共享库是由链接器从目标文件创建的 可能还有其他共享库,但它没有contain目标文件 或从中创建它的共享库。 Astatic另一方面,图书馆 由存档者制作ar https://linux.die.net/man/1/ar, does包含对象 文件:这只是一个ar目标文件的归档。

如果共享库尚未去除调试信息,则 出于调试目的,其符号表将包含source文件 从中编译链接到共享库中的目标文件 - 至少是那些使用调试信息编译的源文件。 从这些源文件的名称,您可以推断出目标文件的名称 有合理的信心,但没有确定性。

例如,这里我们从源文件制作一个共享库foo.c and bar.c.

将源文件编译为目标文件:

$ gcc -Wall -fPIC -c -o foo.o foo.c
$ gcc -Wall -fPIC -c -o bar.o bar.c

链接目标文件以创建共享库:

$ gcc -shared -o libfoobar.so foo.o bar.o

Then:

$ readelf -s libfoobar.so | grep FILE
26: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
35: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS foo.c
37: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS bar.c
39: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
42: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 

表示三个源文件已向 库,我们会推断它们被编译到的目标文件 很可能是:

crtstuff.o
foo.o
bar.o

注意crtstuff.c不是源文件之一we编译。它 恰好包含来自 C 运行时库的程序初始化和终止代码,该代码已进入 我们的库来自默认链接的 C 运行时目标文件。

对于任何文件,此推论都可能是错误的,因为:

$ gcc -Wall -fPIC -c -o abc.o foo.c
$ gcc -Wall -fPIC -c -o xyz.o bar.c
$ gcc -shared -o libfoobar.so abc.o xyz.o

也是编译和链接库的一种完全可能的方式。

如果调试信息已从库中删除:

$ strip -g libfoobar.so

那么我们就不走运了:

$ readelf -s libfoobar.so | grep FILE
$

No more FILE符号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何查看.so文件的目标文件内容 的相关文章

随机推荐

  • 如何检查libc++是否安装?

    我正在从源头构建一些东西 我的系统的 gcc 和 stdlibc 太旧了 但是我可以使用 clang 构建 默认情况下 clang 使用 stdlibc 但可以选择安装 libc 以供 clang 使用 检查 libc 是否与 clang
  • 调用未定义的函数 apache_request_headers()

    我刚刚将脚本切换到不同的服务器 在以前的服务器上 这工作得很好 现在我已经将它们切换到不同的服务器 我无法理解这个问题 我不确定这会有帮助 但这是相关的代码 headers apache request headers PHP版本是 PHP
  • 如何将SQL用户自定义函数添加到实体框架中?

    我可以像在 dbml 中那样向 edmx 文件添加 SQL 函数吗 如果可以的话 我该怎么做 如果我不能 有什么解决方法吗 我尝试谷歌 但找不到任何关于如何做到这一点的具体答案 根据给定的答案 我创建了一个存储过程并尝试添加 导入函数 但它
  • java 7 接口中默认方法的替代方案(仅在 Java 8 中)

    我想在我的一个接口类中使用默认方法 然后我意识到这仅在 Java 8 中可用 而我们正在使用 Java 7 在 Java 7 中实现类似的最佳方法是什么 将方法签名放在接口中 就像 Java 8 中一样 将您的方法默认实现放在实现该接口的抽
  • 无法通过代理建立隧道。代理通过 https 返回“HTTP/1.1 407”

    我尝试通过需要身份验证的 https 连接到服务器 此外 我中间有一个也需要身份验证的 http 代理 我使用 ProxyAuthSecurityHandler 向代理进行身份验证 使用 BasicAuthSecurityHandler 向
  • Rails 资源未更新

    我有一个 Rails 3 1 应用程序 由于某种原因 当我更改 CSS 时 更改不会显示 我做到了bundle exec rake assets precompile它曾经有帮助 但现在无论如何我都坚持使用旧的CSS 由于您的资产现已预编译
  • 如何使用 Window() 计算 PySpark 中的滚动中位数?

    如何计算前 3 个值的窗口大小的美元滚动中位数 输入数据 dollars timestampGMT 25 2017 03 18 11 27 18 17 2017 03 18 11 27 19 13 2017 03 18 11 27 20 2
  • “rails server”命令在终端中不起作用

    我对 Rails 还很陌生 正在尝试设置一个非常简单的测试站点 我使用以下命令创建了新的 Rails 应用程序目录rails new命令 但无法设置服务器以在浏览器中查看页面 以下是我尝试时收到的消息rails server MacBook
  • PyCryptodome 错误:MAC 检查失败

    我正在 Python 3 中使用 Pycryptodome 开发一个加密程序 我试图加密一个 字节 字符串 然后解密它并验证 MAC 标签 当我验证它时 会抛出错误 这是代码 from Crypto Cipher import AES fr
  • boost :仅迭代 ptree 的元素

    这应该很简单 我只是在学习提升 所以我错过了一些东西 我已经使用 json read 读取了一些简单的 JSON 现在有了一个 ptree 网络上的所有示例都显示使用 ptree get entry name 来获取条目 我想做的就是 pt
  • 在 AngularJS 中加载图像目录

    我正在尝试在我的 Angular 应用程序中实现一个图片库 我已经在这篇文章中管理了图片的上传 文件上传 如果目录不存在则创建 https stackoverflow com questions 30150646 file upload c
  • Rcpp 和 boost:它应该可以工作,但不能

    我对在以下位置找到的有趣帖子有疑问 具有四精度计算的 Rcpp https stackoverflow com questions 42262963 rcpp with quad precision computation I use Rc
  • 在 Pygame 中获取等距平铺鼠标选择

    I m not managing to get this math correct and it s a little bit difficult to explain in words I have managed to create a
  • 我可以使用具有固定输入的“map”吗?

    假设我这样做f x y 2x ythen map f 2 4 6 1 1 1 我会得到 3 element Array Int64 1 5 9 13 If I do map f 2 4 6 1 即我想假设第二个输入始终相同 我会得到 1 e
  • Django admin TabularInline - 有没有添加自定义 html 列的好方法?

    我有一个模型 Entry 其中包含一个简单的属性 property def image self return str self id self round season name self round theme self person
  • 为什么 PyCharm 使用双反斜杠来表示转义?

    例如 我编写一个正常字符串和另一个 异常 字符串 如下所示 现在我调试一下 发现在调试工具中 异常 字符串会显示如下 这是问题 为什么 PyCharm 显示双反斜杠而不是单个反斜杠 众所周知 means 有什么窍门吗 我相信正在发生的是 在
  • Lync - 与 ContactEndpoints 行为不一致

    我正在为基于 Lync 的公司目录开发自定义 UI 我使用 Lync 2013 执行此搜索 Container Instance Lync ContactManager BeginSearch SearchQuery SearchProvi
  • 转储数据库并以新名称重新导入

    如果我需要使用 MySQL 将数据库 foo 的内容复制到第二个数据库 bar 中 我通常会这样做 mysqldump u root foo gt foo sql mysql u root e CREATE DATABASE bar mys
  • 将 EJB Jar 部署到 Glassfish 时出现异常

    这是我第一次尝试使用 JMS 我已经成功创建 部署了一个 war 文件 其中包含一个可用于上传文件的 servlet 上传文件时 它会向 JMS 队列发送一条消息 接下来 我编写了一个侦听器来从队列中检索上传的消息 但是当我尝试部署它时 出
  • 如何查看.so文件的目标文件内容

    如何查看 o文件构成 so文件 意味着如何注意到哪些目标文件用于从 so 文件构建 so 文件 如果我只有 so 文件 你不能know 给定一个共享库 目标文件是什么 编译到其中 如果你幸运的话 你也许能够做出合理的猜测 共享库是由链接器从