如何限制对共享对象中符号的访问?
我有一个连接到更大程序(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的较新版本,但希望确认使用此标志进行编译将有助于我在前往该道路之前。 其他要注意的事项:
使用dlopen
以RTLD_DEEPBIND
标志加载你的插件。
(编辑)
请注意,RTLD_DEEPBIND是Linux专用的,需要glibc 2.3.4或更高版本。
链接地址: http://www.djcxy.com/p/7369.html