如何在gcc中禁用编译器优化?

我正在学习汇编语言。 我已经search并find了如何反汇编一个.c文件,但我认为它会产生一些优化版本的程序。 有没有什么办法,我可以看到我的C文件对应的确切汇编代码。

gcc选项-O启用不同级别的优化。 使用-O0禁用它们,并使用-S输出组件。 -O3是最高级别的优化。

从gcc 4.8开始,优化级别-Og可用。 它使优化不会干扰debugging,并且是标准编辑 – 编译 – debugging周期的推荐默认值。

要将程序集的方言改为intel或att,使用-masm=intel-masm=att

您也可以使用-fname手动启用某些优化。

看看更多的海湾合作委员会手册 。

对于gcc,您希望省略传递给编译器的-O1 -O2-O3选项,或者如果您已经拥有它们,您可以附加-O0选项以再次closures它。 它也可以帮助您添加-g进行debugging,以便您可以在debugging器中看到c源代码和反汇编的机器代码。

另见: http : //sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html

使用开关-O0( – [capital o] [zero])禁用优化,-S取得汇编文件。 看看这里看到更多的gcc命令行选项。

要testing没有复制elision,并看到你复制/移动构造函数/操作符添加“-fno-elide-constructors”。

即使没有优化(-O0),GCC和Clang仍然会进行复制elision,在某些情况下会跳过复制/移动构造函数。 看到这个问题的复制elision的细节。

但是,在Clang 3.4中它触发了一个错误(一个无效的临时对象,没有调用构造函数),在3.5中被修复。

如果您使用gcc命令行传递-O0,则可以禁用优化。

例如,将.C文件转换为.S文件调用:

gcc -O0 -S test.c