17611538698
webmaster@21cto.com

Mold 3.0 完全用 Rust 重写,不再使用 C++

编程语言 0 13 58分钟前
Rust 标志、铅笔、指南针

21CTO 导读:在Mold 3.0 版本中,这款快速链接器从 C++ 切换到了 Rust。然后它的下一个目标已经确定:Mold 将成为 Linux 发行版中的标准链接器。

Mold 是一款高速链接器,可替代 GNU Gold/LD 和 LLVM LLD 等链接器。它需要Rust 1.95环境,放弃了 Intel 的 oneTBB。据评测Mold 相对于 LLVM lld 的平均速度提升了 4.9 倍。

图片

在 3.x 系列版本中,由 Mold 和 lld 创建者 Rui Ueyama 领导的开发团队希望彻底消除与 GNU ld 的兼容性差距,尤其是在链接器脚本支持方面。他们也希望为 Mold 未来成为 Linux 发行版的标准链接器铺平道路。

Mold最近一直在进行从 C++ 到 Rust 的重写,并雄心勃勃地希望最终成为 Linux 系统的默认标准链接器。

而今天,这款基于 Rust 的高性能链接器 Mold 3.0 正式发布了。

Mold3.0 称可直接替代之前的稳定版本 Mold 2.42.1,尽管现在使用的是 Rust 编程语言而非 C++。

Mold 3.x 的主要目标是解决与 GNU LD 之间剩余的兼容性问题:

“mold 3.0.0 是高速链接器的新主要版本。


正如我们在 2.42.1 版本说明中宣布的那样,我们已将 mold 从 C++ 重写为 Rust,这是 Rust 版本的第一个版本。


2.42.1 是 C++ 版本的最后一个版本。mold 3.x 的目标是弥合与 GNU ld 的剩余兼容性差距,尤其是在链接器脚本支持方面,并为 mold 被 Linux 发行版采用为默认链接器铺平道路。”

使用 Rust 编程语言的 Mold 3.0 在处理损坏的输入文件时会更加安全。Mold 3.0 依赖于 Rust 1.95 或更高版本,不再依赖 Intel oneTBB,并且使用 Rust 的 Cargo 构建系统而非 CMake。
模具 3.0

在 Mold 3.0 Rust 重写过程中,新版本修复了许多 bug。主要包括如下:

  • 针对损坏的输入文件,增加了内存访问边界检查

  • 将构建系统从 CMake 迁移到 Cargo

  • 需要 Rust 1.95 或更高版本以及 C 编译器才能从源代码构建

  • 移除对并行处理库 oneTBB 的依赖

  • 修复了在静态链接的可执行文件中使用版本脚本时发生的崩溃问题

  • 修复了将输出文件指定为输入文件时发生的崩溃和输出损坏问题 

  • 修复了“--gc-sections”会移除“--init”和“--fini”指定的函数的问题

  • 修复了部分链接“-r”中异常处理、符号和重定位的多个问题

  • 修复了生成无法重现输出的多个问题 

  • 改进了对 AArch64、ARM、RISC-V、LoongArch、PowerPC 、SPARC64 等架构的重定位处理

其完整的修复列表和 Mold 3.0 的其他详细信息请参见发布公告。

图片

为什么要用 Rust 重写一个已经可以正常工作的链接器?

主要原因就是安全性。链接器会读取它自己没有创建的目标文件,然后对这些文件执行大量底层内存操作。

在 C++ 中,一个受损的输入文件就可能导致代码读取本不该访问的内存。而这正是内存漏洞演变为安全漏洞的典型例子。Rust 会自动检查这些读取操作,这使得 Mold 在处理损坏的输入文件时更加安全。

接下来的版本:默认链接器脚本

Mold 3.x 系列的目标异常明确。该项目的既定目标是“弥合与 GNU ld 之间剩余的兼容性差距,尤其是在链接脚本支持方面”。它还希望“为 Mold 被 Linux 发行版采用为默认链接器铺平道路”。

链接器脚本是一些小文件,它们告诉链接器将代码精确地放置在内存中的哪个位置。操作系统内核、引导加载程序和小型设备的固件都依赖于它们。Mold 之前无法链接这些程序。在它能够做到这一点之前,发行版无法将其设置为系统默认链接器。

这对开发者意味着什么

可将 3.0 版本视为直接替换,然后进行验证。如果你已经在使用 Mold,则构建标志无需更改。首先,将一个实际项目分别链接到 2.42.1 和 3.0 版本。然后在切换 CI 服务器之前运行完整的测试套件。

如果想自行构建 mold,请检查你的编译器。这需要 Rust 1.95 或更高版本,因此某些长期支持发行版打包的旧版本 Rust 可能无法构建它。打包者会失去 oneTBB 依赖,但会采用 Cargo 构建。

自行测量链接时间。表格中的速度提升数据来自 Mold 的代码库,测量时间是在重写之前。请在切换代码前后,分别对你自己的代码进行完整构建和小规模增量构建的计时。

Mold支持的架构包括 x86-64、i386 和 ARM 32/64 位。感兴趣的开发者可从其官方网站GitHub获取mold 3.0.0。

GitHub:https://github.com/rui314/mold/releases#release-v3.0.0

作者:聆听音乐的鱼

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。

分享到微信