以前にgold
リンカーを使用したことがありますか?かなり大きなプロジェクトをリンクするには、GNU ld
とは対照的に、これを使用する必要がありました。これは、いくつかのエラーをスローしてリンクに失敗しました。
どのようにgold
リンカーは、ld
が失敗した大規模なプロジェクトをリンクできますか?どこかにある種のメモリトリックがありますか?
コメント
回答
gold
リンカーは、ELF固有のリンカーとして設計されました。 BFD ld
(「従来の」GNU binutilsリンカー)よりも保守可能で高速なリンカーを作成することを目的としています。副作用として、BFD ld
よりも少ないメモリを使用して非常に大きなプログラムをリンクすることができます。これはおそらく、処理する抽象化レイヤーが少なく、リンカーのデータが原因であると考えられます。構造はELF形式により直接的にマッピングされます。
2つのリンカー間の設計の違いとそれらがメモリ使用に与える影響を具体的に扱ったドキュメントがたくさんあるかどうかはわかりません。さまざまなGNUリンカーの作成者であるIanLance Taylorによる、非常に興味深いリンカーに関する一連の記事があります。これは、gold
。彼は次のように書いています
私が現在取り組んでいるリンカーはゴールドと呼ばれます私の3番目になります。これは排他的にELFリンカーです。繰り返しになりますが、目標は速度です。この場合、2番目のリンカーよりも高速です。そのリンカーは、ELFと共有ライブラリのサポートを追加することにより、長年にわたって大幅に遅くなっています。このサポートは、設計されているのではなく、パッチが適用されています。
(2番目のリンカーはBFD ld
です。)
コメント
- 名前は'ゴールド' ' ld 'を' Lead '、そして金は明らかに鉛よりも価値がありますか?
- @Aganjuいいえ、'は
go
の前にld
を付けます。
回答
ゴールドリンカーは、リンクプロセスを大幅に高速化するために作成されました。ゴールドオーサーによると、 Ian Lance Taylor
現時点では、ゴールドには1つしかありません。既存のリンカーに比べて大きな利点:高速です。大規模なC ++プログラムでは、5倍高速に実行されていると測定しました。
彼はゴールドリンカーのパフォーマンスを従来のGNUリンカーと比較しています。 gold(GNUリンカーとは異なり)は、オブジェクトファイルの処理にBFDライブラリを使用しません。
ゴールドの制限は、(多くのオブジェクトファイルタイプを処理できるGNUリンカーとは異なり)ELF形式のオブジェクトファイルしかリンクできないことです。
GNUを使用するときに直面した問題についてリンカー、これはMichaelAdamからの SOに関する同様の質問に対する興味深い回答です:
ゴールドリンカーは、いくつかの詳細に関して古典的なものよりも正しいように見えるので、コードにいくつかの依存関係の問題さえ見つけました。たとえば、を参照してください。このSambaコミット。
回答
gold
とld
ベンチマーク
ldとgoldの具体的な合成ベンチマークを https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience/53921263#53921263
の概要で公開しました。結果:ゴールドはldの2倍から3倍高速でした。
リンクステップにはすべてのファイルが含まれるため、この時間の増加は、制御不能なテンプレートとコード生成を伴う複雑なC ++プロジェクトで大きなゲームチェンジャーになる可能性があります。プロジェクトから、コンパイルとは異なり、1つの.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のパッケージ構造はこれを反映しています。
ld
がOoMによって強制終了されました。ld
は、大規模なC ++プロジェクトで数GBのRAMを簡単に消費できますが、gold
、特にlld
リンカーの方がはるかにリソース効率が高くなります。ld
でメモリ不足エラーが発生しましたが、ゴールドリンカーはリンクできました