这是我的情况
我有一个共享库(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是不可能的,因为我们不希望我们的符号被导出。
还有其他成语/解决方案可以解决这个问题吗?
答案 0 :(得分:0)
“1是不可能的,因为bar.a是第三方”。
这对我来说听起来不对。可以链接任何静态库。那是要使用的习语。另请查看this answer和this 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时,动态链接器将解析所有依赖项。