温馨提示×

怎样使用objdump反汇编

小樊
50
2026-10-24 00:37:59
栏目: 编程语言

objdump 是 GNU binutils 中的经典工具,常用于查看目标文件/可执行文件的汇编代码、符号表、段信息等。下面从基本用法 → 常用选项 → 示例 → 实战技巧逐步说明。


一、基本命令格式

objdump [选项] 文件

常见文件类型:

  • 可执行文件(ELF):a.out、test
  • 目标文件:.o
  • 静态库:.a
  • 动态库:.so

二、最常用的反汇编命令

1️⃣ 反汇编整个可执行文件(最常用)

objdump -d test
  • -d:disassemble 可执行代码段
  • 输出包含:
    • 地址
    • 机器码
    • 汇编指令

示例输出:

0000000000401136 <main>:
  401136:   55                      push   %rbp
  401137:   48 89 e5                mov    %rsp,%rbp

2️⃣ 反汇编 + 源代码(推荐)

objdump -d -S test
  • -S:source interleaved(需要编译时加 -g)

编译示例:

gcc -g -O0 test.c -o test

输出:

main():
    int a = 1;
  401136:   c7 45 fc 01 00 00 00    movl   $0x1,-0x4(%rbp)

3️⃣ 反汇编指定函数

objdump -d test | grep -A 20 "<main>:"

或更精确:

objdump -d --start-address=0x401136 --stop-address=0x401160 test

三、查看符号表(函数/变量)

objdump -t test

或只看外部符号:

objdump -T test

四、查看 ELF 段信息

objdump -h test

输出:

  • .text 代码段
  • .data 已初始化数据
  • .bss 未初始化数据

五、显示所有内容(高级分析)

objdump -x test

包含:

  • 段
  • 符号
  • 重定位
  • 动态链接信息

六、指定架构(交叉编译场景)

objdump -d -m arm test.elf

常见:

  • arm
  • mips
  • i386
  • powerpc

七、实战示例

示例 1:查看 main 函数汇编

gcc -g -O0 test.c -o test
objdump -d -S test | less

示例 2:分析崩溃地址

objdump -d test | grep -A 10 "401136"

示例 3:对比优化前后

gcc -O0 -g a.c -o a_O0
gcc -O2 -g a.c -o a_O2
objdump -d -S a_O0
objdump -d -S a_O2

八、常见坑

✅ 必须编译为 ELF(Linux)
❌ Windows .exe 不能直接用(用 dumpbin 或 objdump + MinGW)

✅ 想看源码必须 -g
❌ -O2 下汇编可能“看不懂”


九、和 gdb 的区别

工具 用途
objdump 静态分析、整体反汇编
gdb 动态调试、单步执行

如果你愿意,我可以:

  • 帮你解读某段 objdump 输出
  • 对比 C 代码 ↔ 汇编
  • 教你怎么看函数调用 / 栈帧 / 参数传递

直接把代码或反汇编贴出来即可。

0 踩