高速链接器 mold 正式发布 3.0.0 主要版本。正如早前在 2.42.1 版本说明中预告,mold 已完成从 C++ 到 Rust 的语言重构,2.42.1 也因此成为 C++ 版本的最终发行版。mold 3.x 系列旨在进一步缩小与 GNU ld 的兼容性差距,重点强化链接脚本支持,为未来被主流 Linux 发行版采纳为默认链接器奠定基础。

平滑迁移与安全性提升

mold 3.0 设计为 2.42.1 的直接替代品,保持相同的命令行选项、目标架构支持及链接结果(除已修复的错误外),链接性能与前代持平。开发团队通过在多平台运行测试套件、对比广泛实际工作负载下的输出,以及构建全量 Gentoo 软件包进行验证,确认未出现回归问题。

转向 Rust 显著提升了内存安全性。针对损坏输入文件,旧版 C++ 代码可能因越界读取导致段错误崩溃;新版 mold 3.0 引入边界检查,在发生非法访问时以 panic 方式安全停止,避免崩溃风险。

需注意,自行构建 mold 的用户需适应新的构建系统,具体变更见官方文档。

关键修复与改进

本次更新修复了多项导致崩溃、输出损坏或非确定性行为的关键缺陷:

  • 稳定性修复:解决了使用版本脚本或 --default-symver 创建静态链接可执行文件时的崩溃问题;修复了输入输出文件相同时(如 mold -r -o foo.o foo.o bar.o)导致的崩溃或数据损坏。
  • 符号与重定位处理:--gc-sections 现在保留由 --init 和 --fini 指定的函数;同名但大小不同的公共符号采用最大大小和最严格对齐,行为对齐 GNU ld 和 lld;修正了 GOT 相对重定位在共享库符号上的错误地址处理,现改为正确处理或报错。
  • ICF 与优化:--icf=safe 不再折叠共享库导出函数;--icf=all 配合 --emit-relocs 使用时不再崩溃。
  • 确定性与路径:修复了涉及 --dependency-file、--repro 及多 COMDAT 组等情况下的非确定性输出;解决了 -C、--chroot 和 --repro 相关的相对路径问题。
  • 启动与资源:mold 启动时不再预保留 8 GiB 虚拟地址空间,确保在 ulimit -v 限制下正常运行;若 XDG_RUNTIME_DIR 为空,MOLD_JOBS 功能恢复正常。

架构特定改进

针对多种指令集架构进行了深度优化与 bug 修复:

  • AArch64/ARM32/PPC32:修复了大型程序(如 Chromium ARM64 调试版)中通过范围扩展 thunk 调用静态函数跳转错误地址的问题;AArch64 和 ARM32 增加了对更多重定位类型的支持;ARM32 修复了大端模式下的 -r 输出。
  • RISC-V/LoongArch:修复了代码放松操作后对 ICF 折叠函数的调用问题,以及 32 位对象中的特定重定位错误;RISC-V 修复了 Clang 18 对象文件的 TLSDESC 问题及溢出检查;LoongArch 在极端代码模型中支持 TLSDESC,并修复了重定位值错误。
  • PPC64/SH4/SPARC64:PPC64 修复了静态链接 IFUNC 调用及汇编中的 @got 引用;SH4 修复了 PLT 调用返回结构函数时的崩溃及 C++ 异常问题;SPARC64 修正了特定分支指令及 -r 输出中的重定位处理。

此外,mold 现在对多种错误情况(如 --defsym 别名化共享库符号、不合适的 64 位值等)直接报错而非产生损坏输出或崩溃,并优化了单横线选项的解析逻辑,使其更符合 GNU ld 规范。