如何限制访问共享对象中的符号?

我有一个共享库(bar.so)forms的插件,链接到一个更大的程序(foo)。 foo和bar.so都依赖于相同的第三方库(baz),但是他们需要保持baz的实现完全分开。 所以当我链接富(使用提供的对象文件和档案),我需要它忽略bar.so中任何使用baz,反之亦然。

现在,如果我将foo与--trace-symbol=baz_fun链接,其中baz_fun是有问题的符号之一,我将得到以下输出:

 bar.so: definition of baz_fun foo/src.a(baz.o): reference to baz_fun 

我相信这是告诉我,foo是从bar.so引用baz_fun(并执行foo证实了这一点)。

我已经尝试的解决scheme:

  • 使用objcopy “本地化”感兴趣的符号: objcopy --localize-symbols=local.syms bar.so其中local.syms包含所有感兴趣的符号。 我想我可能只是在这里混淆,也许“本地”并不意味着我的意思。 无论如何,我从上面的链接获得相同的输出。 我应该注意的是,如果我在bar.so上运行nm工具,那么在使用objcopy之前,所有有问题的符号都有T标志(大写字母表示全局), objcopy之后它们有一个t表示它们是本地的。 所以看来我正确使用objcopy
  • 使用-fvisibility=hidden编译但是由于其他的限制,我需要使用GCC 3.3,它似乎不支持该function。 我可能可以升级到GCC的较新版本,但希望确认使用此标志进行编译将有助于我走向这条路。

其他要注意的事项:

  • 我没有访问foo或baz的源代码
  • 我宁愿将我的所有插件保存在一个共享对象(bar.so)中。 巴兹实际上是一个许可证库,所以我不希望它分开

使用dlopenRTLD_DEEPBIND标志加载你的插件。

(编辑)

请注意,RTLD_DEEPBIND是Linux特有的,需要glibc 2.3.4或更高版本。