Version 1.55現在、LinuxなどのRustのリンカはgccのld
です。
これをLLVMのlld
に換えるとコンパイルが多少スピードアップします。
$ time cargo build
# GCC / ld
Finished dev [unoptimized + debuginfo] target(s) in 6m 43s
real 6m43.637s
user 8m49.661s
sys 0m28.469s
# GCC / lld
Finished dev [unoptimized + debuginfo] target(s) in 5m 09s
real 5m9.476s
user 7m2.749s
sys 0m23.300s
この例はフルビルドですが、インクリメンタルビルドの際にはリンクの占める時間は相対的に大きくなります。
LLDじたいは、FreeBSDが2016年あたりに全面導入し実績があります。rustcもwasmやベアメタルターゲットにはlld
を使用しています。
セットアップ
ディストリビューションのパッケージマネージャでlldをインストールします。これはArchLinuxの例です。
# packman -S lld
Cargoからlld
を利用する設定は以下のとおりです。この例ではフロントエンドにgcc
を使用するためコメントアウトしていますが、clang
を使用したい場合にはlinker
も指定します。
[target.x86_64-unknown-linux-gnu]
# linker = "/usr/bin/clang"
rustflags = ["-Clink-arg=-fuse-ld=lld"]
プロジェクトのCargo.toml
にも設定可能ですが、$HOME/.cargo/config
に設定するとプロジェクト横断的に参照されます。
lldが有効になっているか確認するには、readelf
コマンドでコンパイル済バイナリの文字列をスキャンします。LLDの行があればlld
を通過しています。
$ readelf --string-dump .comment target/debug/<some-binary>
String dump of section '.comment':
[ 0] Linker: LLD 12.0.1
[ 13] GCC: (GNU) 11.1.0
なお、リンカはRust同梱のlld
を利用する方向で開発が進められており、nightly(v1.55.0時点の)では-Zgcc-ld=lld
オプションで利用できます。
いずれlldを別途インストールせずに利用可能になるでしょう。
⁋ 2021/10/14↻ 2024/11/07
中馬崇尋
Chuma Takahiro
Chuma Takahiro