读懂 Linux 下的反汇编代码(尤其是 AT&T 语法或 Intel 语法)是理解程序底层执行、调试和性能优化的重要能力。下面我从工具 → 语法 → 常见结构 → 实战方法一步步讲。
常用反汇编/调试工具:
objdump:反汇编 ELF 文件objdump -d ./a.out
gdb:运行时反汇编disassemble main
objdump -S:源码 + 反汇编对照gcc -g -O0 test.c
objdump -S ./a.out
readelf:查看段、符号nm:查看符号表Linux 默认常用 AT&T 语法(gcc/objdump):
movl %eax, %ebx
%$b/w/l/qmov ebx, eax
%、$切换:
set disassembly-flavor intel
以 objdump -d 为例:
0000000000401136 <main>:
401136: 55 push %rbp
401137: 48 89 e5 mov %rsp, %rbp
40113a: c7 45 fc 0a 00 movl $0xa, -0x4(%rbp)
地址 机器码 指令
401136: 55 push %rbp
push %rbp
mov %rsp, %rbp
sub $0x10, %rsp
含义:
mov dst, src
push / pop
lea(取地址)
add / sub
imul
inc / dec
cmp a, b
je / jne / jg / jl
call / ret
syscall
mainprintf, mallocmovl $0x1, -0x4(%rbp)
→ 局部变量(int x = 1)
gcc -O0 -g test.c
objdump -S ./a.out
cmp + jmp → if / loopcall → 函数调用C 代码:
int add(int a, int b) {
return a + b;
}
反汇编(简化):
add:
mov %edi, %eax
add %esi, %eax
ret
解读:
%edi, %esi%eax-O0 编译,避免优化干扰objdump -S如果你愿意,可以:
我可以直接帮你“逐行翻译”。