🧩
RustのリンカをCargo設定で変更する
Linux環境において、Rustのコンパイラrustcはデフォルトのリンカが gcc
の ld
です。
$ 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 の設定で
- LLVM の lld
- mold
に変更する方法を紹介します。
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 に変更
mold
は lld
作者の 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