可能重复:
How do you get assembler output from C/C++ source in gcc?
你好!
我有一个C和C ++源代码,我想在汇编代码中看到。如何为这些生成等效的asm代码?我应该使用什么工具?或者是否已经可以使用gcc编译器等工具?然后我应该执行什么命令?我更喜欢Linux之上的工具,尤其是Ubuntu。
提前致谢!
答案 0 :(得分:12)
gcc -S x.c
这应该产生gcc认为等同于你的代码的程序集。但要注意,优化器可以做一些非常棘手的事情,这些事情很难看出在功能上等同于你的代码。特别是在c ++中,优化器非常依赖于内联和类似的东西。
来自gcc手册页:
-S
编译阶段后停止 正确;不要组装。输出是 以汇编代码文件的形式 对于每个非汇编程序输入文件 指定。默认情况下,汇编程序 源文件的文件名由 替换后缀.c,.i等, 与.s。
输入不需要的文件 编译被忽略。
答案 1 :(得分:3)
对于gcc,请使用-S
开关。您将获得具有.s
扩展名的文件,您可以在其中看到生成的汇编代码。
答案 2 :(得分:3)
我将采用中间路由,已经在一个容量中回答了这个问题(假设你已经安装了gcc -S
ubuntu软件包,那就是使用gcc
。但问题已经被问到several times。
答案 3 :(得分:0)
gcc -S
生成您可能感兴趣的源代码(对于gas
汇编程序)。但请记住,特别是对于C ++,您可以发现许多有趣的代码确实是链接的标准库,运行时间...根据语言而言。您可以反汇编最终代码(例如,只需使用objdump
),您可以在其中查看启动代码和链接器添加的其他代码(当然,由于动态绑定,您将看不到代码比方说,C标准库,因为它没有嵌入,除非你用静态链接创建你的最终可执行文件,当可行时,即lib的“静态”版本必须存在)
因此,您获得的不是C / C ++源代码的独立等效代码。这种翻译很难,特别是因为asm是一种非常“基本”的语言,所以为了能够翻译它“1-1”你需要很多代码,当然“翻译”将取决于系统(例如,最后的自制输出例程必须使用OS提供的API /系统调用)...基本上你必须在需要时重写C / C ++库和运行时(对于C ++)......
翻译成其他语言,例如从C ++到另一种OO语言,可能更简单,但它不是你感兴趣的。
答案 4 :(得分:-1)
这是一个将C转换为asm
的简单项目http://www.codeproject.com/KB/cpp/KhanC2ASM.aspx
这是另一个
http://www.hex-rays.com/idapro/
你可以通过谷歌搜索找到许多反汇编程序。