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


76

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



3
优化的代码与您的C文件相对应的确切代码。查看未优化代码的反汇编会产生错误的印象。这会让您认为自己可以做得更好。
汉斯·帕桑

1
就像汉斯说的那样-编写汇编代码的想法是比编译器做得更好。如果您查看优化的代码,您会发现它有多难!
Bo Persson


Answers:


106

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

从gcc 4.8开始,-Og可以使用优化级别。它启用了不干扰调试的优化,并且是标准edit-compile-debug周期的建议默认设置。

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

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

进一步了解gcc手册


33
-O0如果未指定任何-O标志,则为默认值(无优化)。
nos

11
使用-O0,您仍然可以进行优化:减少编译时间,并使调试产生预期的结果。
klm123 2013年

@ klm123是的,但是您可以获得一个接近的结果,这总比没有好。
2013年

3
如果您具有支持-Og的相当现代的gcc,请尝试一下,我发现它通常比-O0提供更具可读性的程序集输出。
Viktor Dahl

@ViktorDahl感谢您的提示。我修正了答案。
pmr


9

要进行无复制省略的测试,并看到您正在复制/移动构造函数/操作符,请添加“ -fno-elide-constructors”。

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

但是,在Clang 3.4中,它确实会触发错误(在没有调用构造函数的情况下为无效的临时对象),该错误已在3.5中修复。


7

使用命令行选项-O0(-[capital o] [zero])禁用优化并-S获取程序集文件。看看这里看到更多的GCC命令行选项。


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

4

您还可以使用#pragma GCC push_options在内部控制优化

#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */     

.... code here .....

#pragma GCC pop_options

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.