mr *_*mpy 8 linux shared-libraries dlopen
我有一个linux共享库foo.so,它是使用可执行文件加载的dlopen("foo.so", RTLD_NOW | RTLD_LOCAL)
.从foo.so我想dlopen另一个库bar.so,它引用foo.so中定义的符号,但链接器无法找到它们.我无法将RTLD_LOCAL更改为RTLD_GLOBAL,因为我没有执行加载的可执行文件的源代码.我-Wl,--export-dynamic
想当链接foo.so可能会有所帮助,但它不会覆盖本地标志到dlopen.GCC的新属性可见性功能看起来并不像它提供了答案.
有没有办法可以指示链接器解析bar.so中未定义符号的引用到foo.so中的那些定义,没有链接bar与-lfoo或相似性将符号移动到第3个库并将foo和bar链接到它?对我来说唯一的事情就是从foo.so本身中删除foo.so和RTLD_GLOBAL,然后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
Run Code Online (Sandbox Code Playgroud)
将其修补为movl $0x102, 4(%esp)
(RTLD_GLOBAL == 0x100
),然后贴上。
编辑:
如果您知道的名称bar.so
,则可以链接foo.so
到“存根” bar.so
。您没有“真实”的情况也没关系bar.so
;重要的是要foo.so
依赖它。在运行时,依赖项将导致bar.so
在每次加载时foo.so
加载。
归档时间: |
|
查看次数: |
2424 次 |
最近记录: |