假设我有一个动态库(.so)。
如果我使用--start-group
--end-group
链接到它会发生什么?
它是否被视为存档,以便所有必要的符号都“物理地”包含在我的输出库中?
或者它是否仍被视为动态库(相当于使用-l
选项)?
阅读documentation可能会认为它会被视为存档,但事实上它也被视为it is not possible to statically link to a shared library。
答案 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的链接器。