给定一个定义符号 foo 的完全链接的 a.out,我如何在不重新链接 a.out 的情况下判断该定义来自哪个目标文件?
Given a fully linked a.out, which defines symbol foo, how can I tell which object file that definition came from, without relinking the a.out?
我正在尝试解析一个 ELF 文件并创建一个在每个目标文件中定义的符号列表。除了符号和目标文件之间的 link 之外,我能够找到我需要的一切。
我在 ELF 规范中找不到类似的内容。
在我正在解析的这个特定文件中,我有一些可以使用的嵌入式 DWARF 调试信息,但理想情况下,我想在符号和对象之间找到一个标准的 link,因为我想将其应用于许多非 GCC 编译器.
I'm trying to parse an ELF file and create a list of symbols defined in each object file.
您处理的是单个 ELF 对象文件,还是完全linked 的可执行文件或共享库?由于您的问题唯一有意义的方法是后者,我们假设您的 实际 问题是:
给定一个完整的 linked a.out
,它定义了符号 foo
,我如何知道该定义来自哪个目标文件,而不需要重新 link正在 a.out
?.
一般情况下,你不能。
首先,并非 a.out
中定义的每个符号甚至都可能来自目标文件:有些可能是通过 linker 脚本或 --defsym
命令行参数定义的。
其次,弱符号可以定义在多个目标文件中,linker可以自由选择其中的任何一个。
最后,a.out
中绝对没有目标文件->符号关联的记录。事实上,您甚至无法提取 link 编辑的 .o
文件列表(无需重做 link 并要求 link 人员打印它们)。
你可能可以通过查看调试信息来重新建立这种关联,它会告诉你符号来自哪个翻译单元,然后猜测可能 foo.c
被编译成 foo.o
,但这可能再次失败,因为 foo.c
可能已被编译成 bar.o
和 baz.o
(与不同的 -DFOO
定义)。
我正在尝试解析一个 ELF 文件并创建一个在每个目标文件中定义的符号列表。除了符号和目标文件之间的 link 之外,我能够找到我需要的一切。
我在 ELF 规范中找不到类似的内容。 在我正在解析的这个特定文件中,我有一些可以使用的嵌入式 DWARF 调试信息,但理想情况下,我想在符号和对象之间找到一个标准的 link,因为我想将其应用于许多非 GCC 编译器.
I'm trying to parse an ELF file and create a list of symbols defined in each object file.
您处理的是单个 ELF 对象文件,还是完全linked 的可执行文件或共享库?由于您的问题唯一有意义的方法是后者,我们假设您的 实际 问题是:
给定一个完整的 linked a.out
,它定义了符号 foo
,我如何知道该定义来自哪个目标文件,而不需要重新 link正在 a.out
?.
一般情况下,你不能。
首先,并非 a.out
中定义的每个符号甚至都可能来自目标文件:有些可能是通过 linker 脚本或 --defsym
命令行参数定义的。
其次,弱符号可以定义在多个目标文件中,linker可以自由选择其中的任何一个。
最后,a.out
中绝对没有目标文件->符号关联的记录。事实上,您甚至无法提取 link 编辑的 .o
文件列表(无需重做 link 并要求 link 人员打印它们)。
你可能可以通过查看调试信息来重新建立这种关联,它会告诉你符号来自哪个翻译单元,然后猜测可能 foo.c
被编译成 foo.o
,但这可能再次失败,因为 foo.c
可能已被编译成 bar.o
和 baz.o
(与不同的 -DFOO
定义)。