--- old/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c 2016-05-06 14:28:29.209176035 -0700 +++ new/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c 2016-05-06 14:28:29.097176037 -0700 @@ -312,7 +312,7 @@ return result; } -gboolean gtk2_check(const char* lib_name, int flags) +gboolean gtk2_check(const char* lib_name) { if (gtk2_libhandle != NULL) { /* We've already successfully opened the GTK libs, so return true. */ @@ -320,16 +320,12 @@ } else { void *lib = NULL; - lib = dlopen(lib_name, flags); + lib = dlopen(lib_name, RTLD_LAZY | RTLD_LOCAL); if (lib == NULL) { return FALSE; } - if (flags & RTLD_NOLOAD) { - return TRUE; - } - fp_gtk_check_version = dlsym(lib, "gtk_check_version"); /* Check for GTK 2.2+ */ if (!fp_gtk_check_version(2, 2, 0)) { --- old/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c 2016-05-06 14:28:29.573176029 -0700 +++ new/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c 2016-05-06 14:28:29.461176031 -0700 @@ -87,13 +87,13 @@ return result; } -gboolean gtk3_check(const char* lib_name, int flags) +gboolean gtk3_check(const char* lib_name) { if (gtk3_libhandle != NULL) { /* We've already successfully opened the GTK libs, so return true. */ return TRUE; } else { - return dlopen(lib_name, flags) != NULL; + return dlopen(lib_name, RTLD_LAZY | RTLD_LOCAL) != NULL; } } --- old/src/java.desktop/unix/native/libawt_xawt/awt/gtk_interface.c 2016-05-06 14:28:29.893176024 -0700 +++ new/src/java.desktop/unix/native/libawt_xawt/awt/gtk_interface.c 2016-05-06 14:28:29.781176026 -0700 @@ -24,14 +24,15 @@ */ #include #include +#include #include "jvm_md.h" #include "gtk_interface.h" GtkApi* gtk2_load(JNIEnv *env, const char* lib_name); GtkApi* gtk3_load(JNIEnv *env, const char* lib_name); -gboolean gtk2_check(const char* lib_name, int flags); -gboolean gtk3_check(const char* lib_name, int flags); +gboolean gtk2_check(const char* lib_name); +gboolean gtk3_check(const char* lib_name); GtkApi *gtk; @@ -40,7 +41,7 @@ const char* name; const char* vname; GtkApi* (*load)(JNIEnv *env, const char* lib_name); - gboolean (*check)(const char* lib_name, int flags); + gboolean (*check)(const char* lib_name); } GtkLib; static GtkLib libs[] = { @@ -67,13 +68,30 @@ } }; +static gboolean isLoadedLib(const char *lib_name) { + FILE* fp = fopen("/proc/self/maps", "r"); + if (!fp) { + return FALSE; + } + char line[512]; + while (fgets(line, 512, fp) != NULL) + { + if (strstr(line, lib_name)) { + fclose(fp); + return TRUE; + } + } + fclose(fp); + return FALSE; +} + static GtkLib* get_loaded() { GtkLib* lib = libs; while(!gtk && lib->version) { - if (lib->check(lib->vname, RTLD_NOLOAD)) { + if (isLoadedLib(lib->vname)) { return lib; } - if (lib->check(lib->name, RTLD_NOLOAD)) { + if (isLoadedLib(lib->name)) { return lib; } lib++; @@ -85,6 +103,9 @@ if (gtk == NULL) { GtkLib* lib = get_loaded(); if (lib) { + if (verbose) { + fprintf(stderr,"%s is already loaded\n",lib->name); + } if (version != GTK_ANY && lib->version != version) { if (verbose) { fprintf(stderr, "WARNING: Cannot load GTK%d library: \ @@ -93,7 +114,7 @@ return FALSE; } if (verbose) { - fprintf(stderr, "Looking for GTK%d library...\n", version); + fprintf(stderr, "Looking for GTK%d library...\n", lib->version); } gtk = lib->load(env, lib->vname); if (!gtk) { @@ -130,14 +151,14 @@ return gtk != NULL; } -static gboolean check_version(GtkVersion version, int flags) { +static gboolean check_version(GtkVersion version) { GtkLib* lib = libs; while (lib->version) { if (version == GTK_ANY || lib->version == version) { - if (lib->check(lib->vname, flags)) { + if (lib->check(lib->vname)) { return TRUE; } - if (lib->check(lib->name, flags)) { + if (lib->check(lib->name)) { return TRUE; } } @@ -150,9 +171,9 @@ if (gtk) { return TRUE; } - if (check_version(version, RTLD_NOLOAD)) { - return TRUE; + GtkLib* lib; + if (lib = get_loaded()) { + return lib->check(lib->vname) || lib->check(lib->name); } - return check_version(version, RTLD_LAZY | RTLD_LOCAL); + return check_version(version); } -