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

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

问题描述:

我有一个加载.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的符号放到可执行文件中,即使它们实际上不是在可执行文件中使用了

+1

将.so与.a链接是明显而正确的事情。 – 2011-05-26 08:23:00

+0

谢谢尼尔。我有三个需要与'.a'链接的'.so'插件当我将所有'.so'加载到我的可执行文件中时,我不会遇到符号冲突? – 2011-05-26 17:40:30

+1

不,您不会,否则您将无法在.sos中使用操作系统和其他标准功能。 – 2011-05-26 18:17:10

@nbt:

链接的.so.a是 明显的,正确的事情做。

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

当我dlopen的()中的。所以它抱怨未定义符号的BLAH_hello()

如果我包括在可执行代码BLAH_hello()伪呼叫,像BLAH_hello(NULL);.该符号包含在可执行文件中,并且当.so被加载时,它会找到该符号。

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

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

+0

谢谢,我会试试这个。 :) – 2011-07-26 16:58:11

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