📜  Linux 中的 Objdump 命令及示例(1)

📅  最后修改于: 2023-12-03 15:02:43.574000             🧑  作者: Mango

Linux 中的 Objdump 命令及示例

Objdump 是 Linux 一款强大的反汇编工具,可以用于分析二进制文件,了解其内部结构,查看和分析二进制文件的指令集、符号表、重定位表等信息。本文将介绍 Objdump 的基本用法及其示例。

基本用法

Objdump 的基本使用语法如下:

objdump [option(s)] filename

其中,option(s) 是可选参数,用于指定需要分析的信息类型,filename 是需要反汇编的二进制文件路径。

常见的 Objdump 选项包括:

  • -d:反汇编出编译后的代码,可用于查看程序的汇编代码;
  • -t:查看符号表;
  • -r:查看重定位表;
  • -S:同时反汇编出编译前和编译后的代码;
  • -x:查看全部头文件信息。
示例

以查看一个可执行文件的汇编代码为例,执行以下命令:

objdump -d /usr/bin/bash

将输出以下信息:

/usr/bin/bash:     file format elf64-x86-64


Disassembly of section .init:

0000000000429610 <_init>:
  429610:       48 83 ec 08             sub    $0x8,%rsp
  429614:       48 8b 05 6d 3c 02 00    mov    0x23c6d(%rip),%rax        # 453288 <__gmon_start__>
  42961b:       48 85 c0                test   %rax,%rax
  42961e:       74 02                   je     429622 <_init+0x12>
  429620:       ff d0                   callq  *%rax
  429622:       48 83 c4 08             add    $0x8,%rsp
  429626:       c3                      retq   

Disassembly of section .plt:

0000000000429630 <_ZN9__gnu_cxx18__exchange_and_addEPVii>:
  429630:       ff 35 c2 27 02 00       pushq  0x227c2(%rip)        # 44c3f8 <_GLOBAL_OFFSET_TABLE_+0x88>
  429636:       ff 25 c4 27 02 00       jmpq   *0x227c4(%rip)        # 44c400 <_GLOBAL_OFFSET_TABLE_+0x90>
  42963c:       0f 1f 40 00             nopl   0x0(%rax)

0000000000429640 <_ZNKSt6vectorIcSaIcEE5beginEv>:
  429640:       ff 25 be 27 02 00       jmpq   *0x227be(%rip)        # 44c404 <_GLOBAL_OFFSET_TABLE_+0x94>
  429646:       68 00 00 00 00          pushq  $0x0
  42964b:       e9 e0 ff ff ff          jmpq   429630 <_plt+0>

......

可以看到,该命令反汇编了 /usr/bin/bash 可执行文件的 .init.plt 两个段的汇编代码。

实际上,我们可以在任何二进制文件上运行 Objdump 命令,如反汇编一个 C 程序编译后的可执行文件:

objdump -d ./a.out

将输出该程序的反汇编代码。

总结

Objdump 是 Linux 下一款强大的反汇编工具,它可以用于查看某个二进制文件的头文件、符号表、重定位表等信息,还可以帮助程序员了解该程序运行时所执行的汇编代码信息。