高速链接器 mold 发布 3.0.0,这是从 C++ 重写为 Rust 后的首个版本。官方称它与 2.42.1 可无缝替换、链接性能持平,但把越界读取从段错误改为受边界检查的 panic。
高速链接器 mold 发布了 3.0.0,这是它从 C++ 重写为 Rust 后的首版。按发布说明,2.42.1 是 C++ 版本的最后一版,重写计划在 2.42.1 的说明里就已公布。
mold 的目标是做 GNU ld 的快速替代品。3.x 系列的官方目标是补齐与 GNU ld 的剩余兼容性差距,尤其是链接脚本(linker script)支持,并为它成为 Linux 发行版的默认链接器铺路。
发布说明称 3.0 是 2.42.1 的 drop-in replacement:接受同样的命令行选项、支持同样的目标架构,除列出的缺陷修复外产出相同结果,链接性能与 2.42.1 持平。兼容性验证方式是在所有支持的目标上跑测试套件、在大量真实工作负载和选项组合下比对链接输出,并且构建了全部 Gentoo 软件包,"没有发现回归"。
语言迁移本身也带来一个安全属性:面对损坏的输入文件,C++ 版本可能越界读取内存并因段错误崩溃;在 3.0 里这些读取带边界检查,会停在一个 panic 上,而不是继续跑。
如果你自己构建 mold,构建系统已经从 CMake 换成 Cargo,要求 Rust 1.95 或更高版本以及一个 C 编译器,用 cargo build --release 构建、./install-mold.sh 安装。CMake 选项已移除,MOLD_TARGETS 这个 CMake 变量改为 Cargo feature。测试套件也从 ctest 改为 cargo test。依赖上不再依赖 oneTBB,仍静态链接 mimalloc 3.5.3,可用 --features system-allocator 改用系统 malloc。
发布说明列出的修复里,几类值得单独点出来。确定性方面修了若干处非确定性输出,涉及 --dependency-file、--repro、带大量同名 COMDAT 组的 -r,以及部分动态重定位。-r(增量链接)相关修复包括:第二个及以后输入文件中的 C++ 异常曾失效、-x/-X/-s 会删掉重定位引用的符号、--gc-sections 丢掉重定位引用的数据。地址计算方面,针对共享库中符号的 GOT 相对重定位(如 R_X86_64_GOTOFF64、R_ARM_REL32)此前静默取到错误地址,现在被正确处理或报错。还有一批原本会产生错误输出或崩溃的情形改为直接报错,比如 --strip-all 搭配 --emit-relocs、--defsym 的值超出 64 位。
另外,mold 不再在启动时预留 8 GiB 虚拟地址空间,因此在 ulimit -v 下也能工作。
免费获取企业 AI 成熟度诊断报告,发现转型机会
关注公众号

扫码关注,获取最新 AI 资讯
3 步完成企业诊断,获取专属转型建议
已有 200+ 企业完成诊断