强制在符号和共享库之间进行映射

时间:2012-12-05 06:57:03

标签: linux shared-libraries dlopen

我有一个带有四个共享库的可执行文件,依赖树看起来像这样:可执行文件 app 执行foo.sobar.so dlopen foo.so依次链接到fooHelper.so的{​​{1}}和bar.so个链接。

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

我正在使用g ++ 4.4开发Linux。

2 个答案:

答案 0 :(得分:3)

  

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

是:这是RTLD_LOCAL的用途(当dlopen 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.

答案 1 :(得分:0)

如果两个func恰好位于相同的名称空间中,那么你会遇到一些麻烦 - 如果你是用C编程的话。要查找的术语是“函数重载”。之前有关于该主题的讨论,例如这个: function overloading in C

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