我有一个启用调试的二进制文件,它静态链接的.a文件的集合,以及所有内容的来源。
如何获得一个可解析的转储,列出最终可执行二进制文件中的每个符号名称,以及它来自哪个.a和.o? (如果可能,再加上原始的.c / .cpp文件。)
库中有一系列交叉依赖,循环依赖,甚至一些多重定义的符号,我试图用最终目标重新构建构建系统。不知何故,旧的构建系统设法将所有内容链接在一起。 (更多的是偶然而不是设计我认为......)
到目前为止,我已经尝试了nm
的各种调用,但似乎无法获得这些数据。也许nm
是错误的工具。
答案 0 :(得分:1)
在最终二进制文件被链接时,哪个符号来自哪个.o
或.a
丢失。
由于您有可用的调试信息,您可以知道每个符号的来源,这可能有助于您重建丢失的信息(或者不是:如果foo.c
被编译为foo1.o
,{{ 1}}和foo2.o
(例如,使用不同的foo3.o
等标志),然后填入不同的归档库,然后没有简单的方法来告诉哪个对象将符号贡献给最终的二进制文件。希望你的旧构建系统并不那么糟糕。
所以,
-DFOO=1
现在您有足够的信息将大多数符号映射到它们来自的对象。可能有<= 10%的源文件名与目标文件名不匹配的源。这些你必须手工解决。