【发布时间】:2011-01-31 10:43:20
【问题描述】:
二进制文件中是否有对源文件的引用?我尝试在二进制文件上运行字符串,但找不到对列出的源文件的任何引用...
【问题讨论】:
标签: c linux gcc disassembly objdump
二进制文件中是否有对源文件的引用?我尝试在二进制文件上运行字符串,但找不到对列出的源文件的任何引用...
【问题讨论】:
标签: c linux gcc disassembly objdump
我的理解是objdump要从二进制代码中显示源代码,有一个前提条件:必须将DWARF调试信息编译成二进制。 (gcc -g sourcefile 或 gcc -gdwarf-2 sourcefile)
并且通过处理这个 DWARF 信息objdump 能够得到源代码作为@vlcekmi3 和@vkrnt 回答
【讨论】:
objdump(带有一些未知选项)来显示与反汇编交错的源代码?你能用实际的命令提供实际的步骤吗?
二进制文件中的 dwarf 信息存储了指令(实际上是指令指针或 IP)与源文件和行号之间的映射。源文件是使用完整路径指定的,因此即使移动二进制文件也可以找到它。要查看此信息,您可以使用objdump --dwarf=decodedline <binary>(二进制当然必须使用-g 编译)。
一旦你说objdump -S <binary>,它就会使用这个矮人信息为你提供源代码以及反汇编。
【讨论】:
objdump 提供交错的源代码行号的反汇编。
objdump 使用编译成二进制文件的 DWARF 调试信息,它引用源文件名。如果二进制文件没有使用调试信息编译,或者objdump 找不到源文件,那么您的输出中就不会得到源代码 - 只有程序集。
在二进制文件上使用strings 时看不到源文件名,因为 DWARF 使用压缩。
【讨论】:
objdump(带有一些未知选项)来显示与反汇编交错的源代码?你能用实际的命令提供实际的步骤吗?
gcc 的-g 选项启用调试信息,objdump 的-S 选项在源交错的情况下进行解密。但问题不在于如何做到这一点。提问者已经知道了,他们反而问这是如何实现的(objdump 如何找到交错的源)。