linux查看C程序的汇编代码(可读懂)

以C程序文件名为test.c为例写出gcc命令如下。可替换成自己的文件名。若不指定生成文件的文件名,默认为a.out。

方法一:生成.s文件

1
2
gcc -S -o test.s test.c //注意大写S
vim test.s

方法二:先生成.o文件,再反汇编

1
2
gcc -c -o test.o -test.c
objdump -d test.o
1
2
gcc -g -c -o test.o -test.c //objdump使用S命令这里需要-g
objdump -S test.o

objdump有多个命令选项,可根据需要选择:
-d:将代码段反汇编
-S:将代码段反汇编的同时,将反汇编代码和源代码交替显示,编译时需要给出-g,即需要调试信息。
-C:将C++符号名逆向解析。
-l:反汇编代码中插入源代码的文件名和行号。
-j section:仅反汇编指定的section。可以有多个-j参数来选择多个section。

参考文章objdump反汇编用法示例

使用的gcc命令与上面类似。

另外,对于一些复杂的代码,汇编代码可能会多出一些看不懂的指令,可以用以下命令关闭栈保护等将它们隐去,使得汇编代码可读懂。

1
2
gcc -fno-pic -fno-stack-protector -no-pie -c -o test.o test.c
objdump -d test.o