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

linux – 如何限制对共享对象中符号的访问?,第1张

概述我有一个共享库(bar.so)形式的插件,它链接到一个更大的程序(foo). foo和bar.so都依赖于相同的第三方库(baz),但是他们需要将baz的实现完全分开.因此,当我链接foo(使用提供的目标文件和档案)时,我需要它忽略bar.so中的任何baz使用,反之亦然. 现在如果我用–trace-symbol = baz_fun链接foo,其中baz_fun是一个有问题的符号,我得到以下输出: 我有一个共享库(bar.so)形式的插件,它链接到一个更大的程序(foo). foo和bar.so都依赖于相同的第三方库(baz),但是他们需要将baz的实现完全分开.因此,当我链接foo(使用提供的目标文件和档案)时,我需要它忽略bar.so中的任何baz使用,反之亦然.

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

bar.so: deFinition of baz_funfoo/src.a(baz.o): reference to baz_fun

我相信这告诉我foo正在引用bar.so中的baz_fun(执行foo确认了这一点).

我尝试过的解决方案:

>使用objcopy“本地化”感兴趣的符号:objcopy –localize-symbols = local.syms bar.so其中local.syms包含所有感兴趣的符号.我想我可能只是在这里感到困惑,也许“本地”并不意味着我认为这意味着什么.无论如何,我从上面的链接获得相同的输出.我应该注意,如果我在使用objcopy之前在bar.so上运行nm工具,则所有符号都具有T标志(大写表示全局),并且在objcopy之后它们具有t表示它们现在是本地的.所以看来我正在使用objcopy.
>使用-fvisibility = hIDden进行编译但是由于某些其他约束,我需要使用GCC 3.3,它似乎不支持该功能.我可能能够升级到更新版本的GCC,但是希望确认使用此标志进行编译将有助于我走向那条道路.

其他注意事项:

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

解决方法 使用dlopen加载带有RTLD_DEEPBIND标志的插件.

(编辑)

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

总结

以上是内存溢出为你收集整理的linux – 如何限制对共享对象中符号的访问?全部内容,希望文章能够帮你解决linux – 如何限制对共享对象中符号的访问?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1047526.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存