使用两个共享库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.so
, bar.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
加载。