0

我有一个启用调试的二进制文件、与之静态链接的 .a 文件的集合,以及所有内容的源代码。

如何获得一个可解析的转储,其中列出了最终可执行二进制文件中的每个符号名称,以及它来自哪个 .a 和 .o?(如果可能,加上原始 .c/.cpp 文件。)

库中有一系列交叉依赖、循环依赖,甚至是几个定义的符号,我试图将它们映射出来,最终目标是重新创建构建系统。不知何故,旧的构建系统设法将所有东西连接在一起。(我认为更多的是偶然而不是设计......)

到目前为止,我已经尝试了各种调用,nm但似乎无法获得这些数据。也许nm是错误的工具。

4

1 回答 1

1

到最终二进制文件链接时,有关哪个符号来自哪个.o.a丢失的信息。

由于您有可用的调试信息,因此您可以知道每个符号的来源,这可以帮助您重建丢失的信息(或不:如果foo.c编译为foo1.o,foo2.ofoo3.o(例如使用不同-DFOO=1的等标志),然后填充到不同的存档库,那么就没有简单的方法来判断哪个对象将符号贡献给最终的二进制文件。希望你的旧构建系统没有那么糟糕。

所以,

# list of global symbols and their addresses
nm a.out | egrep ' [TDW] '

# dump source for every symbol
addr2line a.out < /list/of/addresses/from/above

# list all objects in all libraries
ar t *.a

现在您有足够的信息将大多数符号映射到它们来自的对象。可能会有 <= 10% 的源文件名与目标文件名不匹配。这些你必须手动解决。

于 2011-10-26T03:55:18.840 回答