誰かがgold
リンカーを以前に使用したことがありますか?かなり大きなプロジェクトをリンクするには、GNU ld
とは対照的に、これを使用する必要があり、いくつかのエラーが発生してリンクに失敗しました。
gold
リンカーは、ld
が失敗した大規模なプロジェクトをどのようにリンクできますか?どこかにある種の記憶策略はありますか?
gold
リンカーは、BFD ld
(「従来の」GNU binutilsリンカー)よりも保守可能で高速なリンカーを生成することを目的として、ELF固有のリンカーとして設計されました。副作用として、BFD ld
より少ないメモリを使用して非常に大きなプログラムを実際にリンクすることができます。これは、処理する抽象化の層が少ないため、およびリンカーのデータ構造がELF形式に直接マップされるためと考えられます。
2つのリンカの設計の違いとメモリ使用への影響を具体的に扱ったドキュメントがたくさんあるかどうかはわかりません。さまざまなGNUリンカーの著者であるgold
に至るまでの多くの設計決定を説明するリンカーの作者であるIan Lance Taylorによる非常に興味深い リンカーに関する一連の記事 があります。 。彼 書き込み それ
私が現在作業しているゴールドと呼ばれるリンカーが3番目になります。 ELFリンカーのみです。ここでも、目標は速度です。この場合、2番目のリンカーよりも高速です。そのリンカーは、ELFと共有ライブラリのサポートを追加することにより、長年にわたって大幅に速度が低下しています。このサポートは、設計ではなくパッチが適用されました。
(2番目のリンカーはBFD ld
です。)
ゴールドリンカーは、リンクプロセスを大幅に高速化するために作成されました。金の権威によると Ian Lance Taylor
現在のところ、ゴールドは既存のリンカーに比べて1つの重要な利点しかありません。大規模なC++プログラムでは、5倍速く実行されると測定しました。
彼はゴールドリンカーのパフォーマンスを従来のGNUリンカーと比較しています。ゴールドは、GNUリンカーとは異なり)、BFDライブラリを使用してオブジェクトファイルを処理しません。
ゴールドの制限は、(GNU多くのオブジェクトファイルタイプを処理できるリンカーとは異なり)ELF形式のオブジェクトファイルしかリンクできないことです。
GNUリンカーを使用するときに直面した問題に関して、Michael Adamからの SOに関する同様の質問 への興味深い答えは次のとおりです。
いくつかの詳細に関しては、ゴールドリンカーは従来のコードよりも正しいように見えるため、コードにいくつかの依存関係の問題が見つかりました。たとえば、このSambaコミット。
gold
vs ld
ベンチマーク
私はldと金の具体的な合成ベンチマークを次の場所に公開しました https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience/53921263#5392126
結果の要約:金は、ldの2倍から3倍高速でした。
リンクステップにはプロジェクトのすべてのファイルが含まれ、コンパイルとは異なり、変更しても常に実行する必要があるため、この時間の増加は、制御不能なテンプレートとコード生成を伴う複雑なC++プロジェクトで大きなゲームチェンジャーになる可能性があります。単一の.cppファイル。
したがって、リンク時間が遅いと、開発サイクルが耐えられなくなり、Googleがリソースを投入した主な理由であると考えられます。些細なファイルの変更ごとに、30秒ではなく10秒待つことの利点を想像してみてください。
合成ベンチマークの時間の増加も、その回答で述べたように、私が複雑な現実の世界のプロジェクト(gem5)で得た実際の利益と一致しました。
最新のGNU/Linuxシステムでは、3つのリンカーを使用できます。
速度のベンチマークについては、次を参照してください: https://www.phoronix.com/scan.php?page=article&item=lld4-linux-tests&num=2 TL、DR:lld
が最速、続いてgold
、続いてld
一部の情報筋は、ゴールドプロジェクトは 停滞 であり、Fedoraのパッケージ構造はこれを反映していると述べています。