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/30080448/

相关文章:

javascript - 在功能级别自定义 dojo 构建

c - `getchar()` 给出与输入字符串相同的输出

c - sizeof (""+0) != sizeof(char *) 错误或未定义的行为?

c - 如何在 C 中使用 void 函数返回/保存值?

java - 根据后台进程启动进程

build - TFS 不可知的 MSBuild 脚本

c - 在 C 编程期间如何存储数据?

linux - 手动虚拟地址转换

c++ - 哪个串行设备连接到控制台(Linux)?

iphone - 添加 S7FTPRequest 后,iPhone 应用程序无法编译