首页 > 解决方案 > 给定一个完全链接的 a.out,它定义了符号 foo,我如何知道该定义来自哪个目标文件,而不重新链接 a.out?

问题描述

我正在尝试解析 ELF 文件并创建每个目标文件中定义的符号列表。除了符号和目标文件之间的链接之外,我能够找到我需要的一切。

我在 ELF 规范中找不到类似的东西。在我正在解析的这个特定文件中,我有一些可以使用的嵌入式 DWARF 调试信息,但理想情况下,我想找到标准的符号和对象之间的链接,因为我想将它应用于许多非 GCC 编译器。

标签: csymbolself

解决方案


我正在尝试解析 ELF 文件并创建每个目标文件中定义的符号列表。

您是在处理单个ELF 对象文件,还是完全链接的可执行文件或共享库?由于您的问题有意义的唯一方法是后者,让我们假设您的实际问题是:

a.out给定一个定义符号的完全链接的,foo我如何知道该定义来自哪个目标文件,而不重新链接a.out.

一般来说,你不能。

首先,并非其中定义的每个符号都a.out可能来自目标文件:有些可能是通过链接描述文件或--defsym命令行参数定义的。

其次,符号可以定义在多个目标文件中,链接器可以自由选择其中任何一个。

最后,. 文件中绝对没有目标文件 -> 符号关联的记录a.out。事实上,您甚至无法提取.o链接的文件列表(无需重做链接并要求链接器打印它们)。

可以通过查看调试信息来重新建立这种关联,这将告诉您该符号来自哪个翻译单元,然后猜测可能 foo.c已编译为foo.o,但这可能再次失败,因为foo.c可能已编译为bar.oand baz.o(使用不同的-DFOO定义)。


推荐阅读