C 动态库的--start group--end group的效果是什么?

C 动态库的--start group--end group的效果是什么?,c,gcc,linker,static-linking,dynamic-linking,C,Gcc,Linker,Static Linking,Dynamic Linking,假设我有一个动态库(.so)。 如果我使用链接到它会发生什么? 它是否被视为存档,以便所有必需的符号都“物理地”包含在我的输出库中?还是仍被视为动态库(相当于使用-l选项) 阅读可能会认为它将被视为存档,但事实上也有这样的说法。组选项只影响链接器将在哪些库/存档(以及多少次)中查找符号以满足未解析的引用。对于动态libs,例如。所以对象,没有与--整个归档等价的东西。您可以做的是在引用库之前指定--no-as-needed,这将强制将库添加到动态链接器所需DSO的列表中(请参见下面使用此技术的示

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


阅读可能会认为它将被视为存档,但事实上也有这样的说法。

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

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

它通常用于链接具有复杂相互依赖关系和/或循环引用的对象。另一种方法是可能多次指定每个对象/库,就像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_
指的是共享库GCC支持例程,例如,
libgcc_.so.1
,libc(
-lc
)和libgcc(
-lgcc
,一个静态库)依赖于该例程;这会创建一个循环,需要另一个-lgcc_)来解析每个对象带来的新的未解析引用


请注意,gnuld(
-fuseld=bfd
)可以处理嵌套组,而gnugold(
-fuseld=Gold
)不能。不确定LLVM的链接器。

您引用的文档以“归档文件应该是归档文件的列表”开头,其中“归档文件”指定
--开始组
--结束组
之间的参数。从这个意义上讲,共享库或与之对应的
-l
参数不是存档文件。文件没有说明指定的文件将被视为归档文件;他们说,您有责任指定(仅)归档文件。@JohnBollinger如果有人放置动态库,将会发生什么情况尚不得而知。是的,因为这种情况下没有记录或预期的行为,因此没有可靠的答案,除了可能的“试用并查看”之外。然而,在任何情况下,共享库都不能有效地作为归档文件处理。