dlopen有两个共享库,导出符号

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,但这让我感到有点混乱.谢谢.

Emp*_*ian 6

链接foo.so反对bar.so

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

或者,对可执行文件进行二进制修补,以添加RTLD_GLOBALdlopen()调用标志中。该代码看起来像

    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加载。