gpt4 book ai didi

linux - 带有两个共享库的 dlopen,导出符号

转载 作者:IT王子 更新时间:2023-10-29 00:21:23 27 4
gpt4 key购买 nike

我有一个 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 中 undefined symbol 的引用解析为 foo.so 中的那些定义,而无需将 bar 与 -lfoo 或相似性链接起来,将符号移动到第三个库并将 foo 和禁止吗?我唯一想到的是从 foo.so 本身中使用 RTLD_GLOBAL dlopen foo.so,然后 dlopen bar.so,但这让我觉得有点乱。谢谢。

最佳答案

foo.so 链接到 bar.so

当可执行文件dlopen()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),瞧瞧。

编辑:
如果您知道 bar.so 的名称,则可以将 foo.so 链接到“ stub ”bar.so。你没有“真正的”bar.so也没关系;重要的是 foo.so 对它有依赖性。在运行时,每当加载 foo.so 时,该依赖项将导致加载 bar.so

关于linux - 带有两个共享库的 dlopen,导出符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3358902/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com