Mold 3.0.0 已正式發布,這是該高速連結器從 C++ 重寫為 Rust 後的首個主要版本。2.42.1 是最後的 C++ 版本,而 3.0.0 旨在縮小與 GNU ld 的剩餘相容性差距,特別是連結器腳本支援,並為 Linux 發行版採用 Mold 作為預設連結器鋪路。Mold 3.0 設計為 2.42.1 的直接替代品(drop-in replacement),接受相同的命令列選項,支援相同的目標架構,並產生相同的輸出(除了列出的錯誤修復外)。連結性能與 2.42.1 保持相當。開發團隊透過在所有支援的目標上執行測試套件、比較廣泛的真實世界工作負載和選項組合的連結器輸出,以及建置所有 Gentoo 套件來驗證相容性,未發現回歸問題。
改用 Rust 使 Mold 在處理損壞的輸入檔案時更安全。C++ 版本可能會在這種輸入上讀取超出邊界的記憶體並因分段錯誤而崩潰。在 Mold 3.0 中,這些讀取操作會進行邊界檢查,因此 Mold 會在錯誤存取處停止並引發 panic,而不是崩潰。
建置系統已從 CMake 改為 Cargo,需要 Rust 1.95 或更高版本以及 C 編譯器。使用者需執行 `cargo build --release` 來建置,並使用 `./install-mold.sh` 安裝。Mold 不再依賴 oneTBB,而是靜態連結 mimalloc 3.5.3(可透過 `--features system-allocator` 使用系統 malloc)。測試套件現在使用 `cargo test` 執行。
此次更新包含大量錯誤修復與相容性改進,包括修復靜態連結執行檔與版本腳本結合時的崩潰、輸出檔案同時作為輸入檔案時的錯誤、`--gc-sections` 錯誤移除 `--init` 和 `--fini` 函數、常見符號大小與對齊處理、ICF(相同程式碼折疊)相關問題、GOT 相對重定位錯誤、非確定性輸出問題、以及多個特定架構(如 AArch64, ARM32, RISC-V, LoongArch, PPC, SH4, SPARC64)的錯誤修復與新功能支援。
事件背景
Mold 是一款開源的高速連結器,由 rui314 開發。其目標是成為 GNU ld 和 LLVM lld 的快速替代品。此次重寫為 Rust 的主要動機之一是提升記憶體安全性,特別是在處理損壞輸入檔案時的穩健性,以及進一步提高與 GNU ld 的相容性以促進其在 Linux 發行版中的採用。專案透過 GitHub Sponsors 和 OpenCollective 接受捐贈。
社群觀察
社群討論集中在重寫的動機、時間表以及對生態系的影響。有使用者指出,他們維護的 Linux 發行版使用 Mold 作為引導 Rust 本身的 bootstrap linker,這節省了數小時的建置時間。由於 Rust 本身需要編譯器,改用 Rust 重寫 Mold 意味著他們必須維護 C++ 版本的 Mold 2 作為 forever fork,因為 Rust 並非所有問題的最佳工具。另一条评论惊讶于重写仅耗时三周(尽管后续澄清可能已酝酿一段时间),并质疑是否使用了 AI 代理。还有用户询问 Mold 与另一个仅支持 Linux 的快速链接器 Wild 的区别,以及为何选择重写而非在 C/C++ 代码库中修复损坏输入处理的问题。



