我想知道如何在我的C源文件上使用GCC来转储机器代码的助记符版本,这样我就可以看到我的代码被编译成什么。你可以用Java做到这一点,但我还没有找到一种方法与GCC。
我试图在汇编中重写一个C方法,看看GCC是如何做的,这将是一个很大的帮助。
我想知道如何在我的C源文件上使用GCC来转储机器代码的助记符版本,这样我就可以看到我的代码被编译成什么。你可以用Java做到这一点,但我还没有找到一种方法与GCC。
我试图在汇编中重写一个C方法,看看GCC是如何做的,这将是一个很大的帮助。
当前回答
如果您给GCC提供-fverbose-asm标志,它就会
在生成的程序集代码中添加额外的注释信息,使其更具可读性。 […新增的评论包括: 编译器版本和命令行选项的信息, 与汇编指令相关联的源代码行,格式为FILENAME:LINENUMBER:CONTENT OF LINE, 提示哪些高级表达式对应于各种汇编指令操作数。
其他回答
你可以像objdump一样使用gdb。
本文节选自http://sources.redhat.com/gdb/current/onlinedocs/gdb_9.html#SEC64
下面是英特尔x86混合源代码+汇编的示例:
(gdb) disas /m main Dump of assembler code for function main: 5 { 0x08048330 : push %ebp 0x08048331 : mov %esp,%ebp 0x08048333 : sub $0x8,%esp 0x08048336 : and $0xfffffff0,%esp 0x08048339 : sub $0x10,%esp 6 printf ("Hello.\n"); 0x0804833c : movl $0x8048440,(%esp) 0x08048343 : call 0x8048284 7 return 0; 8 } 0x08048348 : mov $0x0,%eax 0x0804834d : leave 0x0804834e : ret End of assembler dump.
如果您给GCC提供-fverbose-asm标志,它就会
在生成的程序集代码中添加额外的注释信息,使其更具可读性。 […新增的评论包括: 编译器版本和命令行选项的信息, 与汇编指令相关联的源代码行,格式为FILENAME:LINENUMBER:CONTENT OF LINE, 提示哪些高级表达式对应于各种汇编指令操作数。
使用-S(注意:大写S)切换到GCC,它将把程序集代码发送到扩展名为. S的文件中。例如,命令如下: gcc -O2 -S foo.c 将生成的程序集代码保留在文件foo.s上。
直接从http://www.delorie.com/djgpp/v2faq/faq8_20.html(但删除了错误的-c)
使用-S(注意:大写S)切换到GCC,它将把程序集代码发送到扩展名为. S的文件中。例如,命令如下:
gcc -O2 -S -c foo.c
我还没有尝试gcc,但是对于g++,下面的命令对我来说是有效的。
-g用于调试构建 -Wa,-adhln被传递给汇编程序,用于与源代码一起列出
g++ -g -Wa,-adhln src.cpp