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 次 |
| 最近记录: |