【问题标题】:Undefined reference from shared library in static one来自静态共享库的未定义引用
【发布时间】:2015-11-15 10:45:14
【问题描述】:

例如,我有 3 个不同的实例:

  1. 具有未定义引用“get_object”和定义的共享库 “x”
  2. 具有定义“get_object”、“y”的静态库。
  3. 二进制文件带有未定义引用“x”和“y”的对象文件。

当我尝试将所有这些东西编译和链接在一起时,链接器可以解析所有这些符号是对的吗?

我担心的重点是符号“get_object”。 链接器能否解析共享库和静态库之间的此类引用?

【问题讨论】:

  • 3.是一个目标文件,而不是二进制可执行文件

标签: gcc linker


【解决方案1】:

静态库只是对象文件(它们的成员)的集合,可能带有ranlib(1) 生成的索引。

在 Linux 上,如果您将目标文件 (3) foo.o 与静态库 (2) libee.a 和共享库 (1) libyz.so 链接,并且如果您在 link 时间通过 -rdynamic (即gcc -rdynamic foo.o libee.a libyz.so -o myproggcc -rdynamic foo.o -lee -lyz -o myprog)然后dynamic linker 将在动态链接时解析get_object 名称(在ld-linux.so 中)

详细信息在ELF wikipage 和 Drepper 的论文中解释:How To Write Shared Libraries。另请阅读 Levine 的书:Linkers and loaders & ld(1) 手册页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-10
    • 2013-04-15
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    相关资源
    最近更新 更多