Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com To: Cygwin List Subject: Bug in glib-1.2.10-2: gmodule cannot open dynamic link modul libraries From: "Dr. Volker Zell" Date: Thu, 27 Jan 2005 19:23:09 +0100 Message-ID: <87r7k6ybn6.fsf@vzell-de.de.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-IsSubscribed: yes Hi The following patch extracted from o http://cygnome.sourceforge.net/steven.obrien/libs/patches/glib-1.2.10-cygwin.patch seems to be missing from latest glib-1.2.10. Otherwise gmodule cannot open dynamic link modul libraries under cygwin. See also http://cygwin.com/ml/cygwin-apps/2004-12/msg00002.html I successfully tested this with gqview-1.1.2 and the gdk-pixbuf-0.22.0 package which was announced by Yaakow in http://cygwin.com/ml/cygwin-apps/2004-11/msg00070.html Ciao Volker diff -urN -x .build -x .inst -x .sinst glib-1.2.10-orig/gmodule/gmodule-cygwin.c glib-1.2.10/gmodule/gmodule-cygwin.c --- glib-1.2.10-orig/gmodule/gmodule-cygwin.c 1970-01-01 01:00:00.000000000 +0100 +++ glib-1.2.10/gmodule/gmodule-cygwin.c 2005-01-27 15:40:01.741680000 +0100 @@ -0,0 +1,165 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998, 2000 Tim Janik + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-1999. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include + +/* some flags are missing on some systems, so we provide + * harmless defaults. + * The Perl sources say, RTLD_LAZY needs to be defined as (1), + * at least for Solaris 1. + * + * Mandatory: + * RTLD_LAZY - resolve undefined symbols as code from the dynamic library + * is executed. + * RTLD_NOW - resolve all undefined symbols before dlopen returns, and fail + * if this cannot be done. + * Optionally: + * RTLD_GLOBAL - the external symbols defined in the library will be made + * available to subsequently loaded libraries. + */ +#ifndef RTLD_LAZY +#define RTLD_LAZY 1 +#endif /* RTLD_LAZY */ +#ifndef RTLD_NOW +#define RTLD_NOW 0 +#endif /* RTLD_NOW */ +/* some systems (OSF1 V5.0) have broken RTLD_GLOBAL linkage */ +#ifdef G_MODULE_BROKEN_RTLD_GLOBAL +#undef RTLD_GLOBAL +#endif /* G_MODULE_BROKEN_RTLD_GLOBAL */ +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif /* RTLD_GLOBAL */ + + +/* --- functions --- */ +static gchar* +fetch_dlerror (void) +{ + gchar *msg = dlerror (); + + /* make sure we always return an error message != NULL */ + + return msg ? msg : "unknown dl-error"; +} + +static gpointer +_g_module_open (const gchar *file_name, + gboolean bind_lazy) +{ + gpointer handle; + + handle = dlopen (file_name, RTLD_GLOBAL | (bind_lazy ? RTLD_LAZY : RTLD_NOW)); + if (!handle) + g_module_set_error (fetch_dlerror ()); + + return handle; +} + +static gpointer +_g_module_self (void) +{ + 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 ()); + + return handle; +} + +static void +_g_module_close (gpointer handle, + gboolean is_unref) +{ + /* 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 ()); + } +} + +static gpointer +_g_module_symbol (gpointer handle, + const gchar *symbol_name) +{ + gpointer p; + + p = dlsym (handle, symbol_name); + if (!p) + g_module_set_error (fetch_dlerror ()); + + return p; +} + +/* + * cygwin may have either lib or cyg as prefix for dll name + * where we are forced to guess, we use cyg + */ +static gchar* +_g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + int len = strlen(module_name); + gchar* dll_name = g_new0(gchar, len + 8); + gchar* path; + + if ((strncmp (module_name, "lib", 3) == 0) || (strncmp (module_name, "cyg", 3) == 0)) { + strcpy(dll_name, module_name); + } + else { + strcpy(dll_name, "cyg"); + strcat(dll_name, module_name); + } + if (strcmp(module_name + len - 4, ".dll") != 0) { + strcat(dll_name, ".dll"); + } + + if (directory && *directory) { + path = g_strconcat(directory, "/", dll_name, NULL); + } + else { + path = g_strdup(dll_name); + } + g_free(dll_name); + + return path; + +} + diff -urN -x .build -x .inst -x .sinst glib-1.2.10-orig/gmodule/gmodule.c glib-1.2.10/gmodule/gmodule.c --- glib-1.2.10-orig/gmodule/gmodule.c 2001-03-15 16:33:10.000000000 +0100 +++ glib-1.2.10/gmodule/gmodule.c 2005-01-27 15:40:01.771723200 +0100 @@ -127,7 +127,9 @@ /* --- include platform specifc code --- */ #define SUPPORT_OR_RETURN(rv) { g_module_set_error (NULL); } -#if (G_MODULE_IMPL == G_MODULE_IMPL_DL) +#ifdef __CYGWIN__ +#include "gmodule-cygwin.c" +#elif (G_MODULE_IMPL == G_MODULE_IMPL_DL) #include "gmodule-dl.c" #elif (G_MODULE_IMPL == G_MODULE_IMPL_DLD) #include "gmodule-dld.c" -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/