在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时,我需要使用哪种魔术标记?
答案 0 :(得分:1)
您可以通过版本脚本在libbar中隐藏libfoo的符号:
$ cat libbar.map
{
global: libbar_*;
local: libfoo_*;
};
$ gcc ... -o libbar.so -Wl,--version-script=libbar.map