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

时间:2011-05-31 23:01:16

标签: linux linker shared-libraries symbols

我有一个共享库(bar.so)形式的插件,它链接到一个更大的程序(foo)。 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标志(大写表示全局)和{ {1}}他们有objcopy表示他们现在是本地人。所以看来我正在使用t
  • 使用objcopy进行编译但是由于某些其他限制,我需要使用GCC 3.3,它似乎不支持该功能。我可能能够升级到更新版本的GCC,但是希望确认使用此标志进行编译将有助于我走上这条道路。

其他注意事项:

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

1 个答案:

答案 0 :(得分:4)

使用dlopen加载带有RTLD_DEEPBIND标记的插件。

(编辑)

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

相关问题