mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-03-14 19:55:12 +01:00
gmodule – Don't use RTLD_DEFAULT on Android for g_module_self() on Android 64 bit
On 64 bit Android this is #defined to 0, which is considered an invalid library handle in all other cases. RTLD_DEFAULT is only supposed to be used with dlsym() it seems, and the usage here was just an "optimization" before. By dlopen'ing NULL, we get the same on all 64 bit Android variants and it actually works instead of erroring out. On 32 bit Android, dlopen() of NULL unfortunately usually gives us something useless that finds no symbols whatsoever. https://bugzilla.gnome.org/show_bug.cgi?id=776876
This commit is contained in:
parent
cc5e9f2362
commit
0d81bb4e31
@ -111,8 +111,14 @@ _g_module_self (void)
|
||||
/* to query symbols from the program itself, special link options
|
||||
* are required on some systems.
|
||||
*/
|
||||
|
||||
#ifdef __BIONIC__
|
||||
|
||||
/* On Android 32 bit (i.e. not __LP64__), dlopen(NULL)
|
||||
* does not work reliable and generally no symbols are found
|
||||
* at all. RTLD_DEFAULT works though.
|
||||
* On Android 64 bit, dlopen(NULL) seems to work but RTLD_DEFAULT
|
||||
* is NULL, which is considered an invalid module.
|
||||
*/
|
||||
#if defined(__BIONIC__) && !defined(__LP64__)
|
||||
handle = RTLD_DEFAULT;
|
||||
#else
|
||||
handle = dlopen (NULL, RTLD_GLOBAL | RTLD_LAZY);
|
||||
@ -129,9 +135,15 @@ _g_module_close (gpointer handle,
|
||||
{
|
||||
/* are there any systems out there that have dlopen()/dlclose()
|
||||
* without a reference count implementation?
|
||||
*
|
||||
* See above for the Android special case
|
||||
*/
|
||||
#if defined(__BIONIC__) && !defined(__LP64__)
|
||||
is_unref = (handle != RTLD_DEFAULT);
|
||||
#else
|
||||
is_unref |= 1;
|
||||
|
||||
#endif
|
||||
|
||||
if (is_unref)
|
||||
{
|
||||
if (dlclose (handle) != 0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user