如何将静态库嵌入共享库?

时间:2019-05-20 15:04:36

标签: linux linker static-linking dynamic-linking undefined-symbol

在linux上,我试图创建一个共享库libbar.so,该库嵌入了一个商业静态库(许可就可以了)。商业库具有4个版本:libfoo-seq.a,libfoo-mt.a,libfoo-seq.so和libfoo-mt.so(它们都提供相同的符号,只是代码是顺序/多线程的,并且该库是静态/共享的)。在这四个文件中,我希望我的代码始终使用顺序的foo库,因此在创建libbar.so时,我将目标文件和libfoo-seq.a链接在一起。

问题是我的库用户可能在他们拉进我的libbar.so时已经​​拉进了libfoo-mt.so,因此,在读入libbar.so时,libfoo中的所有符号都已经存在,因此我对foo中函数的调用被解析为多线程版本。

我想知道如何解决此问题?在编译以创建目标文件以及将目标文件与libfoo-seq.a链接以创建libbar.so时,我需要使用哪种魔术标记?

1 个答案:

答案 0 :(得分:1)

您可以通过版本脚本在libbar中隐藏libfoo的符号:

$ cat libbar.map
{
  global: libbar_*;
  local: libfoo_*;
};
$ gcc ... -o libbar.so -Wl,--version-script=libbar.map