2012-10-19 13 views
13

最近、GCC 4.8のドキュメントが更新され、新しい最適化スイッチ-Ogが導入されました。このGCC 4.8:-Ogは-gを意味しますか?

[..]ランタイムパフォーマンスの妥当なレベルを提供しながら、高速コンパイルと優れたデバッグエクスペリエンスの必要性に対処します。開発の全体的な経験は、デフォルトの最適化レベル-O0よりも良いはずです。

このスイッチは-gを意味するものではないか、私は手動で私のCXXFLAGSに追加する必要がありますか?

+1

短い答えはイエスです。 – January

+4

明らかに、「-Ogは-gを意味するわけではなく、単にデバッグを妨げる最適化を無効にします」 - Gentoo wiki –

+0

両方のステートメントのどちらかを証明する何かを持っているといいでしょう。おそらくgccから抜粋したコードでしょうか?答えとして掲示された場合、私はそれを受け入れupvote。 – cschwan

答えて

12

短い回答:いいえ、まだ手動で-gを追加する必要があります。

長い答え

私はストレートのソースからハード答えを見つけるのに苦労してきたので、私はここに記載される方法を用いて自分自身をそれをテストすることを決めた:How to check if program was compiled with debug symbols?

私は実行可能ファイルを構築されました-O3フラグなし、-gなし。 objdump --syms <file> | grep debugを使用すると、期待どおりに何も得られませんでした。

次に、-gで実行可能ファイルを作成しましたが、最適化フラグは設定されていません。

0000000000000000 l d .debug_info 0000000000000000 .debug_info

私が最後に-Ogフラグとし、-gずに実行可能ファイルを内蔵:同じobjdumpコマンドは、このような6件の結果が得られました。 objdumpコマンドは何も返さなかった。この場合、デバッグシンボルはではなく、であることを意味します。

私はGCC自体から明示的なドキュメントを見つけることはできませんが、Gentoo Wikiは(マルコScannadinariで前に述べたように)-Og-gを意味するものではないというのが私の主張を確認。

19

GCC 4.9.2のソースコード(GCC/opts.c)での表情は-Og-O1と同じですが、より悪いデバッグ経験につながる可能性が無効になっていくつかのフラグであることを示した:

/* in function default_options_optimization: */ 
    case OPT_Og: 
     /* -Og selects optimization level 1. */ 
     opts->x_optimize_size = 0; 
     opts->x_optimize = 1; 
     opts->x_optimize_fast = 0; 
     opts->x_optimize_debug = 1; 
     break; 

数ステップ後に、関数maybe_default_optionが一連のオプションとx_optimize_debugフラグで呼び出されます。 を使用すると、OPT_LEVELS_1_PLUS_NOT_DEBUGOPT_LEVELS_1_PLUS_SPEED_ONLY、およびOPT_LEVELS_2_PLUS_SPEED_ONLYのオプションは有効になりません。

このように、「ここでは-O0よりも優れているはずです」という記述があります。 -Ogは、-O0-O1の間です。これは、-gオプションで有効になるデバッグ情報の組み込みには影響しません。 -gを上書きします-ggdb

  • オプション:あなたはおそらくも異なる-gオプションに興味があると思います。つまり、-gの後に-ggdbを設定すると、-gオプションは事実上無視されます。
  • オプション-g-g2に等しく、-gを省略すると-g0と同じです。
  • オプション-g3は、-g2より大きいデバッグセクションを生成します。-ggdb3-ggdb2のデバッグセクションも大きくなります。
  • さらに高い最適化レベルは、コードとデバッグセクションの増加をもたらします。 (-O0 < -O1 < -Og < -O2 < -O3)。
  • strip --strip-debugは、-gレベルとは無関係に同じオブジェクトサイズになりました。これは、レベルのみが実際のコードに影響し、-gがデバッグセクションを決定するという期待と一致しました。
  • strip --keep-debugは、サイズが-gレベルに支配され、次にレベルが支配的なオブジェクトになります。 (従って-g0 -O3-g3 -O0より小さい)。

注:ここでは、コンパイルする時間については考慮しませんでした。より積極的な最適化レベルで増加する可能性が高くなります。私は、デバッグレベルは、(最適化と比較して)時間に軽微な影響しか与えないと予想します。これは、パス中に余分な詳細を追跡する必要があることを意味するためです。ここで

は、私が実際の動作をテストするために使用されるコマンドである(また -ggdbX代わり -gXの比較):

for g in -g0 -g2 -g3;do 
    for O in -O0 -O1 -O2 -O3 -Og; do 
     flags="$g $O"; 
     gcc -fPIC -rdynamic -c -Wall -Wextra -Ilib ltunify.c -o obj/gL_"${flags// /_}_.o" $flags || break; 
    done; 
done 
関連する問題