我有一个带有四个共享库的可执行文件,依赖树看起来像这样:可执行文件 app 执行foo.so
和bar.so
的 dlopen 。 foo.so
依次链接到fooHelper.so
的{{1}}和bar.so
个链接。
现在,问题是barHelper.so
和fooHelper.so
有一些相同的符号。例如,假设我们在barHelper.so
和func
中有fooHelper.so
个不同的实现。有没有办法强制barHelper.so
使用foo.so
的实现,fooHelper.so
使用bar.so
?目前发生的情况是,根据帮助者的链接顺序,barHelper.so
和func
仅使用foo.so
的一个实现。这是因为默认的Unix链接模型,如果已经加载了符号的定义,那么随后加载的共享库中的任何其他定义都将被丢弃。基本上,bar.so
将从首先链接的帮助库中获取。我需要一种方法来显式指定适当的映射,而无需更改共享库的源代码。
我正在使用g ++ 4.4开发Linux。
答案 0 :(得分:3)
有没有办法强制foo.so使用fooHelper.so的实现和bar.so来使用barHelper.so?
是:这是RTLD_LOCAL
的用途(当dlopen
foo.so
和bar.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