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

| 我有一个可执行that0ѭ插件的可执行文件。 该可执行文件与“ 1”链接,因此可以发生符号回调。 我有一个包含在可执行文件中的静态库。它在
.a
中具有称为
BLAH_hello()
的功能 可执行文件中未使用静态库。也就是说,在可执行代码中没有对“ 2”的调用。 但是,
.so
确实有对calls2ѭ的调用。 当我将
.so
7时,它抱怨to2的符号未定义 如果我在可执行代码中包括对
BLAH_hello()
的虚拟调用,例如
BLAH_hello(NULL);
。该符号包含在可执行文件中,并在装入“ 0”时找到该符号。 我确定我也可以将ѭ0与ѭ3链接起来,但是多个动态加载的ѭ0都使用
BLAH_hello
调用,因此在可执行文件中使用它是有意义的。如果我将库链接到每个ѭ0中,我也担心符号冲突。 因此,我想知道的是,即使在可执行文件中未实际使用
.a
的符号,该如何将它们放入可执行文件中呢?     
已邀请:
  当我dlopen().so时,它向BLAH_hello()抱怨未定义符号      如果我在可执行代码中包括对BLAH_hello()的虚拟调用,例如BLAH_hello(NULL);。该符号包含在可执行文件中,并且在加载.so时会找到该符号。 这是完全正常的并且是预期的。这就是链接器与存档库一起工作的方式。 如果必须在主可执行文件中包含“ 16”,请在可执行链接行中添加“ 20”。     
@nbt:   将ѭ0和ѭ3链接起来是显而易见的正确选择   做。 将“ 0”加载到可执行文件时,这不应产生符号冲突。     
如上所述,链接器丢弃没有参考符号的.o文件。当可执行文件需要dlopen()外部共享库时,这就是问题。在这种情况下,链接可执行文件时,可以使用链接器选项\'-whole-archive \'和\'-no-whole-archive \'。这些选项之间的所有.a库都将包含所有符号。它增加了可执行文件的大小,但无需链接到可执行文件的静态库。     

要回复问题请先登录注册