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

Dynamically loaded PIC shared library has runtime unresolved symbols from NPIC dependency

本文关键字:运行时 依赖 符号 NPIC 共享 PIC 加载 动态      更新时间:2023-10-16

这是我的情况

我有一个共享库(PIC(foo.so。它使用bar.a中的符号。bar.a是NPIC。因此无法添加到foo.So.的链接行

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

有人向我提出了2个解决方案1.编译bar.aPIC并将其添加到foo.so的链接行2.在main上使用"-Wl,--whole archive bar.a-rdynamic"。C链路

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

有没有其他的习惯用法/解决方案可以解决这个问题?

"1不可能,因为bar.a是第三方"。

这听起来不对。任何静态库都可以链接。就是这个成语。还可以看看这个答案和这个

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

带你去酒吧.a,用这句话做酒吧.so:

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

你可能还需要提供-nostdlib之类的东西

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

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