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

标签 c linux build linker dynamic-linking

我有两个动态可加载库 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/

相关文章:

linux - Apache2,将 blank.example.com 重定向到 example.com/blank/blank

linux - Docker 运行错误 : "Thin Pool has free data blocks which is less than minimum required"

build - 如何从 TeamCity 中的另一个项目构建项目?

windows - Delphi项目的自动化构建工具

c - io完成端口问题,每个GetQueuedCompletionStatus调用多个wsarecv或wsasend

php - 如何从 php 文件重新启动 linux

c - 多维数组不保存值

ios - 未找到 Restkit/Restkit.h 文件 Xcode 6.1

c - for循环在c中少扫描一次

c - 如何在 D 中创建可以与 C 代码接口(interface)的连续多维数组?