LLVM 项目的新 ELF 链接器
我们已经努力了几个月来重写 lld(LLVM 链接器)中的 ELF 支持。我们很高兴地宣布它已经取得了一个重要的里程碑:它现在能够引导 LLVM、Clang 和自身,并在 x86-64 Linux 和 FreeBSD 上通过所有测试,速度符合 LLVM 项目的预期。ELF 是类 Unix 系统(如 Linux 和 BSD)上可执行文件的标准文件格式。GNU ld 和 GNU gold 是当今此类系统中常用的链接器。在许多用例中,链接器是一个黑盒子,只有速度很重要。根据程序的大小,链接程序需要从几十毫秒到超过一分钟的时间。我们设计了新的链接器,使其运行速度尽可能快。虽然还没有进行任何严肃的基准测试或优化,但人们始终观察到,新的 lld 链接 LLVM/Clang/lld 可执行文件的速度大约是 GNU gold 的一半。生成的执行文件大小大致相同。lld 还没有与 gold 功能对等,因此现在下结论还为时过早,但我们正在努力在添加更多功能的同时保持或提高 lld 的速度。
lld 与 GNU ld 的命令行兼容,因此它可以用作直接替换。但这并不一定意味着我们正在以与他们相同的方式实现 GNU 链接器的所有功能。一些功能对于现代类 Unix 系统来说不再重要,可以删除。一些其他功能可以通过比传统链接器更有效的方式实现。从头开始编写一个新的链接器是一个罕见的机会。我们利用这个机会来简化链接器,同时保持与现有链接器在正常使用时的兼容性。
新的 ELF 链接器是一个相对较小的程序,目前由大约 7000 行 C++ 代码组成。它基于与 lld 中的 PE/COFF(Windows)支持相同的架构,因此 PE/COFF 支持的设计文档直接适用于 ELF 支持。
旧的 ELF 支持仍然与新的 ELF 支持并存地存在于 lld 存储库中。请注意不要混淆两者。它们在顶层目录中被分离,并且不共享代码。你可以使用 ld.lld 命令运行新的链接器,或者在链接时将 -fuse-ld=lld 传递给 Clang。
我们仍在努力实现剩余的功能,例如改进的链接器脚本支持或对 x86_64 以外的架构的改进支持。如果你对新的链接器感兴趣,自己试试。