arm-none-eabi-gcc
Cortex-M4 ベースのマイクロコントローラー用に実行可能ファイルをコンパイルしています。パフォーマンスが重要でないコードは-Os
(実行可能コードのサイズに合わせて最適化された) コンパイルされ、パフォーマンスが重要な部分は別の最適化フラグを使用してコンパイルされます。-Og
/-O2
など
-flto
そのようなビルドで使用しても安全ですか? もしそうなら、どの最適化フラグをリンカーに渡す必要がありますか?
最適化オプションに関するGCCのドキュメントによると:
同じリンクに含まれるすべてのファイルを同じオプションでコンパイルすることをお勧めします。
そのような声明はかなり曖昧です。それにもかかわらず、 GCC 5のリリース ノートを掘り下げると、追加の詳細がいくつかあります。
コマンドラインの最適化とターゲット オプションは、関数ごとにストリーミングされ、リンク時オプティマイザーによって受け入れられるようになりました。この変更により、リンク時の最適化が、ファイルごとの最適化に代わるより透過的なものになります。異なる翻訳単位 (-ffast-math、-mavx、または -finline など) に対して異なる最適化設定を必要とするプロジェクトをビルドできるようになりました。
また、そのような制限の影響を受けるフラグと影響を受けないフラグに関する情報:
これは、optimize および target 属性に渡すことができるコマンドライン オプションにのみ適用されることに注意してください。グローバル コード生成に影響するコマンド ライン オプション (-fpic など)、警告 (-Wodr など)、静的変数の最適化方法に影響する最適化 (-fcommon など)、デバッグ出力 (-g など)、および -- param パラメータは、リンク時最適化ユニット全体にのみ適用できます。このような場合、コンパイル時とリンク時の両方で一貫して同じオプションを使用することをお勧めします。
あなたのシナリオでは、最適化フラグ-Og
と最適化属性として渡すことができ、コンパイル時フラグ-O2
と-Os
リンク時フラグが同じである必要がある場合には当てはまりません。そうです、その-flto
ようなビルドで安全に使用できるはずです。
リリースノートに記載されているように、リンク時に渡される最適化フラグについて:
以前の GCC リリースとは対照的に、リンク コマンド ラインで渡された最適化およびターゲット オプションは無視されます。
GCC は、使用する最適化レベルを自動的に決定します。これは、オブジェクト ファイルのコンパイル時に使用される最高レベルです。-O
したがって、最適化オプションをリンカーに渡す必要はありません。