🧩

RustのリンカをCargo設定で変更する

2022/03/08に公開

Linux環境において、Rustのコンパイラrustcはデフォルトのリンカが gccld です。

$ readelf -p .comment ./target/debug/deno

String dump of section '.comment':
  [     0]  GCC: (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
  [    2b]  GCC: (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0
  [    54]  GCC: (crosstool-NG ) 5.2.0

このリンカを Cargo の設定で

に変更する方法を紹介します。

Cargo の設定ファイル

以下のいずれかのファイルを変更します。

  • プロジェクトごとに設定 : PROJECT/.cargo/config
  • グローバルに設定 : $HOME/.cargo/config

LLVM lld に変更

リンカをLLVMのlldに変更する場合、以下の設定を追加します。

[target.ARCHITECTURE]
rustflags = ["-C", "link-arg=-fuse-ld=lld"]

x86_64 Linux 向けの場合

[target.x86_64-unknown-linux-gnu]
rustflags = ["-C", "link-arg=-fuse-ld=lld"]

となります。

バイナリからリンカを確認します。

$ readelf -p .comment ./target/debug/deno

String dump of section '.comment':
  [     0]  Linker: LLD 10.0.0
  [    13]  GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
  [    3d]  GCC: (crosstool-NG ) 5.2.0

mold に変更

moldlld 作者の rui314 氏が開発中の超高速リンカです。

GitHub - rui314/mold: mold: A Modern Linker

リンカを mold に変更する場合、以下の設定を追加します。

[target.ARCHITECTURE]
linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=mold"]

AWS Graviton のような ARM64 の場合

[target.aarch64-unknown-linux-gnu]
linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=mold"]

となります。

バイナリからリンカを確認します。

$ readelf -p .comment ./target/debug/deno

String dump of section '.comment':
  [     0]  mold 1.1 (89612b709638b90c8a044e2f96f47d28054ba789; compatible with GNU ld)
  [    4c]  GCC: (crosstool-NG ) 5.2.0
  [    67]  GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
  [    91]  GCC: (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0

Denoのビルド時間を比較

参考情報として、リンカの違いによるJavaScript/TypeScriptランタイムのDenoのビルド時間を共有します。

リンカごとに $ cargo build 及び $ cargo clean を複数回実行したビルド時間(単位は秒)の平均です。

LD LLD Mold
199 164 160

環境

  • OS : Ubuntu 20.04
  • Server : Amazon EC2 c6g.4xlarge
  • CPU : Graviton 2
  • rustc : 1.59.0

参考

Discussion