【问题标题】: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链接,和其他人。

    简而言之,您应该更愿意这样做。

    【讨论】:

      猜你喜欢
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 2011-08-01
      相关资源
      最近更新 更多