c - 给定一个完全链接的 a.out,它定义了符号 foo,我如何知道该定义来自哪个目标文件,而不重新链接 a.out?
问题描述
我正在尝试解析 ELF 文件并创建每个目标文件中定义的符号列表。除了符号和目标文件之间的链接之外,我能够找到我需要的一切。
我在 ELF 规范中找不到类似的东西。在我正在解析的这个特定文件中,我有一些可以使用的嵌入式 DWARF 调试信息,但理想情况下,我想找到标准的符号和对象之间的链接,因为我想将它应用于许多非 GCC 编译器。
解决方案
我正在尝试解析 ELF 文件并创建每个目标文件中定义的符号列表。
您是在处理单个ELF 对象文件,还是完全链接的可执行文件或共享库?由于您的问题有意义的唯一方法是后者,让我们假设您的实际问题是:
a.out
给定一个定义符号的完全链接的,foo
我如何知道该定义来自哪个目标文件,而不重新链接a.out
?.
一般来说,你不能。
首先,并非其中定义的每个符号都a.out
可能来自目标文件:有些可能是通过链接描述文件或--defsym
命令行参数定义的。
其次,弱符号可以定义在多个目标文件中,链接器可以自由选择其中任何一个。
最后,. 文件中绝对没有目标文件 -> 符号关联的记录a.out
。事实上,您甚至无法提取.o
链接的文件列表(无需重做链接并要求链接器打印它们)。
您可以通过查看调试信息来重新建立这种关联,这将告诉您该符号来自哪个翻译单元,然后猜测可能 foo.c
已编译为foo.o
,但这可能再次失败,因为foo.c
可能已编译为bar.o
and baz.o
(使用不同的-DFOO
定义)。
推荐阅读
- shopify - 如果购物车的任何物品有特定标签,则显示 HTML
- javascript - 具有位置的子 div:绝对不充当嵌套子项
- r - 如何在 Ubuntu 18.04.3 LTS(仿生海狸)上安装 Tidyverse?
- php - 准备好的行数语句有问题
- c# - dotnet core 2.1 httpclient System.Net.Sockets.SocketException
- sql - 如何在具有分隔符“;”的字符串中搜索整个单词?
- java - 异常处理程序设计问题
- xctest - 如何从 XCUITest(来自 Xcode 11)中的 xcresult 文件中提取详细信息?
- html - 光滑的溢流宽度无限
- visual-studio-code - vs code 如何与 power bi (.pbix) 一起工作以进行版本控制?