我有一个加载.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
的符号放入可执行文件中?
答案 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库都将包含所有符号。它增加了可执行文件的大小,但不需要链接到可执行文件的静态库。