android - dlopen() 在 Android 上失败,但在 Linux 上有效

标签 android c glibc dlopen bionic

我正在尝试在惰性模式下使用 dlopen() 动态加载特定的共享库。 当然,共享库中存在未解析的符号,但惰性模式应该忽略它们。 它在 Linux 上确实会忽略它们,并且一旦在运行时使用这些符号,解析实际上就会发生。

但在 Android 中,它不起作用,尽管我使用惰性模式,dlopen() 由于未解析的符号而失败。

这是我正在谈论的代码

retval = dlopen(LOADLIB, RTLD_LAZY); 

发生什么事了?

最佳答案

可能是因为 Android Bionic 不支持 RTLD_LAZY 模式,即使您使用 RTLD_LAZY 标志进行 dlopen,您也可以检查 Bionic 源代码以了解详细信息。

下面是棉花糖仿生代码 fragment :

bool soinfo::prelink_image() {
...
case DT_PLTGOT:
#if defined(__mips__)
     // used by mips and mips64
     plt_got_ = reinterpret_cast<ElfW(Addr)**>(load_bias + d->d_un.d_ptr);
#endif
     // Ignore for other platforms... (because RTLD_LAZY is not supported)
     break;
...
}

关于android - dlopen() 在 Android 上失败,但在 Linux 上有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18771459/

相关文章:

c++ - 所有文件都有 FILE_ATTRIBUTE_ARCHIVE 属性

c - lua 5.2 C api 中的语法更改

在 C 中导致段错误 |堆栈虚拟内存

c - LD_PRELOAD-ed open() + __xstat() + syslog() 结果存入 EBADF

android - 如何在 RecyclerView 中的最后一个元素之后创建一个空白空间?

java - 适用于 Android 的 SQLCipher : couldn't find native method

java - 简单的 RxAndroid 代码不起作用

java - 未捕获的处理程序 : thread main exiting due to uncaught exception

postgresql - ec2 服务器 postgres 错误 "version ` GLIBC_2.1 4' not found"

android - 在 CentOS 6 中从命令行构建 Android 应用程序时需要 GLIBC_2.14