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

我有一个连接到更大程序(foo)的共享库(bar.so)形式的插件。 foo和bar.so都依赖于相同的第三方库(baz),但他们需要将baz的实现完全分开。 所以当我链接foo(使用提供的对象文件和档案)时,我需要它忽略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的执行证实了这一点)。

我尝试过的解决方案:

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

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

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

    (编辑)

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

    链接地址: http://www.djcxy.com/p/7369.html

    上一篇: How to restrict access to symbols in shared object?

    下一篇: pivotX and PivotY on ScaleAnimation has no effect