在 Linux 下“反汇编函数”通常有以下几种常见场景和工具,下面按最常用到最专业的方式给你总结。
objdump 反汇编(最常用)objdump -d ./a.out
objdump -d ./a.out | grep -A 30 '<function_name>:'
或者更精确:
objdump -d ./a.out --start-address=0xADDR --stop-address=0xADDR2
-g 编译)objdump -S ./a.out
示例:
gcc -g -O0 test.c -o test
objdump -S test | less
gdb 反汇编(调试时最方便)(gdb) disassemble
(gdb) disassemble function_name
(gdb) disassemble 0x400520, 0x400560
(gdb) layout split
nm + objdump 定位函数地址先看函数地址:
nm ./a.out | grep function_name
再反汇编:
objdump -d ./a.out --start-address=0xADDR
readelf(查看符号和段)readelf -s ./a.out | grep function_name
objdump 反汇编内核函数(内核开发)objdump -d vmlinux | grep -A 50 '<sys_open>:'
perf / bpftrace(运行时反汇编)运行时查看函数汇编:
perf probe --add function_name
perf record -e probe:function_name -a
# 编译
gcc -g -O0 test.c -o test
# 查看函数地址
nm test | grep main
# 反汇编
objdump -d test | grep -A 20 '<main>:'
或在 gdb 中:
gdb ./test
(gdb) disassemble main
| 工具 | 常用参数 | 说明 |
|---|---|---|
| objdump | -d |
反汇编 |
| objdump | -S |
源码+汇编 |
| objdump | -M intel |
Intel 语法 |
| gdb | disassemble |
调试反汇编 |
| nm | 无 | 查看符号 |
Intel 语法示例:
objdump -d -M intel ./a.out
如果你有具体场景(比如:C 函数 / 内核函数 / 没有符号 / 动态库 / 已经 stripped),可以告诉我,我可以给你更精确的方法。