dlopen()
我正在尝试使用惰性模式动态加载特定的共享库。共享库中当然有未解析的符号,但惰性模式应该忽略它们。它在 Linux 上确实会忽略它们,并且在运行时使用符号后实际上会发生解析。
但是在Android中,它不起作用,虽然我使用惰性模式,但dlopen()
由于未解析的符号而失败。
这是我正在谈论的代码
retval = dlopen(LOADLIB, RTLD_LAZY);
这是怎么回事 ?
可能是因为 Android 仿生不支持 RTLD_LAZY 模式,即使您使用 RTLD_LAZY 标志进行 dlopen,您可以查看仿生源代码以获取详细信息。
以下是棉花糖仿生代码片段:
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;
...
}
通常仿生链接器在 cur 目录、system/lib 和 vendor/lib 中查找共享库。您可以检查 LD_LIBRARY 路径是否设置为包含您尝试链接的 lib 所在的文件夹。