2

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

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

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

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

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

当我抱怨一个未定义的符号dlopen().soBLAH_hello()

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

我确信我也可以将 ' 链接到.so.a多个动态加载.so的 ' 使用BLAH_hello调用,因此将它放在可执行文件中是有意义的。如果我将库链接到每个.so.

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

4

3 回答 3

4

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

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

这是完全正常和预期的。这就是链接器与存档库一起工作的方式

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

于 2011-07-24T16:56:07.263 回答
1

@nbt:

.so将反对与反对联系起来.a是显而易见且正确的事情。

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

于 2011-05-27T15:16:23.630 回答
0

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

于 2014-06-28T18:00:22.563 回答