【问题标题】:How does objdump manage to display source code with the -S option?objdump 如何使用 -S 选项显示源代码?
【发布时间】:2011-01-31 10:43:20
【问题描述】:

二进制文件中是否有对源文件的引用?我尝试在二进制文件上运行字符串,但找不到对列出的源文件的任何引用...

【问题讨论】:

标签: c linux gcc disassembly objdump


【解决方案1】:

我的理解是objdump要从二进制代码中显示源代码,有一个前提条件:必须将DWARF调试信息编译成二进制。 (gcc -g sourcefilegcc -gdwarf-2 sourcefile) 并且通过处理这个 DWARF 信息objdump 能够得到源代码作为@vlcekmi3 和@vkrnt 回答

【讨论】:

  • 您是说我们必须在启用 dwarf 调试的情况下进行编译,然后使用objdump(带有一些未知选项)来显示与反汇编交错的源代码?你能用实际的命令提供实际的步骤吗?
【解决方案2】:

二进制文件中的 dwarf 信息存储了指令(实际上是指令指针或 IP)与源文件和行号之间的映射。源文件是使用完整路径指定的,因此即使移动二进制文件也可以找到它。要查看此信息,您可以使用objdump --dwarf=decodedline <binary>(二进制当然必须使用-g 编译)。

一旦你说objdump -S <binary>,它就会使用这个矮人信息为你提供源代码以及反汇编。

【讨论】:

  • 也许你应该提供一个活生生的例子。我无法让objdump 提供交错的源代码行号的反汇编。
【解决方案3】:

objdump 使用编译成二进制文件的 DWARF 调试信息,它引用源文件名。如果二进制文件没有使用调试信息编译,或者objdump 找不到源文件,那么您的输出中就不会得到源代码 - 只有程序集。

在二进制文件上使用strings 时看不到源文件名,因为 DWARF 使用压缩。

【讨论】:

  • 您是说我们必须在启用 dwarf 调试的情况下进行编译,然后使用objdump(带有一些未知选项)来显示与反汇编交错的源代码?你能用实际的命令提供实际的步骤吗?
  • @jww:gcc-g 选项启用调试信息,objdump 的-S 选项在源交错的情况下进行解密。但问题不在于如何做到这一点。提问者已经知道了,他们反而问这是如何实现的(objdump 如何找到交错的源)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多