Objdump 读取 ELF 二进制文件,并提取其中的信息并输出到控制台。因为可以提取的信息是多种多样的,所以 objdump 有许多参数。

反汇编显示

Objdump 比较常用的一个功能就是反汇编。有一些参数会对阅读反汇编代码(有趣的是,反汇编的本质依然是汇编)有很大帮助:

  • -S: 显示汇编代码和源码的混合体,非常定位汇编
  • -l: 显示行号

基本上这两个参数在反汇编中必备的。

反汇编选择

如果指定了参数 -d 或者 -D ,那么就会反汇编基本上这个二进制文件的所有段,二者的区别在于 -d 只会反汇编可执行的程序段,而 -D 则会反汇编所有程序段。

但是这种方法效率并不高,生成的文件非常庞大(linux 反汇编大概是 221M ),生成速率非常慢。所以我们一般并不生成全部反汇编,而是生成一部分。比较生硬的方法是用 --start-address=ADDR--stop-address=ADDR 来控制生成的地址区间。

但是其实也可以用 --disassemble=<sym> 来指定, <sym> 一般就是函数名,如果是 CPP 这种编译器修改符号的情况,那么可以先用 -t 来先查看符号表,然后找到确定符号。