动态加载:共享静态库中的未定义符号
我有一个加载.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
的符号放到可执行文件中,即使它们实际上不是在可执行文件中使用了?
@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
添加到可执行文件链接行。
谢谢,我会试试这个。 :) – 2011-07-26 16:58:11
如上所述,链接器丢弃没有引用符号的.o文件。这是问题,当可执行文件需要dlopen()外部共享库。在这种情况下,当链接可执行文件时,可以使用链接器选项' - 整个存档'和' - 无整个存档'。全部。这些选项之间的库将包含所有符号。它增加了可执行文件的大小,但是不需要链接到可执行文件的静态库。
将.so与.a链接是明显而正确的事情。 – 2011-05-26 08:23:00
谢谢尼尔。我有三个需要与'.a'链接的'.so'插件当我将所有'.so'加载到我的可执行文件中时,我不会遇到符号冲突? – 2011-05-26 17:40:30
不,您不会,否则您将无法在.sos中使用操作系统和其他标准功能。 – 2011-05-26 18:17:10