使用LLD链接器在Linux上实现更快的链接时间——Rust 1.90.0稳定版
2025年9月1日 · Rémy Rakic
代表编译器性能工作组
摘要:从下一个稳定版本(1.90.0,计划于2025年9月18日发布)开始,rustc将在x86_64-unknown-linux-gnu目标平台上默认使用LLD链接器,这应能显著减少链接时间。现在可以在beta版本上进行测试,并请报告遇到的任何问题。
背景介绍
链接时间通常是编译时间的重要组成部分。当rustc需要构建二进制文件或共享库时,它通常会调用系统上安装的默认链接器(这可以通过命令行或编译目标进行更改)。
链接器承担着重要的工作,涉及稳定性、向后兼容性等问题。由于这些原因,在最流行的操作系统上,它们通常是较旧的程序,设计时计算机只有单核。因此,在现代机器上它们往往运行缓慢。例如,在Linux上以调试模式构建ripgrep 13时,大约一半的时间实际上花在了链接器上。
然而,有不同的链接器可用,改善链接时间的常见建议是使用更新、更快的链接器,如LLVM的lld或Rui Ueyama的mold。
Rust的一些wasm和aarch64目标已经默认使用lld。当使用rustup时,rustc会附带一个用于此目的的lld版本。当CI构建编译器使用的LLVM时,它也会构建链接器并打包。它被称为rust-lld,以避免与用户机器上已安装的任何lld冲突。
由于链接时间的改进非常显著,在最流行的目标平台上使用它将是一个很好的默认选择。这一点已经讨论了很长时间,例如在问题#39915和#71515中。
为了扩大测试范围,我们在2024年5月启用了rustc在nightly版本上默认使用rust-lld。自那时起,没有报告重大问题。
我们相信我们已经完成了所有可能的内部测试,包括CI、crater、基准测试基础设施和nightly版本,并计划在1.90.0中为x86_64-unknown-linux-gnu的稳定版本启用rust-lld作为默认链接器。
优势
虽然这也使编译器在未来能够使用更多链接器功能,但最直接的好处是链接时间的大幅改善。
以下是上面提到的ripgrep示例的更多细节:对于增量重建,链接时间减少了7倍,从而使端到端编译时间减少了40%。对于从头开始的调试构建,有20%的改进。
大多数二进制文件应该会看到一些改进,但对于较大的二进制文件、增量重建或涉及调试信息的情况,改进尤其显著。这些情况通常在链接器中遇到瓶颈。
这里是我们的基准测试完整结果的链接。
可能的缺点
根据我们之前的测试,我们实际上不期望在实践中出现问题。在绝大多数情况下,它是一个即插即用的替代品,但lld与GNU ld并不是完全bug对bug兼容。
无论如何,如果出现任何问题,可以禁用rust-lld:使用-C linker-features=-lld
标志恢复使用系统的默认链接器。
某些依赖这些差异的crate可能需要额外的链接参数,尽管我们也预计这种情况相当罕见。如果您遇到问题,请在GitHub上提交问题告知我们。
一些性能上的巨大提升来自并行性,这在资源受限的环境中或对于已经达到硬件极限的重型项目可能是不希望的。
总结与测试呼吁
rustc将在x86_64-unknown-linux-gnu上使用rust-lld,从1.90.0稳定版开始,以显著改善链接时间。Rust 1.90.0将于下个月,即2025年9月18日发布。
此链接器更改已在当前beta版本(1.90.0-beta.6)上可用。为了帮助大家为稳定版做好准备,请在beta版本上测试您的项目,并通过在GitHub上提交问题告知我们您是否遇到问题。
如果发生问题,您可以使用-C linker-features=-lld
标志恢复默认链接器。可以通过将其添加到通常的RUSTFLAGS环境变量中,或添加到项目的.cargo/config.toml配置文件中,如下所示:
|
|