モールドは、既存のUnixリンカーのより高速なドロップイン置換です。これは、数年前に最初に作成した2番目に高速なオープンソースリンカーであるLLVMlldリンカーよりも数倍高速です。モールドは、特にデバッグ-編集-再構築のサイクルが速い場合に、ビルド時間を短縮することで開発者の生産性を向上させるように設計されています。
これは、シミュレートされた8コア16スレッドマシン上の主要な大規模プログラムの最終的なdebuginfo対応の実行可能ファイルをリンクするためのGNUゴールド、LLVM lld、およびモールドのパフォーマンス比較です。
プログラム(リンカー出力サイズ) | GNUゴールド | LLVM lld | 型 |
---|---|---|---|
Chrome 96(1.89 GiB) | 53.86秒 | 11.74秒 | 2.21秒 |
Clang 13(3.18 GiB) | 64.12秒 | 5.82秒 | 2.90秒 |
Firefox 89 libxul(1.64 GiB) | 32.95秒 | 6.80秒 | 1.42秒 |
金型は非常に高速であるため、同じマシンの2倍の速度しかありません。 カビが他のリンカーよりも速くないことがわかった場合は、
cp気軽にバグを報告してください。
モールドは現在、x86-64、i386、ARM32、ARM64、および64ビットRISC-Vをサポートしています。
C、C ++、Rustなどのコンパイル言語を使用している場合、ビルドは2つのフェーズで構成されます。最初のフェーズでは、コンパイラがソースファイルをオブジェクトファイル(ファイル)にコンパイルします
.o。2番目のフェーズでは、リンカはすべてのオブジェクトファイルを取得して、それらを単一の実行可能ファイルまたは共有ライブラリファイルに結合します。
ビルド出力が大きい場合、2番目のフェーズには長い時間がかかります。金型はそれをより速くすることができ、あなたの時間を節約し、長いビルドが完了するのを待っている間あなたが気を散らされるのを防ぎます。この違いは、デバッグ-編集-再構築のサイクルが速いときに最も顕著になります。
現在、以下のシステムのバイナリパッケージが利用可能です。
モールドはC++20で記述されているため、モールドを自分でビルドする場合は、最新バージョンのC++コンパイラとC++標準ライブラリが必要です。GCC10.2またはClang12.0.0(またはそれ以降)、およびlibstdc++10またはlibc++7(またはそれ以降)をお勧めします。
ビルドの依存関係をインストールするには
./install-build-deps.sh、このディレクトリで実行します。Linuxディストリビューションを認識し、必要なパッケージをインストールしようとします。rootとして実行することをお勧めします。
git clone https://github.com/rui314/mold.git
cd mold
git checkout v1.3.1
make -j$(nproc) CXX=clang++
sudo make install
C++20コンパイラコマンド名をに渡す必要がある場合があります
make。上記の場合、
clang++が渡されます。うまくいかない場合は、
g++-10またはなどの特定のバージョンのコンパイラを試してください
clang++-12。
デフォルトで
moldは、にインストールされ
/usr/local/binます。
最近の十分なLinuxディストリビューションを使用していない場合、または
make上記のコマンドで何らかの理由で機能しない場合は、Dockerを使用してDocker環境でビルドできます。これを行うには、を実行する
./dist.sh代わりに、このディレクトリで実行し
make -j$(nproc)ます。シェルスクリプトはDockerイメージをプルし、その中にモールドファイルと補助ファイルを作成し、それらを単一のtarファイルにパックします
mold-$version-$arch-linux.tar.gz。tarファイルはどこにでも抽出でき、その
mold中で実行可能ファイルを使用できます。
On Unix, the linker command (which is usually
/usr/bin/ld) is invoked indirectly by the compiler driver (which is usually
cc,
gccor
clang), which is typically in turn indirectly invoked by
makeor some other build system command.
If you can specify an additional command line option to your compiler driver by modifying build system's config files, add one of the following flags to use
moldinstead of
/usr/bin/ld:
Clang: pass
-fuse-ld=mold
GCC 12.1.0 or later: pass
-fuse-ld=mold
GCC before 12.1.0:
-fuse-lddoes not accept
moldas a valid argument, so you need to use
-Boption instead.
-Bis an option to tell GCC where to look for external commands such as
ld.
でモールドをインストールした場合は、 (または、場合によっては)
make installという名前のディレクトリがあり、コマンドがそこにあるはずです。は 実際にはへのシンボリックリンクです。したがって、必要なのは GCCに渡す(または)だけです。
/usr/libexec/mold
/usr/local/libexec/mold
$PREFIX
ld
ld
mold
-B/usr/libexec/mold
-B/usr/local/libexec/mold
にインストール
moldしていない場合でも、 clangに
$PATH渡し てモールドを使用できます。
-fuse-ld=/absolute/path/to/moldただし、GCCは引数として絶対パスを取りません
-fuse-ld。
次のようにプロジェクトディレクトリに作成
.cargo/config.tomlします。
[target.x86_64-unknown-linux-gnu] linker = "clang" rustflags = ["-C", "link-arg=-fuse-ld=/path/to/mold"]
ここで、は実行可能
/path/to/moldへの絶対パス
moldです。をインストールしたことを確認してください
clang。
すべてのプロジェクトにモールドを使用する場合は、上記のスニペットをに配置し
~/.cargo/config.tomlます。
cc代替リンカーを指定するために適切なコマンドラインオプションを渡すのは非常に難しい場合があります。この状況に対処するために、モールドには、のすべての呼び出しをインターセプトする機能
ld、
ld.lldまたは
ld.goldそれをそれ自体にリダイレクトする機能があります。この機能を使用するには、
make次のように、moldのサブコマンドとして(または別のビルドコマンド)を実行します。
mold -run make <make-options-if-any>
内部的には、moldは、
LD_PRELOAD環境変数をコンパニオン共有オブジェクトファイルに設定して特定のコマンドを呼び出します。共有オブジェクトファイルは、
exec(3)-family関数へのすべての関数呼び出しをインターセプトして、、、または
argv[0]の
mold場合に置き換えます。
ld
ld.gold
ld.lld
セットアップモールド GitHubアクションを使用して、GitHubでホストされる継続的ビルドを高速化できます。GitHub Actionsは2コアマシンで実行されますが、特にリンクされているプログラムが大きい場合、モールドはデフォルトのGNUリンカーよりも大幅に高速です。
.comment金型は、出力ファイルのセクションに識別文字列を残します。印刷して、実際にカビを使用していることを確認できます。
$ readelf -p .comment <executable-file>
String dump of section '.comment':
[ 0] GCC: (Ubuntu 10.2.0-5ubuntu1~20.04) 10.2.0
[ 2b] mold 9a1679b47d9b22012ec7dfbda97c8983956716f7
の場合、ファイル
moldは
.commentモールドによって作成されます。
1つの理由は、他のリンカーよりも高速なアルゴリズムと効率的なデータ構造を使用しているためです。もう1つの理由は、新しいリンカーが高度に並列化されていることです。
これは、lld(左)とmold(右)のコアごとのCPU使用率を並べて比較したものです。それらは同じプログラム、Chromium実行可能ファイルをリンクしています。
ご覧のとおり、モールドは実行中に使用可能なすべてのコアを使用し、すばやく終了します。一方、lldはほとんどの場合利用可能なコアを使用できませんでした。このデモでは、バーがGIFに収まるように、最大並列処理を人為的に16に制限しています。
詳細については、デザインノートをお読みください。
金型はAGPLで入手できます。モールドを使用してプログラムをリンクする場合、AGPLの下でプログラムのライセンスを取得する必要があるという意味ではないことに注意してください。モールドリンカーの出力は、リンカーに渡すオブジェクトファイルとライブラリの派生作品ですが、モールドリンカー自体の派生作品ではありません。
さらに、当社のBlue Whale Systems PTE LTDからの技術サポートを受けて、AGPL以外の商用ライセンスを購入することもできます。あなたが大企業であるならば、あなたの会社の何百または何千もの開発者を金型に依存させる前にそれを入手することを検討してください。カビは主に一人のオープンソースプロジェクトであり、他のオープンソースプロジェクトと同様に、私たちはそれを維持することを法的に義務付けられていません。法的拘束力のある商用ライセンス契約がこの懸念に対処します。ライセンスを購入することにより、カビがあなたのために維持されることが保証されます。 商用ライセンスのお問い合わせはお問い合わせください。