bra*_*ady 7 linux linker symbols shared-libraries
我有一个共享库(bar.so)形式的插件,它链接到一个更大的程序(foo).foo和bar.so都依赖于相同的第三方库(baz),但是他们需要将baz的实现完全分开.所以当我链接foo(使用提供的目标文件和档案)时,我需要它忽略bar.so中的任何baz使用,反之亦然.
现在,如果我链接foo与--trace-symbol=baz_funbaz_fun是其中一个有问题的符号,我得到以下输出:
bar.so: definition of baz_fun
foo/src.a(baz.o): reference to baz_fun
Run Code Online (Sandbox Code Playgroud)
我相信这告诉我foo正在引用bar.so中的baz_fun(执行foo确认了这一点).
我试过的解决方案:
objcopy以"本地化"感兴趣的符号:objcopy --localize-symbols=local.syms bar.so其中local.syms包含所有感兴趣的符号.我想我可能只是在这里感到困惑,也许"本地"并不意味着我认为这意味着什么.无论如何,我从上面的链接获得相同的输出.我应该注意,如果我nm在bar上运行该工具,那么在使用objcopy所有符号之前,有一个T标志(大写表示全局),并且在objcopy他们有一个t指示它们现在是本地的之后.所以看来我使用objcopy得当.-fvisibility=hidden但是由于一些其他方面的限制,我需要使用GCC 3.3这似乎并不支持该功能.我可能能够升级到更新版本的GCC,但是希望确认使用此标志进行编译将有助于我走向这条道路.其他注意事项: