mold - カビ:現代のリンカー

(mold: A Modern Linker)

Created at: 2020-09-29 13:12:48
Language: C++
License: NOASSERTION

カビ:現代のリンカー

モールドは、既存の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
,
gcc
or
clang
), which is typically in turn indirectly invoked by
make
or 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

mold
instead 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-ld
    does not accept
    mold
    as a valid argument, so you need to use
    -B
    option instead.
    -B
    is 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

Rustを使用している場合

次のようにプロジェクトディレクトリに作成

.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でホストされる継続的ビルドを高速化できます。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実行可能ファイルをリンクしています。

htopアニメーションでのCPU使用率の比較

ご覧のとおり、モールドは実行中に使用可能なすべてのコアを使用し、すばやく終了します。一方、lldはほとんどの場合利用可能なコアを使用できませんでした。このデモでは、バーがGIFに収まるように、最大​​並列処理を人為的に16に制限しています。

詳細については、デザインノートをお読みください。

ライセンス

金型はAGPLで入手できます。モールドを使用してプログラムをリンクする場合、AGPLの下でプログラムのライセンスを取得する必要があるという意味ではないことに注意してください。モールドリンカーの出力は、リンカーに渡すオブジェクトファイルとライブラリの派生作品ですが、モールドリンカー自体の派生作品ではありません。

さらに、当社のBlue Whale Systems PTE LTDからの技術サポートを受けて、AGPL以外の商用ライセンスを購入することもできます。あなたが大企業であるならば、あなたの会社の何百または何千もの開発者を金型に依存させる前にそれを入手することを検討してください。カビは主に一人のオープンソースプロジェクトであり、他のオープンソースプロジェクトと同様に、私たちはそれを維持することを法的に義務付けられていません。法的拘束力のある商用ライセンス契約がこの懸念に対処します。ライセンスを購入することにより、カビがあなたのために維持されることが保証されます。 商用ライセンスのお問い合わせはお問い合わせください