【问题标题】:Force mapping between symbols and shared libraries符号和共享库之间的强制映射
【发布时间】:2012-12-05 06:57:03
【问题描述】:

我有一个包含四个共享库的可执行文件,并且依赖关系树如下所示:可执行文件app 执行foo.sobar.sodlopenfoo.so 又链接到 fooHelper.sobar.so 链接到 barHelper.so

现在,问题是fooHelper.sobarHelper.so 有一些相同的符号。例如,假设我们有一个func,在fooHelper.sobarHelper.so 中有不同的实现。有没有办法强制foo.so 使用fooHelper.so 的实现和bar.so 使用barHelper.so 的?目前发生的情况是,根据帮助程序的链接顺序,func 的实现中只有一个被foo.sobar.so 使用。这是因为默认的 Unix 链接模型,如果符号的定义已经加载,那么随后加载的共享库中的任何其他定义都将被丢弃。基本上,func 将从首先链接的帮助程序库中获取。我需要一种方法来显式指定适当的映射,而无需更改共享库的源代码。

我正在使用 g++ 4.4 在 Linux 上工作。

【问题讨论】:

标签: linux shared-libraries dlopen


【解决方案1】:

有没有办法强制 foo.so 使用 fooHelper.so 的实现而 bar.so 使用 barHelper.so 的?

是的:这就是RTLD_LOCAL 的用途(当dlopening foo.sobar.so 时)。

RTLD_LOCAL
  This is the converse of RTLD_GLOBAL, and the default if neither flag
  is specified. Symbols defined in this library are not made available
  to resolve references in subsequently loaded libraries.

【讨论】:

    【解决方案2】:

    如果两个 func 碰巧在同一个命名空间中,那么您会遇到一些麻烦 - 如果您使用 C 进行编程。要查找的术语是“函数重载”。以前有关于这个话题的讨论,例如这个: function overloading in C

    编辑:http://litdream.blogspot.de/2007/03/dynamic-loading-using-dlopen-api-in-c.html

    【讨论】:

    • 啊,应该明确表示,我正在使用 C++。不过不要认为重载是相关的,funcfooHelper.sobarHelper.so 中具有相同的签名。我将编辑问题以明确这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多