【问题标题】:Dynamic Loading: Undefined Symbol In Shared Static Library动态加载:共享静态库中的未定义符号
【发布时间】:2011-05-26 08:18:39
【问题描述】:

我有一个加载 .so 插件的可执行文件。

可执行文件与-rdynamic 链接,以便可以发生符号回调。

我有一个包含在可执行文件中的静态库。这在.a 中有一个名为BLAH_hello() 的函数

静态库未在可执行文件中使用。即在可执行代码中没有对BLAH_hello() 的调用。

但是,.so 确实可以调用 BLAH_hello()

当我dlopen() .so 它向BLAH_hello() 抱怨一个未定义的符号

如果我在可执行代码中包含了对BLAH_hello() 的虚拟调用,例如BLAH_hello(NULL);。该符号包含在可执行文件中,当加载 .so 时,它会找到该符号。

我确定我也可以将.so.a 链接起来,但是多个动态加载的.so 使用BLAH_hello 调用,因此将它放在可执行文件中是有意义的。如果我将库链接到每个.so,我也会担心符号冲突。

所以我想知道的是,如何将.a 的符号放入可执行文件中,即使它们实际上并没有在可执行文件中使用

【问题讨论】:

  • 将 .so 与 .a 链接起来是显而易见且正确的做法。
  • 谢谢尼尔。我有三个.so 插件需要链接到.a 当我将所有.so 加载到我的可执行文件中时我不会有符号冲突?
  • 不,你不会,否则你将无法在.sos中使用操作系统和其他标准功能。
  • 好点,谢谢尼尔。

标签: dynamic-linking dynamic-loading


【解决方案1】:

当我对 .so 进行 dlopen() 时,它会向 BLAH_hello() 抱怨未定义的符号

如果我在可执行代码中包含对 BLAH_hello() 的虚拟调用,例如 BLAH_hello(NULL);。该符号包含在可执行文件中,当加载 .so 时,它会找到该符号。

这是完全正常和意料之中的。只是how linkers work with archive libraries

如果您必须在主可执行文件中包含BLAH_hello,请将-Wl,-u,BLAH_hello 添加到可执行文件链接行。

【讨论】:

  • 谢谢,我会试试这个。 :)
  • 是否可以从源代码中做同样的事情? (例如:__attribute__((something))
【解决方案2】:

@nbt:

.so.a 联系起来是显而易见且正确的事情 做。

在将.so 加载到可执行文件中时,这不应产生符号冲突。

【讨论】:

    【解决方案3】:

    如上所述,链接器会丢弃没有引用符号的 .o 文件。这是问题,当可执行文件需要 dlopen() 外部共享库时。在这种情况下,链接可执行文件时可以使用链接器选项“--whole-archive”和“--no-whole-archive”。这些选项之间的所有 .a 库都将包含所有符号。它增加了可执行文件的大小,但不需要链接到可执行文件的静态库。

    【讨论】:

      猜你喜欢
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多