首页 文章

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

提问于
浏览
60

我正在努力学习汇编语言 . 我搜索并发现如何反汇编 .c 文件,但我认为它产生了一些优化版本的程序 . 有什么办法可以让我看到与我的C文件对应的确切汇编代码 .

6 回答

  • 4

    gcc选项 -O 启用不同级别的优化 . 使用 -O0 禁用它们并使用 -S 输出程序集 . -O3 是最高级别的优化 .

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

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

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

    再看看gcc manual .

  • 83

    对于gcc,您想要省略传递给编译器的任何 -O1 -O2-O3 选项,或者如果您已经拥有它们,则可以附加 -O0 选项以再次将其关闭 . 它还可以帮助您添加 -g 进行调试,以便您可以在调试器中查看c源代码和反汇编代码 .

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

  • -1

    使用开关-O0( - [capital o] [零])来禁用优化,使用-S来获取汇编文件 . 查看here以查看更多gcc命令行选项 .

  • 7

    要在没有复制省略的情况下进行测试并看到你复制/移动构造函数/运算符,请添加“-fno-elide-constructors” .

    即使没有优化(-O0),GCC和Clang仍然会进行复制省略,这在某些情况下会跳过复制/移动构造函数 . 有关复制省略的详细信息,请参阅this question .

    但是,在Clang 3.4中它确实触发了一个bug(一个无效的临时对象而没有调用构造函数),这在3.5中已经修复 .

  • 1

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

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

    gcc -O0 -S test.c

  • 6

    很久以前,但仍然需要 .

    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
    

相关问题