动态加载的PIC共享库具有来自NPIC依赖性的运行时未解析符号

时间:2016-08-22 16:33:27

标签: c++ gcc

这是我的情况

我有一个共享库(PIC)foo.so.它使用bar.a中的符号。 bar.a是NPIC。所以不能添加到foo.so的链接行。

foo.so是从main.C动态加载的 它加载很好但在运行时使用bar.a中的符号时,它会以未解析的符号退出。

我已经建议了2个解决方案 1.编译bar.a PIC并将其添加到foo.so的链接行 2.在main.C链接行

上使用“-Wl, - whole-archive bar.a -rdynamic”

1是不可能的,因为bar.a是第三方库。 2是不可能的,因为我们不希望我们的符号被导出。

还有其他成语/解决方案可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

“1是不可能的,因为bar.a是第三方”。

这对我来说听起来不对。可以链接任何静态库。那要使用的习语。另请查看this answerthis one

答案 1 :(得分:0)

有一个古老的好习语。我称之为"libgcc.so idiom"因为它通常用于普通的libgcc构建,当你从libgcc.a创建libgcc_s.so时

带上bar.a并用这一行制作bar.so:

gcc -shared -o bar.so -Wl,--whole-archive bar.a -Wl,--no-whole-archive

您可能还需要提供类似-nostdlib左右的内容。

现在去和这个新的bar.so链接foo.so

现在,当加载foo.so时,动态链接器将解析所有依赖项。