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