--- src/glib-2.38.1/gmodule/gmodule-win32.c.orig 2013-08-08 14:00:40.000000000 +0400 +++ src/glib-2.38.1/gmodule/gmodule-win32.c 2013-11-05 23:23:51.213200000 +0400 @@ -38,8 +38,23 @@ #include #ifdef G_WITH_CYGWIN -#include -#endif +#include + +static gchar* +fetch_dlerror (gboolean replace_null) +{ + gchar *msg = dlerror (); + + /* make sure we always return an error message != NULL, if + * expected to do so. */ + + if (!msg && replace_null) + return "unknown dl-error"; + + return msg; +} + +#else static void set_error (const gchar *format, @@ -64,20 +79,28 @@ g_free (error); } +#endif + /* --- functions --- */ static gpointer _g_module_open (const gchar *file_name, gboolean bind_lazy, gboolean bind_local) { +#ifdef G_WITH_CYGWIN + gpointer handle; + + handle = dlopen (file_name, + (bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW)); + if (!handle) + g_module_set_error (fetch_dlerror (TRUE)); +#else HINSTANCE handle; wchar_t *wfilename; -#ifdef G_WITH_CYGWIN gchar tmp[MAX_PATH]; cygwin_conv_to_win32_path(file_name, tmp); file_name = tmp; -#endif wfilename = g_utf8_to_utf16 (file_name, -1, NULL, NULL, NULL); handle = LoadLibraryW (wfilename); @@ -85,7 +108,7 @@ if (!handle) set_error ("'%s': ", file_name); - +#endif return handle; } @@ -95,16 +118,41 @@ static gpointer _g_module_self (void) { +#ifdef G_WITH_CYGWIN + gpointer handle; + + /* to query symbols from the program itself, special link options + * are required on some systems. + */ + + handle = dlopen (NULL, RTLD_GLOBAL | RTLD_LAZY); + if (!handle) + g_module_set_error (fetch_dlerror (TRUE)); + + return handle; +#else return null_module_handle; +#endif } static void _g_module_close (gpointer handle, gboolean is_unref) { +#ifdef G_WITH_CYGWIN + /* are there any systems out there that have dlopen()/dlclose() + * without a reference count implementation? + */ + is_unref |= 1; + + if (is_unref) + if (dlclose (handle) != 0) + g_module_set_error (fetch_dlerror (TRUE)); +#else if (handle != null_module_handle) if (!FreeLibrary (handle)) set_error (""); +#endif } static gpointer @@ -150,6 +198,13 @@ { gpointer p; +#ifdef G_WITH_CYGWIN + p = dlsym (handle, symbol_name); + if (!p) + p = find_in_any_module (symbol_name); + if (!p) + g_module_set_error (fetch_dlerror (FALSE)); +#else if (handle == null_module_handle) { if ((p = GetProcAddress (GetModuleHandle (NULL), symbol_name)) == NULL) @@ -160,6 +215,7 @@ if (!p) set_error (""); +#endif return p; }