在 Linux 下查看“汇编代码”通常有以下几种常见场景和需求,我按由浅入深、不同目的给你系统讲一下。
objdump(最常用)objdump -d ./a.out
常用选项:
objdump -d -M intel ./a.out # Intel 语法(默认是 AT&T)
objdump -S ./a.out # 源码 + 汇编混合(需 -g 编译)
示例:
gcc -g -o test test.c
objdump -S test
gdb(调试时看汇编)gdb ./a.out
在 gdb 中:
disassemble main
查看当前执行位置汇编:
disassemble
切换汇编语法:
set disassembly-flavor intel
单步执行汇编:
stepi
nexti
gcc 生成汇编文件gcc -S test.c
生成:
test.s
查看:
cat test.s
指定语法:
gcc -S -masm=intel test.c
gcc -g -fverbose-asm -S test.c
或:
gcc -g -o test test.c
objdump -S test
cat /usr/include/asm/unistd_64.h
cat /proc/kallsyms
strace(系统调用层面)strace ./a.out
ltrace(库函数层面)ltrace ./a.out
| 语法 | 示例 |
|---|---|
| AT&T(默认) | mov %rax, %rbx |
| Intel | mov rbx, rax |
推荐新手用 Intel 语法,更直观。
| 目的 | 推荐方式 |
|---|---|
| 学汇编 | gcc -S |
| 调 bug | gdb + disassemble |
| 优化分析 | objdump -S |
| 逆向分析 | objdump -d |
如果你愿意,可以告诉我:
我可以给你更针对性的命令和示例。