什么是黄金链接器?

什么是黄金链接器?

有人用过gold链接器吗?要链接一个相当大的项目,我必须使用它而不是 GNU ld,后者会抛出一些错误并且无法链接。

链接器如何gold能够链接ld失败的大型项目?是否存在某种内存欺骗?

答案1

gold链接器被设计为 ELF 特定链接器,旨在生成比 BFD ld(“传统”GNU binutils 链接器)更易于维护且更快的链接器。作为副作用,它确实能够使用比 BFD 更少的内存来链接非常大的程序ld,大概是因为需要处理的抽象层更少,并且因为链接器的数据结构更直接地映射到 ELF 格式。

我不确定有多少文档专门解决了两个链接器之间的设计差异及其对内存使用的影响。有一个非常有趣的有关链接器的系列文章作者:Ian Lance Taylor,各种 GNU 链接器的作者,解释了导致gold.他

我现在正在使用的链接器称为 gold,将是我的第三个链接器。它只是一个 ELF 链接器。再次强调,目标是速度,在本例中比我的第二个链接器更快。多年来,通过添加对 ELF 和共享库的支持,该链接器的速度已显着减慢。这种支持是修补的,而不是设计出来的。

(第二个链接器是 BFD ld。)

答案2

编写 gold linker 是为了使链接过程更快。根据 gold 作者的说法伊恩·兰斯·泰勒

目前,与现有链接器相比,黄金只有一个显着优势:速度更快。在大型 C++ 程序上,我测得它的运行速度快了五倍。

他正在将黄金链接器的性能与传统的 GNU 链接器进行比较。 gold(与 GNU 链接器不同)不使用 BFD 库来处理目标文件。

gold 的局限性在于(与可以处理多种目标文件类型的 GNU 链接器不同)它只能链接 ELF 格式的目标文件。

关于您在使用 GNU 链接器时遇到的问题,这里有一个有趣的答案SO类似的问题来自迈克尔·亚当:

黄金链接器甚至在我们的代码中发现了一些依赖性问题,因为它在某些细节方面似乎比经典链接器更正确。请参阅此 Samba 提交。

答案3

goldld基准比较

我在以下网址发布了 LD 与黄金的具体综合基准:https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience/53921263#53921263

结果总结:gold 的速度比 ld 快 2 到 3 倍。

对于模板和代码生成失控的复杂 C++ 项目来说,这种时间增益可能会带来巨大的游戏规则改变,因为链接步骤涉及项目中的所有文件,并且与编译不同,它必须始终完成,即使您更改了只是一个 .cpp 文件。

因此,缓慢的链接时间使开发周期变得难以忍受,这可能是谷歌投入资源的主要原因。试想一下,每次微小的文件更改等待 10 秒而不是 30 秒会带来多大的好处。

综合基准​​的时间收益也与我在复杂的现实世界项目(gem5)上获得的实际收益一致,正如该答案中也提到的那样。

答案4

现代 GNU/Linux 系统上提供了三个链接器:

  • LD,由 GNU binutils 维护,
  • 金子,由 GNU binutils 维护,“仍在 beta 测试中”,
  • LLD,作为 LLVM 项目的一部分开发。

有关速度基准,请参阅:https://www.phoronix.com/scan.php?page=article&item=lld4-linux-tests&num=2TL、DR:lld最快,其次是gold,其次是ld

一些消息人士称,黄金项目已停滞的,Fedora 中的包结构反映了这一点。

相关内容