【问题标题】:debug binary: How to dump which .a/.o each symbol came from?调试二进制文件:如何转储每个符号来自哪个 .a/.o?
【发布时间】:2011-10-25 20:08:13
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: debugging linker gdb debug-symbols nm


    【解决方案1】:

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

    由于您有可用的调试信息,您可以知道每个符号的来源,这可能有助于您重建丢失的信息(或不:如果 foo.c 编译为 foo1.ofoo2.o 和 @987654326 @ (例如使用不同的-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
    

    现在您有足够的信息将大多数符号映射到它们来自的对象。可能会有

    【讨论】:

      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2021-03-17
      相关资源
      最近更新 更多