【问题标题】:Significance of --start-group and --end-group linker flags for dynamic libraries--start-group 和 --end-group 链接器标志对动态库的意义
【发布时间】:2013-08-29 07:56:14
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c linker loader circular-dependency


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为最后一段是错误的/令人困惑的。我将阅读更多内容以消除混乱。 :)
    • @venkrao,我写的是静态而不是动态,也许这就是问题所在?
    • 是的。最后一段解释了现在的预期含义。谢谢。
    • 这是否意味着我们不必担心动态库的 --start-group 和 --end-group 使用?
    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 2015-03-16
    • 2016-06-28
    • 2011-08-04
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多