
高速链接器 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 规范。