【问题标题】:how does ld deal with code that is supplied twice (in a source file and in a library)?ld 如何处理提供两次的代码(在源文件和库中)?
【发布时间】:2016-04-16 17:33:49
【问题描述】:
假设我们调用
gcc -Dmyflag -lmylib mycode.c
其中mylib 包含所有mycode,但编译时没有-Dmyflag。因此,mycode 中实现的所有功能和其他实体都可以在加载器的两个版本中使用。根据经验,我发现使用了来自mycode 的版本。我可以依靠吗? mycode 总是会覆盖 mylib 吗?
【问题讨论】:
标签:
gcc
g++
shared-libraries
ld
linkage
【解决方案1】:
根据经验,我发现使用了 mycode 中的版本。
阅读this explanation,了解链接器如何与存档库一起工作,可能还阅读this one。
我可以依赖它吗?
您应该依靠理解这是如何工作的。
如果您了解引用链接中的材料,您会发现将main 添加到libmylib.a 将反转答案(如果mycode.c 还包含main,您将收到重复符号定义错误)。
如果你用的是动态库libmylib.so,规则不一样,库总是会输给主二进制,虽然有很多并发症,比如LD_PRELOAD,把库和-Bsymbolic链接,和其他人。
简而言之,您应该更愿意不这样做。