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

时间:2013-08-29 07:56:14

标签: c linker loader circular-dependency

我们进行了一项练习,除非绝对必要,否则停止使用--start-group和--end-group进行静态链接。我们无条件地使用了这个,无论所讨论的静态库是否具有循环依赖性。 我理解在我们取出无条件的--start-group和--end-group之后,链接器的压力较小,但只将它放在真正需要的地方。

我想知道这些选项对动态链接库的重要性。

ld.so运行时加载程序如何解决动态库的循环依赖关系(如果有的话)?

这提出了另一个问题,我们真的应该担心动态库的--start-group和--end-group用法吗?

说实话,我还没有读到这个,但我觉得可以在这里问一下。

1 个答案:

答案 0 :(得分:5)

动态库与静态库不同,即使它们没有提供有用的符号也会被加载。这使得订单的相关性降低了。

对于静态库,错误的顺序可能会导致所需的库或.a文件中的对象不被采用,即使以后需要它们也是如此。这是--start-group--end-group解决的问题。

使用动态库,两个订单都有效。假设liba.so导出alibb.so需要它。如果先加载liba.so,那么加载libb.so时,它会使用它。如果先加载libb.so,则a将暂停一段时间,直到加载liba.so为止。无论哪种方式,它都有效。