3

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

我想知道这些选项对于动态链接库的意义。

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

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

老实说,我对此的了解还不够多,但我认为可以在这里问。

4

1 回答 1

6

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

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

使用动态库,两个订单都可以工作。假设liba.so导出alibb.so需要它。如果liba.so先加载,然后libb.so加载时,它将使用它。如果libb.so是先加载,那么a会暂时不解决,直到liba.so加载。无论哪种方式,它都有效。

于 2013-08-29T08:34:00.443 回答