我有一个快速的问题。我使用以下代码从 ac 代码生成了 ELF 二进制文件:
gcc -o simple simple.c
然后我对该 ELF 二进制文件执行 objdump:
objdump --disassemble-all simple
我检查了我的目录,ls -a
那里没有 .o 文件。我的问题仍然是如何objdump
显示完整的反汇编代码?是否objdump
在二进制文件中进行静态分析以覆盖所有代码?
答案1
objdump
显示反汇编代码,因为这是它的工作。它知道可执行文件的格式。可执行文件不仅仅是直接的指令序列:它们具有结构。可执行文件通常以包含各种元数据的标头开始,并按部分组织。动态链接的可执行文件必须包含动态链接器所需的足够信息,因此它们必须指示可执行文件需要哪些符号以及这些符号将加载到何处的指示,以便程序在运行时可以找到它们。
例如,大多数 Unix 系统使用极低频(存在其他格式)。如果objdump
检测到 ELF 二进制文件(通过检查幻数在文件的开头),它解析文件头,这让它知道程序头和节表的位置。每个部分都包含其包含的内容类型的指示。objdump
根据其类型进一步解析每个部分。当它看到应该包含代码的部分时,它会对其运行反汇编程序。
反汇编原则上相当简单:代码是指令列表,反汇编只是将指令的二进制表示形式转换为文本表示形式。反汇编器只是按顺序获取指令。实际上,在指令大小可变的架构上,事情可能会更加复杂,因为数据可以嵌入到代码段中。objdump
通常适用于“正常”可执行文件,但可能不会在故意混淆的二进制文件上产生合理的输出。
objdump
不执行任何静态分析。它只是进行直接的解析和翻译,并没有对指令的含义进行任何分析。