【问题标题】:What is the effect of --start-group --end-group for dynamic libraries?--start-group --end-group 对动态库有什么作用?
【发布时间】:2016-09-27 17:15:49
【问题描述】:

假设我有一个动态库 (.so)。 如果我使用 --start-group --end-group 链接到它会发生什么?
是否将其视为存档,以便所有必要的符号都“物理地”包含在我的输出库中?
还是仍将其视为动态库(相当于使用 -l 选项)?

看了documentation,可能会以为是存档,其实也有说it is not possible to statically link to a shared library。

【问题讨论】:

  • 您引用的文档以“archives 应该是归档文件列表”开头,其中“archives”指定--start-group 和--end-group 之间的参数。从这个意义上说,共享库或对应于一个的-l 参数不是存档文件。文档没有说如此指定的文件将被视为存档文件;他们说您有责任在此处指定(仅)存档文件。
  • @JohnBollinger 如果有一个动态库会发生什么,这仍然是未知数。
  • 是的,因为该案例没有记录或预期的行为,所以没有可靠的答案,除了可能“试试看”。但是,在任何情况下都不能将共享库有效地视为存档文件。

标签: c gcc linker static-linking dynamic-linking


【解决方案1】:

-group 选项仅影响链接器将在哪些库/存档(以及多少次)中查找符号以满足未解析的引用。对于动态库,没有与 --whole-archive 等效的东西,例如.so 对象。您可以做的是在引用库之前指定 --no-as-needed,这将强制将其添加到动态链接器所需的 DSO 列表中(请参阅下面的使用此技术的示例)。

为了解释这些是的用途,延续链接器传统,其中排序链接器标志是最重要的,--start-group 和--end-group 选项建立了对象和库的有限范围将按出现的顺序重复扫描,直到它们都没有提供任何进一步的符号(或未解析的引用,这将需要进一步扫描)。

它通常用于链接具有复杂相互依赖关系和/或循环引用的对象。另一种方法是多次指定每个对象/lib,就像 GCC 在此 *nix 系统上链接到 libgcc 时所做的那样:

-lgcc --as-needed -lgcc_s --no-as-needed -lc 
   -lgcc --as-needed -lgcc_s --no-as-needed crtend.o crtn.o 

(-lgcc_s 指的是共享库 GCC 支持例程,例如,libgcc_s.so.1,libc (-lc) 和 libgcc(-lgcc, 一个静态库) 依赖于它;这会创建一个需要另一个包含的循环of -lgcc_s) 来解析每个对象带来的新的未解析的引用。

请注意,GNU LD (-fuse-ld=bfd) 可以处理嵌套组,而 GNU Gold (-fuse-ld=gold) 不能。不确定 LLVM 的链接器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2011-10-26
    • 2016-06-28
    • 2015-03-16
    • 2020-07-21
    • 2019-02-25
    • 2016-03-18
    • 2021-12-23
    相关资源
    最近更新 更多