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

101

我正在尝试学习汇编语言。我搜索并找到了如何反汇编.c文件的方法,但我认为它生成了一些程序的优化版本。是否有任何方法可以让我看到与我的C文件相对应的精确汇编代码。

我想要查看与我的C文件源代码完全对应的汇编代码。


2
控制优化的_gcc_选项 http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Optimize-Options.html - abeln
3
优化后的代码就是对应于你的C文件的确切代码。 查看未经优化的代码的反汇编会产生错误的印象,让你认为自己可以做得更好。 - Hans Passant
1
就像Hans所说的那样 - 使用汇编语言编写的想法是比编译器更好地完成它。如果你看一下优化后的代码,你会发现这是多么困难的事情! - Bo Persson
如何从GCC/clang汇编输出中删除“噪音”? - Peter Cordes
同样相关:在GCC中禁用所有优化选项 - Peter Cordes
3
为什么人们总是在没有正确阅读问题的情况下就跳出来发表聪明的评论呢?很明显,用户希望得到尽可能清晰的输出以帮助他。编译器比大多数程序员聪明得多,任何认为优化代码对新手和未优化代码同样有帮助的人都没有好好思考。他所做的是学习汇编语言的一种常见方式,并告诉gcc不要进行优化。 - RichieHH
7个回答

138

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

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

要将汇编语言的方言更改为intel或att,请使用-masm=intel-masm=att

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

请参阅gcc手册以获取更多信息。


38
如果你没有指定任何-O标志,那么-O0是默认选项(无优化)。 - nos
13
即使使用 -O0 选项,仍会进行优化:减少编译时间并使调试产生期望的结果。 - klm123
@klm123 没错,但这已经是最接近的了,总比没有好。 - pmr
5
如果您使用的是支持-Og选项的相当现代的gcc编译器,请尝试使用它。我发现,与-O0选项相比,它经常产生更易读的汇编输出。 - Viktor Dahl
@ViktorDahl 感谢您的提示。我已经修改了答案。 - pmr

16

如需测试不使用复制省略并查看您的复制/移动构造函数/运算符,请添加“-fno-elide-constructors”。

即使没有优化(-O0),GCC 和 Clang 仍会执行复制省略,这会在某些情况下跳过复制/移动构造函数。有关复制省略的详细信息,请参见此问题

但是,在Clang 3.4版本中,它会触发一个错误(未调用构造函数的无效临时对象),在3.5版本中已修复。


12

对于gcc编译器,您希望省略任何传递给编译器的-O1 -O2-O3选项,如果您已经使用它们,则可以添加-O0选项以再次关闭它。此外,添加-g进行调试可能会有所帮助,这样您就可以在调试器中查看c源代码和反汇编机器代码。

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


11
使用命令行选项-O0(-[大写字母o][零])来禁用优化,-S用于获取汇编文件。查看这里以查看更多gcc命令行选项。

6
您可以使用#pragma GCC push_options在内部控制优化。
#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */     

.... code here .....

#pragma GCC pop_options

4

很久以前,但仍然需要。

info - https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
list - gcc -Q --help=optimizers test.c | grep enabled
disable as many as you like with:
  gcc **-fno-web** -Q --help=optimizers test.c | grep enabled

3
你可以使用gcc命令行传递-O0来禁用优化。例如,将.C文件转换为.S文件,请调用:
gcc -O0 -S test.c

3
-O0 是多余的,因为它是默认值。 - Jens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接