在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时,我需要使用哪种魔术标记?

最佳答案

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

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

08-26 20:28