web-dev-qa-db-ja.com

gccでコンパイラの最適化を無効にする方法は?

私はアセンブリ言語を学ぼうとしています。私は検索して.cファイルを逆アセンブルする方法を見つけましたが、プログラムの最適化されたバージョンを生成すると思います。私のCファイルに対応する正確なアセンブリコードを見ることができる方法はありますか?.

68
Neal

Gccオプション-Oは、さまざまなレベルの最適化を有効にします。 -O0を使用してそれらを無効にし、-Sを使用してアセンブリを出力します。 -O3は最適化の最高レベルです。

Gcc 4.8以降、最適化レベル-Ogが利用可能になりました。デバッグに干渉しない最適化が可能になり、標準のedit-compile-debugサイクルの推奨デフォルトです。

アセンブリの方言をintelまたはattに変更するには、-masm=intelまたは-masm=attを使用します。

-fnameを使用して、特定の最適化を手動で有効にすることもできます。

gcc manual をご覧ください。

94
pmr

Gccの場合、-O1 -O2または-O3を省略したいコンパイラーに渡されるオプション、または既に持っている場合は、-O0オプションを追加して、再びオフにすることができます。また、デバッグ用に-gを追加すると、デバッガーでcソースと逆アセンブルされたマシンコードを確認できる場合があります。

参照: http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html

8
IanNorton

スイッチ-O0(-[capital o] [zero])を使用して最適化を無効にし、-Sを使用してアセンブリファイルを取得します。 here を見て、さらにgccコマンドラインオプションを確認してください。

6
MByD

コピー省略なしでテストし、実際にコンストラクター/演算子をコピー/移動することを確認するには、「-fno-elide-constructors」を追加します。

最適化なし(-O0)でも、GCCとClangはコピーを省略します。これは、場合によってはコピー/移動コンストラクターをスキップする効果があります。コピーの削除の詳細については、 この質問 を参照してください。

ただし、Clang 3.4では、3.5で修正されたバグ(コンストラクターを呼び出さない無効な一時オブジェクト)がトリガーされます。

6
user3770818

Gccコマンドラインで-O0を渡すと、最適化を無効にできます。

例えば。 .Cファイルを.Sファイル呼び出しに変換するには:

gcc -O0 -S test.c

1

昔ですが、まだ必要です。

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
1
api

#pragma GCC Push_optionsを使用して、内部で最適化を制御することもできます

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

.... code here .....

#pragma GCC pop_options
0
mckenzm