web-dev-qa-db-ja.com

fltoを使用するための要件

-fltoを使用してプロジェクトをコンパイルする場合、--enable-goldを使用してgccをビルドするだけで十分ですか、またはgoldをビルドしてldをそれに置き換える必要がありますか?そして、他のフラグが必要ですか?つまり、私はこれをやっています

gcc -flto one.c two.c
12
chew socks

https://gcc.gnu.org/wiki/LinkTimeOptimization#Requirements によれば、

"link time"という名前にもかかわらず、LTOは特別なリンカー機能を使用する必要はありません。必要な基本的なメカニズムは、オブジェクトファイル内のGIMPLEセクションの検出です。これは現在_collect2_で実装されています。したがって、LTOはGCCですでにサポートされているすべてのリンカーで動作します。

さらに、_-Fuse-linker-plugin_の GCCドキュメント は次のように述べています。

このオプションは、GCCのLTOサポートが有効で、GCCがリンカーをサポートするプラグイン(GNU ld 2.21以降またはゴールド)で使用するように構成されている場合、デフォルトで有効になります。

したがって、特別な「リンカープラグイン」機能を使用してライブラリアーカイブ内のオブジェクトファイルから最適化情報を取得する場合でも、goldはまったく必要ありません。


_-flto_のドキュメント に使用例があります。どちらか

_      gcc -o myprog -flto -O2 foo.c bar.c
_

または

_      gcc -c -O2 -flto foo.c
      gcc -c -O2 -flto bar.c
      gcc -o myprog -flto -O2 foo.o bar.o
_

動作します。


GCC 4.9 以降、リンクに_-flto_は必要ありません。

覚えておくべき重要なことは、リンク時の最適化を有効にするには、GCCドライバーを使用してリンク手順を実行する必要があるということです。関係するオブジェクトのいずれかが_-flto_でコンパイルされている場合、GCCはリンク時の最適化を自動的に実行します。

そして GCC 5 以降:

以前のGCCリリースとは異なり、リンクコマンドラインで渡された最適化およびターゲットオプションは無視されます。

18
melpomene