链接器如何解析动态可加载库中的重复符号?

raj*_*gt1 2 c linux linker build dynamic-linking

我有两个可动态加载的库lib_smtp.so和libpop.so等.它们都有一个名为的全局变量protocol,它分别被初始化为"SMTP"和"POP".我有另一个静态库libhttp.a,其中protocol初始化为"HTTP".

现在由于某种原因,我需要静态编译所有动态可链接和可加载库并包含在可执行文件中.这样做我在链接静态库时遇到错误" 符号的多重定义 ".

我很想知道链接器在动态链接期间如何解析重复的符号,其中所有三个提到的库都被链接了?

有没有什么方法可以静态地做链接器在动态链接中做的那样,即没有任何冲突将所有静态库添加到具有相同符号的可执行文件?如果没有,为什么静态链接库的过程不同.

Joh*_*ger 5

现代Linux和其他几种操作系统中的动态链接基于ELF二进制格式.可执行文件或其他共享库所依赖的(ELF)动态库具有优先级.要解析给定符号,动态链接器将按优先级顺序检查每个库,直到找到定义符号的库.

当多个动态对象定义相同的符号并且多个动态对象使用该符号时,这可能是冒险的.然后可能是在不同的动态对象中以不同方式解析符号的情况.

完整的细节超出了SO的范围,但我不知道比Ulrich Drepper的论文" 如何编写共享库 " 更好的技术解释.