dlopen()在Android上失败但在Linux上运行

时间:2013-09-12 18:09:48

标签: android c glibc dlopen bionic

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

但在Android中,它不起作用,虽然我使用延迟模式,dlopen()因未解析的符号而失败。

这是我正在谈论的代码

retval = dlopen(LOADLIB, RTLD_LAZY); 

发生了什么事?

2 个答案:

答案 0 :(得分:0)

通常,仿生链接器在cur dir,system / lib和vendor / lib中查找共享库。您可以检查LD_LIBRARY路径是否设置为包含您尝试链接的lib所在的文件夹。

答案 1 :(得分:0)

也许是因为即使使用RTLD_LAZY标志进行dlopen,Android仿生系统也不支持RTLD_LAZY模式,所以您可以检查仿生源代码以获得详细信息。

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

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;
...
}