gpt4 book ai didi

Android NDK - 从 dlsym() 加载仅主 DLL\SO 的符号

转载 作者:搜寻专家 更新时间:2023-11-01 09:21:56 24 4
gpt4 key购买 nike

使用 Android NDK 和生成的库 (.so)

我需要获取仅存在于主 SO 中的方法的地址。在 dlopen() 之后使用 dlsym() 将提供该方法的地址,但它将在所有链接的 SO 中搜索该方法。但只有当该方法是主 SO 的一部分时我才需要获取该方法的地址,如果它是任何其他链接 SO 的一部分则不需要。

例如,如果我使用 dlopen() 打开了 A.so,然后调用 dlsym() 来检查函数 foo(),使用 dlopen() 提供的句柄,那么只有当它是 A.so 的一部分时我才应该获取句柄。目前,即使 foo() 是链接到 A.so 的 B.so 的一部分,dlsym() 也会提供地址(我需要 dlsym() 只在 A.so 中搜索,而不是在它的其他链接或依赖库中搜索)。

在 Linux 上,如果我们使用带有标志“RTLD_FIRST”的 dlopen(),则可以实现所需的行为。但是 'RTLD_FIRST' 似乎在 Android 中不受支持。我验证了宏“RTLD_FIRST”的“dlfcn.h”头文件不存在。

如果这在 Android-NDK 中完全不可能,那么我们能否以某种方式获取存在该方法的 SO 的名称。在上面的例子中,如果我能得到 foo()B.so 的一部分,我可以做一个简单的检查以确定它是否来自所需的库。

代码为C语言。谁能告诉我这是如何实现的?提前致谢。

最佳答案

对于任何想知道我是如何达到预期结果的人。由于 RTLD_LOCAL 和其他相关标志未提供所需的结果,因此使用 dlsym() 获取方法的地址并将该地址传递给 dladdr(const void* __addr, Dl_info* __info)dladdr()Dl_info 中返回足够的方法详细信息,至少是我想要的。 Dl_info->dli_fname 指针,包含找到该方法的 DLL/库的完整路径。

关于Android NDK - 从 dlsym() 加载仅主 DLL\SO 的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54331154/

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