mold 3.0.0 以 Rust 重寫,改用 Cargo 建置
mold GitHub Releases · 2026-10-05
高速連結器 mold 從 C++ 整個改寫成 Rust,3.0.0 是第一個 Rust 版本,建置系統也從 CMake 換成 Cargo。對只是呼叫 mold 的人來說,release notes 的定位是 2.42.1 的直接替代品,真正要動手的是自己編譯 mold 的人,以及那些依賴舊行為的連結參數。
這個版本在 2026-10-05 發布。上一個 C++ 版本 2.42.1(2026-09-11)已在 release notes 預告:除非需要補丁版,它會是最後一個 C++ 版本。
背景:為什麼現在重寫
作者在 2.42.1 的說明中表示,連結器是「可能使用數十年」的工具,所以在還算早期的階段改用 Rust,換取記憶體安全。他也坦言重寫有風險,並提到 AI 輔助寫程式讓大規模重寫變得更可行,但沒有消除風險。
另一個動機是讓 mold 能當 Linux 發行版的 /usr/bin/ld。目前多數發行版預設仍是 GNU ld,mold 要取代它,就得補上連結腳本(linker script)支援,才能連結核心與韌體。3.0.0 的目標寫明是補齊與 GNU ld 的相容缺口。
核心改動:行為不變,內部換了
release notes 說 3.0 接受同樣的命令列選項、支援同樣的目標架構,輸出除了列出的 bug 修正外相同,連結效能與 2.42.1 相當。驗證方式是在每個支援的目標上跑測試套件、比對大量實際工作負載的連結輸出,並建置所有 Gentoo 套件,未發現退步。
記憶體安全的實際差別在壞輸入檔:C++ 版讀到損毀的 object 檔可能越界讀取而 segfault,Rust 版會做邊界檢查,在出錯的存取點 panic 並停止。
影響範圍:自己編譯的人
發行版打包者與自行 build mold 的 CI 要改流程,CMake 選項全部移除:
| 項目 | 2.x(C++) | 3.0.0(Rust) |
|---|---|---|
| 建置 | CMake | cargo build --release,需 Rust 1.95 以上與 C 編譯器 |
| 安裝 | CMake install | ./install-mold.sh,接受 PREFIX、DESTDIR |
| 目標架構選擇 | MOLD_TARGETS | Cargo features |
| 測試 | ctest | cargo test |
| 相依 | oneTBB | 不再依賴 oneTBB |
- 函式庫不裝在
$PREFIX/lib(例如/usr/lib64)的人,build 與 install 時都要設MOLD_LIBDIR,否則mold -run找不到mold-wrapper.so。 - 想連結系統 zstd,設
ZSTD_SYS_USE_PKG_CONFIG=1;想用系統 malloc 而非靜態連結的 mimalloc,build 時加--features system-allocator。 install-build-deps.sh換成install-test-deps.sh,只有跑測試才需要。
可能改變你連結結果的修正
這些修正讓 mold 更貼近 GNU ld,若你的專案曾靠舊行為,要重新檢查。notes 另有大量各架構的 relocation 修正,這裡只挑影響面較廣的:
- 單橫線選項的解析:現在照 GNU ld 讀,例如
-entry=main以前被讀成-e ntry=main。 - 版本腳本重複符號:同一符號列在多個 version node 時,現在以第一個為準,與 GNU ld、lld 一致。
- common symbol:同名但大小不同時,取最大的大小與最嚴格的對齊。
- 先前會產生壞輸出的情況改為報錯:例如
--defsym別名指到共享函式庫內定義的符號、--strip-all搭配--emit-relocs、GOT 相對 relocation(如R_X86_64_GOTOFF64)指向共享函式庫符號。CI 若以前「碰巧過」,升級後可能開始失敗,這是正確的失敗。 --gc-sections不再移除--init、--fini指定的函式;--icf=safe不再合併從共享函式庫匯出的函式。
# 2.x:被讀成 -e ntry=main
mold -entry=main foo.o
# 3.0:照 GNU ld 解讀
另外 mold 啟動時不再預留 8 GiB 虛擬位址空間,因此在 ulimit -v 限制下也能執行。
跨架構的修正
非 x86 的使用者也有實質修正。AArch64、PPC32、ARM32 上,透過範圍延伸 thunk(range extension thunk)呼叫其他 section 內的 static 函式,在大型程式會跳到錯誤位址,release notes 舉的例子是 Chromium 的 ARM64 debug build。
PPC32 與 m68k 上,GOT 大到超出 -fpic 程式碼的 16 位元偏移時,以前會被靜默截斷,現在改為報錯。交叉編譯嵌入式韌體的團隊,升級後建議全量重連一次,確認沒有新增的連結錯誤。
最後一點是發行版採用的時程:release notes 只說 3.x 的目標是讓 mold 能被採用為 /usr/bin/ld,並未給出任何發行版的具體時程。