我知道标准ld.bfd按照指定的顺序处理静态库,从每个库中提取满足未满足(在该时间点)依赖关系的对象。黄金是否遵循相同的过程,并且在任何地方都有记录吗?
我看到一种情况,黄金比ld.bfd多输入一个* .so文件(我使用的是--as-need选项),并试图找出原因,通常,还有什么其他需要注意的地方。
答案 0 :(得分:1)
两个链接器之间选择存档库成员的规则几乎相同,但是与确定是否需要共享库的规则无关。
对于具有符号索引(即,已运行ranlib
的存档库),链接器依次考虑索引中的每个符号。如果符号在链接中的该点处满足未解析的引用,则链接器将包括定义该符号的存档成员。它会重复遍历符号索引,直到没有添加新的存档成员为止。
当涉及弱符号和普通符号时,规则变得有些复杂,并且Gold和BFD ld在对普通符号的处理上略有不同(目前,请参见PR 23411)。
如今,通常不支持没有符号索引的归档库。过去,链接程序会单遍库,如果满足未解决的引用,则会添加一个存档成员。这需要对库进行拓扑排序(并且许多Unix系统仍然具有“ lorder”工具来执行此操作)。
对于受--as-needed
选项影响的共享库,如果它满足常规对象文件中的非弱引用,则认为该库是“需要的”。即使引用来自链接顺序位于其后的对象,Gold也会标记“需要”共享库;我认为仅当引用在共享库之前,BFD ld才将其标记为“需要”。
如果您试图弄清楚链接器认为“需要”特定库的原因,您可能会发现链接器的-y symbol
选项很有用。