我正在努力学习汇编语言 . 我搜索并发现如何反汇编 .c 文件,但我认为它产生了一些优化版本的程序 . 有什么办法可以让我看到与我的C文件对应的确切汇编代码 .
.c
gcc选项 -O 启用不同级别的优化 . 使用 -O0 禁用它们并使用 -S 输出程序集 . -O3 是最高级别的优化 .
-O
-O0
-S
-O3
从gcc 4.8开始,优化级别 -Og 可用 . 它支持不干扰调试的优化,是标准编辑 - 编译 - 调试周期的推荐默认值 .
-Og
要将程序集的方言更改为intel或att,请使用 -masm=intel 或 -masm=att .
-masm=intel
-masm=att
您也可以使用 -fname 手动启用某些优化 .
-fname
再看看gcc manual .
对于gcc,您想要省略传递给编译器的任何 -O1 -O2 或 -O3 选项,或者如果您已经拥有它们,则可以附加 -O0 选项以再次将其关闭 . 它还可以帮助您添加 -g 进行调试,以便您可以在调试器中查看c源代码和反汇编代码 .
另见:http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html
使用开关-O0( - [capital o] [零])来禁用优化,使用-S来获取汇编文件 . 查看here以查看更多gcc命令行选项 .
要在没有复制省略的情况下进行测试并看到你复制/移动构造函数/运算符,请添加“-fno-elide-constructors” .
即使没有优化(-O0),GCC和Clang仍然会进行复制省略,这在某些情况下会跳过复制/移动构造函数 . 有关复制省略的详细信息,请参阅this question .
但是,在Clang 3.4中它确实触发了一个bug(一个无效的临时对象而没有调用构造函数),这在3.5中已经修复 .
如果使用gcc命令行传递-O0,则可以禁用优化 .
例如 . 将.C文件转换为.S文件调用:
gcc -O0 -S test.c
很久以前,但仍然需要 .
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
6 回答
gcc选项
-O
启用不同级别的优化 . 使用-O0
禁用它们并使用-S
输出程序集 .-O3
是最高级别的优化 .从gcc 4.8开始,优化级别
-Og
可用 . 它支持不干扰调试的优化,是标准编辑 - 编译 - 调试周期的推荐默认值 .要将程序集的方言更改为intel或att,请使用
-masm=intel
或-masm=att
.您也可以使用
-fname
手动启用某些优化 .再看看gcc manual .
对于gcc,您想要省略传递给编译器的任何 -O1 -O2 或 -O3 选项,或者如果您已经拥有它们,则可以附加 -O0 选项以再次将其关闭 . 它还可以帮助您添加 -g 进行调试,以便您可以在调试器中查看c源代码和反汇编代码 .
另见:http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html
使用开关-O0( - [capital o] [零])来禁用优化,使用-S来获取汇编文件 . 查看here以查看更多gcc命令行选项 .
要在没有复制省略的情况下进行测试并看到你复制/移动构造函数/运算符,请添加“-fno-elide-constructors” .
即使没有优化(-O0),GCC和Clang仍然会进行复制省略,这在某些情况下会跳过复制/移动构造函数 . 有关复制省略的详细信息,请参阅this question .
但是,在Clang 3.4中它确实触发了一个bug(一个无效的临时对象而没有调用构造函数),这在3.5中已经修复 .
如果使用gcc命令行传递-O0,则可以禁用优化 .
例如 . 将.C文件转换为.S文件调用:
gcc -O0 -S test.c
很久以前,但仍然需要 .