What to do with "DWARF error: section .debug_info is larger than its filesize!"?

What to do with "DWARF error: section .debug_info is larger than its filesize!"?

正在寻找在我的二进制文件中查看生成的特定函数的汇编程序的方法(准确地说是 .so),正如我在 Compiler Explorer, I found How to disassemble one single function using objdump? 上看到的类似内容并基于那里的答案(和也是我的进一步搜索)我最终使用了以下命令:

objdump --wide --no-address --no-show-raw-insn [--demangle] --disassemble="<symbol>" -- "<binary>"

我发现 <symbol> 使用:

objdump --syms [--demangle] -- "<binary>" | grep <function>

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


结果已经很不错了。但是,browsing through objdump options 我看到有希望的:

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

INITIAL: 第一个 (-C / --demangle) 导致根本没有反汇编打印。没有它,在 Disassembly of section .text: 行之后我有一行带有符号后跟反汇编。使用此选项,符号和反汇编不会显示,而是 Disassembly of section .fini: 紧随其后。

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

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

objdump: DWARF error: section .debug_info is larger than its filesize! (0x7b5000e1 vs 0x3e503e10)

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

这个错误是从哪里来的?我该怎么办?该二进制文件是使用 GCC 10.2.0 构建的。 objdump 是 2.36.


还有一个疑问是--no-address的使用。它确实有助于比较各种构建之间的反汇编结果。否则,地址的变化会使差异混乱。

但是,没有地址,我怎么能看到跳转的目标呢?现在,我知道有 --visualize-jumps 但是对于较长的函数,输出太混乱了。再一次,它与差异不相配。

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

我做了更多的“研究”,似乎我被报告给 GNU binutils 的问题击中了,因为 bug 28834. The diff of the fix 甚至显示了 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.

中修复