我有两个动态可加载库 lib_smtp.so 和 libpop.so 等。两者都有一个名为 protocol
的全局变量,分别初始化为“SMTP”和“POP”。我有另一个静态库 libhttp.a,其中 protocol
初始化为“HTTP”。
现在由于某种原因,我需要静态编译所有动态可链接和可加载库并包含在可执行文件中。这样做我在链接静态库期间收到错误“符号的多重定义”。
我很想知道链接器如何在动态链接期间解析所有三个提到的库都链接的重复符号?
是否有某种方法可以静态地执行与链接器在动态链接中所做的相同的操作,即没有任何冲突将所有静态库添加到具有相同符号的可执行文件?如果不是,为什么静态链接库的过程不同。
最佳答案
现代 Linux 和其他几个操作系统中的动态链接基于 ELF 二进制格式。优先考虑可执行文件或其他共享库所依赖的 (ELF) 动态库。为了解析给定的符号,动态链接器按优先级顺序检查每个库,直到找到定义该符号的库。
当多个动态对象定义相同的符号并且多个动态对象使用该符号时,这可能会很危险。可能会出现符号在不同动态对象中的解析方式不同的情况。
完整的细节超出了 SO 的范围,但我不知道比 Ulrich Drepper 的论文“How to Write Shared Libraries”中的更好的技术解释。
关于c - 链接器如何解决动态可加载库中的重复符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47564674/