0

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

我看到一个案例,其中黄金比 ld.bfd 多引入一个 *.so 文件(我正在使用 --as-needed 选项),并试图找出原因以及一般情况下还有哪些其他差异我应该留意一下。

4

1 回答 1

1

选择存档库成员的规则在两个链接器之间几乎相同,但与确定是否“需要”共享库的规则无关。

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

当涉及到弱符号和常见符号时,规则会变得有点复杂,而 gold 和 BFD ld 在对常见符号的处理上略有不同(目前 - 参见PR 23411)。

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

对于受--as-needed选项影响的共享库,如果该库满足来自常规目标文件的非弱引用,我们认为该库是“需要的”。Gold 将共享库标记为“需要”,即使引用来自链接顺序中跟随它的对象;我认为BFD ld 仅当引用位于共享库之前时才将其标记为“需要”。

如果你想弄清楚为什么链接器认为某个特定的库是“需要的”,你可能会发现链接器的-y symbol选项很有用。

于 2018-07-14T17:20:42.463 回答