动态加载:共享静态库中的未定义符号

时间:2011-05-26 08:18:40

标签: dynamic-linking dynamic-loading

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

可执行文件与-rdynamic链接,因此可以进行符号回调。

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

中有一个名为.a的函数

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

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

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

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

我确信我也可以将.so.a相关联,但多个动态加载的.so使用BLAH_hello调用,这样才有意义在可执行文件中。如果我将库链接到每个.so,我也会担心符号冲突。

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

3 个答案:

答案 0 :(得分:4)

  

当我dlopen()时,它会向BLAH_hello()抱怨未定义的符号

     

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

这是完全正常和预期的。它只是how linkers work with archive libraries

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

答案 1 :(得分:1)

@nbt:

  

.so.a相关联是显而易见的事情   做。

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

答案 2 :(得分:0)

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