9月11日、Phoronixが「Mold High Speed Linker Being Rewritten In Rust, Hopes To Be The Default Linker On Linux」と題した記事を公開した。この記事では、高速リンカー「mold」がC++からRustへの書き直しを進め、Linuxのデフォルトリンカー(/usr/bin/ld)への採用を目指すという計画について詳しく紹介されている。
リンカーはコンパイル済みオブジェクトファイルを最終的な実行可能ファイルへ結合するツールで、大規模プロジェクトではビルド時間の大きなボトルネックになりやすい。moldはGNU ldやLLVM lldを性能面で大きく上回ることで知られ、Chromiumのリンク時間を数十秒単位から数秒単位へ短縮した実績を持つ。それほどの性能差があるにもかかわらず、ほとんどのLinuxディストリビューションでデフォルトが変わらないままなのはなぜか——次期メジャーバージョンmold 3.0はその問いに正面から答えようとしている。
mold 3.0の野心:デフォルトリンカーの座を狙う
moldはオープンソースの高速リンカーで、LLVM lldやGNU ldを性能面で大きく上回ることで知られる。FedoraやArchといった一部のディストリビューションではオプションとして利用可能になっているものの、/usr/bin/ld の座——つまりシステムのデフォルトリンカー——はいまだGNU ldが占めたままだ。
最新パッチリリースのアナウンスに、次期メジャーバージョンmold 3.0の方向性が示された。最大のポイントは、実装言語をC++からRustへ移行することと、Linuxディストリビューションにおける/usr/bin/ldのデフォルトリンカーへの採用を目指すという2点だ。
リード開発者であるRui Ueyama氏はこう述べている:
「過去20年間、gold、lld、moldといった高速リンカーが開発されてきた。それでも、ほとんどのLinuxディストリビューションのシステムリンカー
/usr/bin/ldは依然としてGNU ldのままだ。結果として、moldなら数百ミリ秒で終わるリンクジョブが、デフォルトリンカーでは数秒・数十秒、場合によっては数分かかることになる。Linuxコミュニティにとって残念な状況だと思っている。」
Ueyama氏はlldとmold双方のオリジナル作者だ。その人物が「高速化には力を注いできたが、システムリンカーの代替として使えるようにするための互換性作業には十分注力できていなかった」と自認しつつ、mold 3.xでそれを変えると宣言した形だ。
具体的な優先課題として以下が挙げられている:
- リンカースクリプトの未実装機能を補完し、ユーザー空間プログラムだけでなくカーネルやファームウェアのリンクにも対応する
- Linuxディストリビューション開発者と密に連携し、
/usr/bin/ldとしての採用に向けた広範な互換性テストを実施する
なぜRustへ書き直すのか
Rustへの移行の主な動機は、型安全性や並行処理の安全保証といったRustの言語特性だ。パフォーマンス目標は変わらず、mold 3.0もmold 2.xxと同等の高速リンクを維持する方針とされている。
Rustによるリンカー実装としては、すでにWild linkerが存在する。Wild linkerはインクリメンタルリンクを主眼に置いたRust製の新興リンカーで、moldもRust実装という点でその流れに合流する形になる。LinuxカーネルへのRust導入やsystemdのRust対応など、C/C++が長年支配してきたシステムソフトウェア領域でRust再実装が相次ぐ近年の潮流とも合致する動きだ。
インクリメンタルリンクへの言及
これまでmoldが対応していなかったインクリメンタルリンク(変更差分のみを再リンクすることで大規模プロジェクトのリビルド時間を大幅に短縮する仕組み)についても、シンプルな実装方法が見つかれば追加を検討するとしている:
「シンプルな形でインクリメンタルリンクを追加できるなら、ぜひ取り組みたい。一部のワークロードでは大幅な改善が期待できる。moldのシンプルさと信頼性を保ちながらその恩恵を得られる設計を現在模索中だ。」
インクリメンタルリンクはmoldがこれまで意図的に機能範囲外としてきた領域でもあり、採用を検討すること自体が方針の変化を示している。
mold 3.0がLinuxのデフォルトリンカーの座を実際に獲得できるかは、互換性作業の進捗とディストリビューション側の意思決定に依存する。ただ、lldとmold両方の生みの親が正面から互換性問題に取り組むと表明した意味は軽くない。
詳細はMold High Speed Linker Being Rewritten In Rust, Hopes To Be The Default Linker On Linuxを参照していただきたい。