使用两个共享库dlopen,导出符号

我有一个linux共享库foo.so,它使用dlopen("foo.so", RTLD_NOW | RTLD_LOCAL)从可执行文件加载。 从foo.so开始,我想将另一个库bar.so放到另一个库中,它引用了foo.so中定义的符号,但链接程序未能找到它们。 我无法将RTLD_LOCAL更改为RTLD_GLOBAL,因为我没有执行加载的可执行文件的源代码。 我想-Wl,--export-dynamic链接foo.so时的-Wl,--export-dynamic可能会有所帮助,但它不会覆盖dlopen的本地标志。 GCC的新属性可见性功能看起来并不像它提供的答案。

有没有一种方法可以指示链接器将bar.so中的未定义符号的引用解析为foo.so中的那些定义,而无需将链接栏与-lfoo或相似性移动到第三个库并将foo和bar链接到它? 发生在我身上的唯一情况是,在foo.so本身中使用RTLD_GLOBAL对doopen foo.so进行dlopen bar.so,但这让我觉得有点混乱。 谢谢。


链接foo.so反对bar.so

当可执行文件dlopen() s foo.sobar.so也将被加载。

或者,可执行文件的二进制补丁将RTLD_GLOBAL添加到dlopen()调用标志。 代码看起来像

    movl    $2, 4(%esp)       # $2 == RTLD_NOW; RTLD_LOCAL is 0
    movl    $0xNNNNN, (%esp)  # $0xNNNNN == &"foo.so"
    call    dlopen

修补它movl $0x102, 4(%esp)而不是( RTLD_GLOBAL == 0x100 ),并voilà。

编辑:
如果你知道bar.so的名字,那么你可以将foo.so链接到“stub” bar.so 。 不要紧,你没有“真正的” bar.so ; 所有重要的是foo.so都依赖于它。 在运行时,依赖关系会导致bar.so在加载foo.so加载。

链接地址: http://www.djcxy.com/p/42613.html

上一篇: dlopen with two shared libraries, exporting symbols

下一篇: Easy check for unresolved symbols in shared libraries?