在 CentOS 上查看“函数汇编”,通常有几种常见场景:查看可执行文件/库中的函数汇编、查看内核函数汇编、在调试时查看函数汇编。下面按常用方式给你一份完整参考。
objdump(最基础、最通用)objdump -d /bin/ls
只查看某个函数(如 main):
objdump -d /bin/ls | grep -A 30 '<main>:'
如果是 C++ 函数(有 name mangling):
objdump -d ./a.out | c++filt
或先查符号:
nm ./a.out | grep 函数名
gdb(推荐,最直观)sudo yum install -y gdb
gdb ./a.out
disassemble main
查看当前函数的汇编:
disassemble
查看指定函数、指定行数:
disassemble main, +20
使用 Intel 语法(比 AT&T 更易读):
set disassembly-flavor intel
disassemble main
objdump + gdb 混合(定位函数地址)objdump -t ./a.out | grep main
然后用:
objdump -d ./a.out --start-address=0x4005b6
gdb ./a.out
(gdb) break main
(gdb) run
(gdb) disassemble
单步汇编:
stepi
查看寄存器:
info registers
例如查看 libc 中的 printf:
objdump -d /lib64/libc.so.6 | grep -A 30 '<printf>'
或:
gdb /bin/ls
(gdb) disassemble printf
CentOS 常见方式:
sudo yum install kernel-debuginfo
crash 或 gdb vmlinuxcrash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux
dis sys_open
或使用:
objdump -d vmlinux | grep -A 30 '<sys_open>'
gcc -S test.c
生成 test.s(可读汇编)
gcc -g -O0 -S test.c
| 工具 | 用途 |
|---|---|
objdump |
静态反汇编 |
gdb |
动态调试、函数汇编 |
nm |
查看符号 |
readelf |
ELF 信息 |
crash |
内核汇编 |
gcc -S |
编译期生成汇编 |
cat test.c
gcc -g -O0 -o test test.c
gdb ./test
(gdb) disassemble main
如果你愿意,可以告诉我:
我可以给你 精确命令 + 输出解释。