如何处理“DWARF 错误:.debug_info 部分大于其文件大小!”?

Ada*_*ura 13 elf debug-symbols objdump disassembly dwarf

寻找在我的二进制文件(准确地说.so)中查看特定函数的生成汇编程序的方法,就像我在Compiler Explorer上看到类似的那样,我发现了How to disassemble one single function using objdump? 并根据那里的答案(以及我的进一步搜索)我最终使用了以下命令:

objdump --wide --no-address --no-show-raw-insn [--demangle] --disassemble="<symbol>" -- "<binary>"
Run Code Online (Sandbox Code Playgroud)

<symbol>我发现使用的地方:

objdump --syms [--demangle] -- "<binary>" | grep <function>
Run Code Online (Sandbox Code Playgroud)

其中,the 又<function>是我感兴趣的 C++ 函数名称。当然,the<symbol>是一个损坏的名称。(为了完整起见,我得到了两个结果 - 一个是预期的结果,另一个是带.cold后缀的结果,由“主结果”使用。)


结果已经很扎实了。然而,浏览objdump选项后我看到了有希望的选项:

  • -C/ --demangle,
  • -l/ --line-numbers,
  • -S/ --source

但是,我无法让他们工作......

INITIAL:第一个 ( -C/ --demangle) 导致根本不打印任何反汇编代码。如果没有它,在该Disassembly of section .text:行之后我会有一行带有符号的行,后跟反汇编。使用此选项时,不会显示符号和反汇编,而是Disassembly of section .fini:立即显示。

编辑:经过多次尝试,我注意到如果我只提供,而不命名符号,-C/--demangle似乎工作正常。这帮助我识别了这个选项的问题:如果使用它,它也期望参数被分解!使用 C++,写下正确的符号名称可能并不容易,但如上所述的相同技巧会有所帮助 - 只需在调用中添加/即可打印分解名称。然而,下面描述的问题仍然存在。--disassemble<symbol>-C--demangle--syms

第二个 ( -l/ --line-numbers) 和第三个 ( -S/ --source) 导致打印错误

objdump: DWARF error: section .debug_info is larger than its filesize! (0x7b5000e1 vs 0x3e503e10)
Run Code Online (Sandbox Code Playgroud)

紧接着符号行,然后是反汇编。-l除了/选项之外,输出中没有明显的变化,--line-numbers在反汇编之前,有另一行将符号名称打印为函数名称(带有()后缀)。

这个错误从何而来?我能做些什么?该二进制文件是使用 GCC 10.2.0 构建的。是objdump2.36。


另一个疑问是使用--no-address. 它确实有助于比较不同版本之间的反汇编结果。否则,地址的更改会使差异变得混乱。

但是,如果没有地址,我如何才能看到跳转的目标呢?现在,我知道有--visualize-jumps,但对于较长的函数,这输出太混乱了。再说一遍,它与差异并不兼容。

是否有一个选项可以“重新计算”地址,以便它们始终从指定的索引开始(0我猜......)?或者像编译器资源管理器在其输出模式之一中所做的那样添加“标签”

Ada*_*ura 15

我做了一些更多的“研究”,似乎我受到了向 GNU 报告的 bug 28834 问题binutils影响修复的差异甚至显示了is larger than its filesize!打印的变化。

不过,该修复尚未发布,当前版本2.38于 2022-01-22 发布,而修复已于 2022-02-02 完成。根据之前两个版本的日期,我们预计2.39(修复后)会在 2022 年 7 月左右发布。

编辑:似乎在如何binutils发布他们的版本方面存在更多混乱,并且2.38毕竟包含修复程序。我将其安装在我的计算机上,并且不再观察到所报告的错误。--line-numbers使用优化构建和从优化构建中获取任何内容都需要花费非常长的时间--source(事实上,我没能等到最后......),但它不再报告错误。因此,看来所讨论的问题是一个错误,binutils已在2.38.