rustcのリンカをlldに変更

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