10 月 5 日凌晨,rui314 放出 mold 3.0.0——mold 官方首个 Rust 版。HN 热帖标题是“Mold 3.0:链接器用 Rust 重写”,评论区第一反应基本一致:“Rust 更快了吧?”先给结论:没有。本机 2 核 EPYC、1501 个 .o(18MB 负载)链接 3 轮中位,mold 3.0.0 (Rust) 84ms,mold 2.42.1 (C++) 87ms,差 3.4%,在噪声范围内。官方 release notes 原话就写着:“Linking performance remains on par with 2.42.1.”——这句话我本机复现了。重写一门语言、换掉整套构建系统,结果速度纹丝不动。这不是翻车,这是理解 Rust 在链接器这个场景里到底买到了什么的第一步。
这篇文章围绕三件事展开:一是重写 Rust 后并没有更快,本机用 1501 个 .o 对照,坐实“打平”;二是真正的卖点究竟是什么——内存安全从测试覆盖升级为类型系统保证、工程依赖瘦身,以及为 mold 进入发行版默认链接器铺路;三是给出本机 2 核 EPYC 上的实测数字与三条边界。测试机器为 AMD EPYC 9354P 2 核切片,测试对象是 mold 3.0.0(Rust)/ 2.42.1(C++)/ 系统 ld.bfd,2026-10-05 实测,每条数字都挂了命令,可复现。
官方 release 自己说了“速度不变”,我本机验证了这句话
mold 3.0.0 的 release notes 第一屏就写着:“Linking performance remains on par with 2.42.1.” 这句话我本机复现了:
# 同一批 1501 个 .o(gcc -O2 编译,18MB 负载),3 轮中位
$ mold3/mold-3.0.0-x86_64-linux/bin/mold data/objs/*.o -o out -e main
# 84ms (Rust)
$ mold2421/mold-2.42.1-x86_64-linux/bin/mold data/objs/*.o -o out -e main
# 87ms (C++)
$ /usr/bin/ld.bfd -static -o out data/objs/*.o -e main
# 824ms (GNU ld, 慢 9.8 倍)
差 3.4%,落在噪声里。重写一门语言、换掉整套构建系统,速度纹丝不动——官方那句 “on par” 我没挑出毛病,本机坐实了。
那卖点到底是什么
mold 3.0 真正动了三处,速度只是其中最不值得看的那处。
1. 内存安全的保证从“测试覆盖”变成“类型系统”
C++ 版面对畸形输入时,官方 release notes 的原文是:“The C++ version could read memory out of bounds on such input and crash with a segmentation fault. In mold 3.0, those reads are bounds-checked, so mold stops with a panic at the faulty access instead.”
我做了两个损坏输入实验,分别是尾部截断 512B 和 shstrndx 越界 3 节。结果是两版行为完全一致,都干净报 fatal,没复现出 C++ 崩溃 vs Rust panic 的差异:
$ mold3 data/objs/... -o out -e main # 喂尾部截断 .o
mold: fatal: corrupt-trunc.o: e_shoff or e_shnum corrupted: 1070414
$ mold2421 data/objs/... -o out -e main
mold: fatal: corrupt-trunc.o: e_shoff or e_shnum corrupted: 1070414
如实说:我没复现官方描述的 segfault 场景。但这并不改变判断——Rust 版的保证是语言级的,OOB 读在类型系统里就不存在,而不是“我加了个 if 检查”。C++ 版的安全靠测试用例覆盖率,Rust 版的安全靠编译器。一个是“已知坑填完了”,一个是“这类坑写不出来”。
2. 工程面砍掉一堆依赖
构建系统从 CMake 换成 Cargo,cargo build --release 一条命令即可,需要 Rust 1.95+;去掉 oneTBB 运行时依赖;mimalloc 3.5.3 改静态链接;测试套件也从 ctest 迁移到 cargo test。对维护者是减负,对使用者零感知。
3. 真正的战略:铺路进发行版
release notes 里这句最容易被标题党吃掉:
The goal of mold 3.x is to close the remaining compatibility gaps with GNU ld, particularly in linker script support, and to pave the way for mold to be adopted as the default linker in Linux distributions.
mold 一直卡在“快是真快,但 linker script 兼容性差一截”。3.0 把目标钉死在“默认链接器”上——进了发行版默认,才谈得上每个 C 开发者默认享受 9.8 倍链接加速。本机 ld.bfd 中位 824ms,mold 84ms,差距就是这么直接。
数字表(本机 2 核 EPYC,2026-10-05)
| 对比项 |
mold 3.0.0 (Rust) |
mold 2.42.1 (C++) |
ld.bfd (GNU) |
| 中位耗时(1501 .o,3 轮) |
84ms |
87ms |
824ms |
| 相对 mold 2.42.1 |
打平(-3.4%) |
基准 |
慢 9.8 倍 |
| 损坏输入(尾部截断) |
clean fatal |
clean fatal |
clean fatal |
| 损坏输入(shstrndx 越界) |
clean fatal |
clean fatal |
clean fatal |
| 构建 |
Cargo(Rust 1.95+) |
CMake + oneTBB |
— |
速度结论:mold 快,但“快”是 mold 相对 GNU ld 的故事,9.8 倍;不是 Rust 相对 C++ 的故事,打平。把“Rust 更快”当卖点读 HN 帖,确实读岔了。
边界写清楚
- 本机单核链接,2 核 EPYC 但 mold 默认并行度另计,官方给的是多核场景;9.8 倍是 ld.bfd 静态链接对照,动态链接场景差距不同。
- 损坏输入实验没复现出官方描述的 C++ segfault 场景,两种构造的畸形 .o 两版都干净拒绝。“segfault → panic” 是语言级保证,而不是可测行为差异,这点文中已如实标注。
- 3.0 是 drop-in 替换:命令行选项、目标架构、输出与 2.42.1 完全一致,官方跑全目标测试套件和 Gentoo 全量构建验证,迁移零成本。
FAQ
- mold 3.0 比 2.42.1 快吗? 没有。本机 1501 .o 链接中位 84ms vs 87ms,打平。官方 release notes 原话是 “remains on par”,本机复现。
- 那重写成 Rust 的意义是什么? 不是更快,是三处:内存安全从测试覆盖升级为类型系统保证、工程依赖瘦身(去 oneTBB/CMake)、铺路进发行版默认链接器。
- 普通用户现在要升级吗? 不用急。3.0 是 drop-in 替换,命令行完全兼容;没有 GNU ld 兼容性问题、不关心发行版默认链接器的人,2.42.1 够用。
- ld.bfd 那 9.8 倍谁受益? 用默认系统链接器 bfd 跑大量 C/C++ 项目的:切 mold 就是零成本提速。Rust 项目一般已默认走 mold 或 lld,这条主要指 C/C++ 工具链。
- “Rust 重写更快”的说法哪来的? HN 标题党加上“Rust 快”的通用心智。官方 release notes 第一屏就写了 “remains on par”,读原文能省掉这层误读。
说到底,官方 release notes 第一屏已经把最关键的结论写清楚了:读原文,还是比读 HN 标题靠谱。