1

我有一个包含四个共享库的可执行文件,依赖关系树如下所示: Executable app does a dlopen of foo.soand bar.so. foo.so依次链接到fooHelper.sobar.so链接到barHelper.so

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

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

4

2 回答 2

3

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

是的:这RTLD_LOCAL就是(当dlopeningfoo.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.
于 2012-12-21T06:04:50.103 回答
0

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

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

于 2012-12-05T07:27:51.133 回答