--start-group --end-group对动态库有什么影响?

时间:2016-09-27 17:15:50

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

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

阅读documentation可能会认为它会被视为存档,但事实上它也被视为it is not possible to statically link to a shared library

1 个答案:

答案 0 :(得分:1)

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

为解释这些的用途,并继续使用链接器标记极为重要的链接器传统,--start-group--end-group选项建立了有界范围将按外观顺序反复扫描的对象和库,直到它们都不贡献任何其他符号(或未解析的引用,这将需要进一步扫描)。

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

-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是静态lib)所依赖;这会创建一个循环,要求另外包含-lgcc_s)来解析每个对象带来的新的未解析的引用。

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