动态库中 --start-group 和 --end-group 链接器标志的重要性

3
我们进行了一项任务,即停止无条件使用--start-group和--end-group进行静态链接,除非绝对必要。在此之前,我们无论这些静态库是否存在循环依赖,都会无条件地使用它们。
我知道,在我们删除了无条件的--start-group和--end-group之后,链接器减少了压力,只有在真正需要时才使用这些选项。
我想了解这些选项对于动态链接库的重要性。
如果动态链接库存在循环依赖关系,ld.so运行时加载器是如何解决这些问题的?
这引出了另一个问题,我们是否应该真的担心在动态链接库中使用--start-group和--end-group?
老实说,我还没有读足够多的资料,但我认为在这里提问是可以的。
1个回答

6
动态库与静态库不同,即使它们没有提供有用的符号,也会被加载。这使得顺序变得不那么重要。
对于静态库,错误的顺序可能导致所需的库或对象未被采用,即使它们稍后需要。这就是“--start-group”和“--end-group”的解决方法。
对于动态库,两个顺序都可以工作。假设“liba.so”导出“a”,而“libb.so”需要它。如果首先加载“liba.so”,那么当加载“libb.so”时,它将使用它。如果首先加载“libb.so”,则“a”将在一段时间内无法解析,直到加载“liba.so”。无论哪种方式,它都可以工作。

1
我认为最后一段文字有错误/令人困惑。我会继续阅读以消除疑惑。 :) - venkrao
@venkrao,我写成了静态而不是动态,也许这就是问题所在? - ugoren
是的。最后一段解释了现在的意思。谢谢。 - venkrao
这是否意味着我们在使用动态库时不需要担心--start-group和--end-group的使用? - hukeping

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接