gold 和标准 (bfd) 链接器的库选择规则有何不同?

How do the library selection rules differ between gold and the standard (bfd) linker?

我知道标准 ld.bfd 按照指定的顺序处理静态库,从每个库中提取满足未满足(在那个时间点)依赖项的任何对象。黄金是否遵循相同的过程,这在任何地方都有记录吗?

我看到 gold 比 ld.bfd 多引入一个 *.so 文件的情况(我使用的是 --as-needed 选项),我试图找出原因和,总的来说,我还应该注意哪些其他差异。

选择存档库成员的规则在两个 link 之间几乎相同,但与确定共享库是否为 "needed" 的规则无关。

对于带有符号索引的存档库(即,ranlib 已经是 运行),linker 依次考虑索引中的每个符号。如果该符号在 link 中的那个点满足未解析的引用,则 linker 将包含定义该符号的存档成员。它重复传递符号索引,直到没有新的存档成员被添加。

当涉及到弱符号和普通符号时,规则变得有点复杂,黄金和 BFD ld 在处理普通符号方面略有不同(目前 -- 参见 PR 23411)。

现在通常不支持没有符号索引的存档库。过去,link 用户会单次通过库,如果它满足未解析的引用,则添加一个存档成员。这需要对库进行拓扑排序(许多 Unix 系统仍然有一个 "lorder" 工具来执行此操作)。

对于受 --as-needed 选项影响的共享库,如果它满足来自常规目标文件的非弱引用,我们认为该库是 "needed"。 Gold 标记共享库 "needed",即使引用来自按 link 顺序跟随它的对象;我认为 BFD ld 标记它"needed" 仅当引用在共享库之前。

如果您想弄清楚 link 人认为某个特定库是否 "needed" 的确切原因,您可能会发现 link 人的 -y symbol选项有用。