gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:38:14 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com