mold 链接器实测:把 Chromium 链接时间从 16 秒压到 1.6 秒
模具:现代链接器。 Mold 旨在通过最小化构建时间来提高开发人员的生产力,特别是在快速调试-编辑-重建周期中。
秒懂
- 它是什么?
- mold 是一个高并行度的 Unix 链接器,目标是替代 lld 和 GNU ld。本文基于官方基准数据,分析它的加速原理、适用场景、使用方式与限制。
- 适合谁用?
- mold 适合那些链接时间明显拖慢开发循环的团队,尤其是大型 C++ 或 Rust 项目,且构建机拥有较多核心。官方基准显示在 64 核 Threadripper 上,Chromium 调试版链接从 lld 的 16.64 秒降到 1.65 秒,收益显著。
- 能商用吗?
- 可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库最近一次提交在 1 天前。
- 用什么语言写的?
- 主要是 C++(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。
开源项目深度解析
链接器为什么值得单独关注
编译大型项目时,链接阶段往往被忽视,但它可能占用整个构建周期的可观比例。mold 的 README 明确指出,链接器把目标文件合并成可执行文件或共享库,这个过程在输出较大时可能非常耗时。mold 的目标是加速这个阶段,尤其是调试-编辑-重新构建的循环。对于 C、C++ 或 Rust 项目,链接器是每次构建的必经之路,所以它的性能直接影响开发者的等待时间。mold 的定位不是替代编译器,而是替代现有的 Unix 链接器,如 GNU ld 或 LLVM lld。它由 lld 的原作者编写,这意味着它对链接器的内部机制有深入理解。
mold 的加速机制:并行与数据结构
mold 的速度来自两个核心设计:高度并行和高效的数据结构。README 提到,它归功于“pervasive parallelism”和“efficient data structures and algorithms”。传统链接器如 lld 虽然也有并行,但 mold 从零开始设计,绕开了作者在优化 lld 时遇到的架构限制。具体来说,链接过程包括符号解析、重定位、段合并等步骤,mold 将这些步骤拆分成可并行的任务,充分利用多核 CPU。它还使用更紧凑的哈希表和内存布局,减少缓存未命中。官方论文《mold: A Massively Parallel Linker》发表在 ASPLOS 2027,但 README 只给了标题,没有公开具体算法细节。这意味着我们只能从基准结果推断其效果,无法验证内部实现。
官方基准:数据背后的真实差距
README 提供了四组基准数据,分别在 AMD Ryzen Threadripper 7980X 和 Apple M1 Ultra 上运行。所有链接器都从源码编译,使用默认选项,取三次运行的中位数。在 64 核 Threadripper 上,调试版 Chromium 链接,lld 耗时 16.64 秒,mold 仅 1.65 秒,快 10.1 倍。TensorFlow 调试版差距更大,lld 需要 50.73 秒,mold 只要 3.15 秒,快 16.1 倍。但在 M1 Ultra 上,Clang 调试版 mold 反而比 lld 慢(2.96 秒对 2.40 秒),说明加速比并非普遍。release 版差距较小,例如 Blender 在 M1 Ultra 上 mold 0.25 秒,lld 0.56 秒,只快 2.3 倍。这些数据是官方自测,不是独立验证,但至少说明 mold 在多数大型项目上确实有优势。
安装与基本用法
README 没有给出详细安装步骤,但根据项目是 C++ 编写,通常需要从源码构建。仓库使用 CMake,常见做法是 `git clone` 后运行 `cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build`,然后安装到系统路径。mold 提供了两种接入方式:一是直接替换链接器命令,比如将 `cc` 的 `-fuse-ld=mold` 传给 GCC 或 Clang;二是使用 `mold -run` 前缀,它会临时覆盖 `LD` 环境变量,让构建系统自动调用 mold。例如 `mold -run make` 或 `mold -run cargo build`。对于 CMake 项目,可以设置 `CMAKE_EXE_LINKER_FLAGS=-fuse-ld=mold`。具体命令需要参考官方文档,因为 README 只提到“drop-in replacement”,没有列出全部选项。建议先阅读 `mold --help`。
支持平台与已知局限
mold 支持广泛的 CPU 架构,包括 x86-64、i386、ARM 32/64、RISC-V 32/64、PowerPC 32/64、s390x、LoongArch 32/64、SPARC64、m68k 和 SH-4。但它是 Unix 链接器,不支持 macOS 和 Windows,这意味着 Apple 开发者只能用 M1 Ultra 跑 Linux 虚拟机才能使用。另一个局限是,某些链接器特性可能未实现或行为不同。官方基准中,wild 无法链接 Chromium release,因为 wild 不支持 `--icf=all`,而 mold 支持该选项,但 mold 是否完全兼容所有 GNU ld 扩展,README 没有说明。如果你的项目依赖特殊的链接脚本或 `--gc-sections` 的细节行为,需要实测。此外,mold 的并行特性依赖多核,单核机器上加速比会大打折扣。
与 lld 和 wild 的对比:选择哪条路
mold 的直接竞争对手是 LLVM lld 和 wild。lld 是许多大型系统的默认链接器,mold 的作者正是 lld 的原作者,所以两者有血缘关系。但 mold 从零重写,不受 lld 的遗留架构约束。wild 是另一个新链接器,官方基准显示它也比 lld 快,但比 mold 慢。例如 Threadripper 上 ClickHouse 调试版,wild 4.40 秒,mold 0.98 秒,mold 快 4.5 倍。关键差异在于:wild 不支持 `--icf=all`,导致无法链接某些大型 release 构建,而 mold 支持。如果你的项目需要 identical code folding,mold 是更安全的选择。但 wild 在某些小项目上可能与 mold 持平,比如 M1 Ultra 的 Blender release,wild 0.20 秒,mold 0.25 秒,wild 反而更快。选择时不要只看峰值加速比,要针对你的项目和硬件实测。
维护成本与许可证
mold 采用 MIT 许可证,这意味着你可以自由使用、修改和分发,包括商业用途,只要保留版权声明。它没有 copyleft 义务,这对闭源项目友好。维护方面,项目活跃,最近一次发布是 v2.42.0,日期为 2026-08-12,说明持续更新。但作为第三方链接器,你需要跟随上游版本,因为新编译器或新 CPU 指令可能需要新版本支持。升级成本通常较低,因为 mold 是独立二进制,替换即可。但要注意,mold 的构建依赖 C++ 编译器,如果你的工具链较旧,可能需要先升级。另外,mold 的论文尚未公开,算法细节不透明,这增加了长期维护的不确定性。如果 mold 停止维护,你可能需要回退到 lld,所以确保你的构建系统可以轻松切换链接器。
编辑结论
mold 适合那些链接时间明显拖慢开发循环的团队,尤其是大型 C++ 或 Rust 项目,且构建机拥有较多核心。官方基准显示在 64 核 Threadripper 上,Chromium 调试版链接从 lld 的 16.64 秒降到 1.65 秒,收益显著。但如果你主要链接小型程序,或者构建机核心数很少,加速比可能不明显,甚至在某些 M1 Ultra 小项目上 mold 与 lld 持平。另外,mold 不支持 macOS 和 Windows,只覆盖 Unix 系平台,这是硬边界。采用前应先验证你的项目是否能被 mold 正确链接,特别是涉及特殊链接脚本或 `--icf=all` 等选项时。官方基准中 wild 链接 Chromium release 失败,就是因为 wild 未实现 `--icf=all`,而 mold 支持该选项,但你的项目若依赖某些 GNU ld 扩展,仍需实测。具体做法是:在 CI 或本地用 `mold -run make` 或 `mold -run cargo build` 跑一次完整构建,比较产物体积和运行行为,再决定是否默认启用。
社区笔记