内容提要
rustc将在x86_64-unknown-linux-gnu上使用rust-lld作为默认链接器,以显著减少链接时间。这将带来更好的性能和更快的编译速度。如果出现问题,可以通过添加-Z linker-features=-lld标志来恢复使用系统默认的链接器。
延伸解读
为何链接时间成为编译瓶颈
文章指出,链接时间常占编译总时间的很大一部分。传统链接器设计于单核时代,在现代多核机器上往往较慢。例如在Linux上以调试模式构建ripgrep 13时,约一半时间花在链接器上。这解释了为何rustc要改用更快的rust-lld来优化整体编译速度。
rust-lld带来的实际收益
根据文章中的ripgrep示例,使用rust-lld后链接时间减少了7倍,端到端编译时间缩短了40%。对于较大的二进制文件或包含调试信息的情况,改进尤为显著,因为这些场景通常受限于链接器性能。这表明该变更对日常开发效率有直接提升。
潜在风险与回退方案
rust-lld并非与GNU ld完全兼容,可能影响少数依赖特定行为的crate。文章提到在crater运行中,不到20个crate因封装符号默认行为不同而链接失败,可能需要添加-Clink-arg=-Wl,-z,nostart-stop-gc。若遇到问题,可通过-Z linker-features=-lld标志恢复系统默认链接器。
并行链接的适用性考量
文章提到,性能提升部分来自并行处理,这在资源受限的环境中可能并不理想。因此,在内存或CPU有限的机器上,rust-lld的默认启用可能带来额外负担。用户需根据自身环境评估是否禁用该特性,以平衡编译速度与资源消耗。
Q&A
rustc为什么要在夜间版本中使用rust-lld作为默认链接器?
rustc使用rust-lld作为默认链接器是为了显著减少链接时间,从而提高编译速度和性能。
使用rust-lld能带来哪些具体的性能提升?
使用rust-lld可以将链接时间减少7倍,从而使整体编译时间减少40%。
如果在使用rust-lld时遇到问题,应该如何处理?
可以通过添加-Z linker-features=-lld标志来恢复使用系统默认的链接器。
rust-lld与传统链接器相比有什么优势?
rust-lld是更新的链接器,能够在现代机器上提供更快的链接速度,尤其是在构建较大二进制文件时。
rust-lld的使用会对现有项目造成影响吗?
大多数情况下,rust-lld是一个无缝替代,但某些依赖于GNU ld特性的项目可能需要额外的链接参数。
rust-lld的启用时间是什么时候?
rust-lld将在2024年5月18日的rustup夜间版本中启用。