dlopen()不能与android-n一起使用

dlopen()在API-23上正常工作,但对于Android-N,当我尝试使用dlopen打开任何sofile时,它返回一个soinfo结构类型指针.但当我试图访问此结构的任何变量时,应用程序崩溃.

si = (soinfo*) dlopen("/data/app/com.xxx.xxx.sampleapp.android-1/lib/x86/libtest.so", RTLD_GLOBAL);

if (si == NULL)
    return;

LOGI("value of dlopen [%d]", si->size);

Android-N中的dlopen()功能是否有任何变化?

解决方法:

dlopen()不返回指向某个soinfo结构的指针,它返回void *,标准的Linux手册页对此非常具体:

The function dlopen() loads the dynamic shared object (shared library) file named by the null-terminated string filename and returns an opaque “handle” for the loaded object. This handle is employed with other functions in the dlopen API, such as dlsym(3), dladdr(3), dlinfo(3), and dlclose().

因此,您可以以某种方式解释返回值的事实是非标准的,现在Google只是使用this change强制执行:

commit  ae74e8750b9dae51b24a22fdb4b0e0a2d84f37b9
author  Dimitry Ivanov <dimitry@google.com>
...
linker: hide the pointer to soinfo

Handle no longer is a pointer to soinfo of
a corresponding library. This is done to
prevent access to linker internal fields.

Bug: http://b/25593965
Change-Id: I62bff0d0e5b2dc842e6bf0babb30fcc4c000be24
(cherry picked from commit d88e1f350111b3dfd71c6492321f0503cb5540db)

因此,除非您的应用程序针对的是SDK版本23或更低版本(请参阅soinfo :: to_handle()),否则您现在获得的句柄只能通过内部仿生soinfo_from_handle()转换回soinfo *.

上一篇:c – 在dlopen处检测重复的符号


下一篇:c#学习之旅------01