diff --git a/ChangeLog b/ChangeLog index 6e0f1b6ce..2304e4914 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Feb 20 02:39:03 2004 Tim Janik + + * applied patch from David Schleef which implements + a G_MODULE_BIND_LOCAL flag to g_module_open() to disable global + symbol registration. + Thu Feb 19 18:40:01 2004 Tim Janik * glib/gstring.[hc]: for G_CAN_INLINE environments, inline diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 6e0f1b6ce..2304e4914 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +Fri Feb 20 02:39:03 2004 Tim Janik + + * applied patch from David Schleef which implements + a G_MODULE_BIND_LOCAL flag to g_module_open() to disable global + symbol registration. + Thu Feb 19 18:40:01 2004 Tim Janik * glib/gstring.[hc]: for G_CAN_INLINE environments, inline diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 6e0f1b6ce..2304e4914 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,9 @@ +Fri Feb 20 02:39:03 2004 Tim Janik + + * applied patch from David Schleef which implements + a G_MODULE_BIND_LOCAL flag to g_module_open() to disable global + symbol registration. + Thu Feb 19 18:40:01 2004 Tim Janik * glib/gstring.[hc]: for G_CAN_INLINE environments, inline diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 6e0f1b6ce..2304e4914 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,9 @@ +Fri Feb 20 02:39:03 2004 Tim Janik + + * applied patch from David Schleef which implements + a G_MODULE_BIND_LOCAL flag to g_module_open() to disable global + symbol registration. + Thu Feb 19 18:40:01 2004 Tim Janik * glib/gstring.[hc]: for G_CAN_INLINE environments, inline diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 6e0f1b6ce..2304e4914 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +Fri Feb 20 02:39:03 2004 Tim Janik + + * applied patch from David Schleef which implements + a G_MODULE_BIND_LOCAL flag to g_module_open() to disable global + symbol registration. + Thu Feb 19 18:40:01 2004 Tim Janik * glib/gstring.[hc]: for G_CAN_INLINE environments, inline diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 6e0f1b6ce..2304e4914 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +Fri Feb 20 02:39:03 2004 Tim Janik + + * applied patch from David Schleef which implements + a G_MODULE_BIND_LOCAL flag to g_module_open() to disable global + symbol registration. + Thu Feb 19 18:40:01 2004 Tim Janik * glib/gstring.[hc]: for G_CAN_INLINE environments, inline diff --git a/docs/reference/glib/tmpl/modules.sgml b/docs/reference/glib/tmpl/modules.sgml index 17488d1f2..ffd70ba8a 100644 --- a/docs/reference/glib/tmpl/modules.sgml +++ b/docs/reference/glib/tmpl/modules.sgml @@ -108,8 +108,8 @@ eventually that fails as well, %NULL is returned. @file_name: the name of the file containing the module. -@flags: the flags used for opening the module. Currently this can be 0 or -#G_MODULE_BIND_LAZY for lazy binding, where symbols are only bound when needed. +@flags: the flags used for opening the module. This can be the logical +OR of any of the #GModuleFlags. @Returns: a #GModule on success, or %NULL on failure. @@ -119,9 +119,15 @@ Flags passed to g_module_open(). #G_MODULE_BIND_LAZY specifies that symbols are only resolved when needed. The default action is to bind all symbols when the module is loaded. (#G_MODULE_BIND_LAZY is not supported on all platforms.) +#G_MODULE_BIND_LOCAL specifies that symbols in the module should +not be added to the global name space. The default action on most +platforms is to place symbols in the module in the global name space, +which may cause conflicts with existing symbols. +(#G_MODULE_BIND_LOCAL is not supported on all platforms.) @G_MODULE_BIND_LAZY: +@G_MODULE_BIND_LOCAL: @G_MODULE_BIND_MASK: diff --git a/gmodule/gmodule-beos.c b/gmodule/gmodule-beos.c index edd6b893f..159bc985a 100644 --- a/gmodule/gmodule-beos.c +++ b/gmodule/gmodule-beos.c @@ -48,6 +48,9 @@ * different image_id's. While this means that we don't have to worry about * reference counts, it could lead to problems in the future.... * richard. + * + * load_add_on() apparently does not support lazy or local binding. Need + * to confirm that the actual behavior is non-lazy/local. --ds */ #include @@ -56,7 +59,8 @@ /* --- functions --- */ static gpointer _g_module_open (const gchar *file_name, - gboolean bind_lazy) + gboolean bind_lazy, + gboolean bind_local) { image_id handle; diff --git a/gmodule/gmodule-dl.c b/gmodule/gmodule-dl.c index 28dc8a903..08f87f3b2 100644 --- a/gmodule/gmodule-dl.c +++ b/gmodule/gmodule-dl.c @@ -90,11 +90,13 @@ fetch_dlerror (gboolean replace_null) static gpointer _g_module_open (const gchar *file_name, - gboolean bind_lazy) + gboolean bind_lazy, + gboolean bind_local) { gpointer handle; - handle = dlopen (file_name, RTLD_GLOBAL | (bind_lazy ? RTLD_LAZY : RTLD_NOW)); + handle = dlopen (file_name, + (bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW)); if (!handle) g_module_set_error (fetch_dlerror (TRUE)); diff --git a/gmodule/gmodule-dld.c b/gmodule/gmodule-dld.c index 997c197d4..913ac453b 100644 --- a/gmodule/gmodule-dld.c +++ b/gmodule/gmodule-dld.c @@ -67,9 +67,21 @@ /* --- functions --- */ + +/* + * shl_load() does not appear to support making symbols invisible to + * the global namespace. However, the default is to put the library + * last in the search order, which is approximately what we want, + * since it will cause symbols that conflict with existing symbols to + * be invisible. It is unclear if BIND_FIRST should be used when + * bind_local==0, since it may cause the loaded symbols to be used + * preferentially to the application's symbols, which is Almost + * Always Wrong. --ds + */ static gpointer _g_module_open (const gchar *file_name, - gboolean bind_lazy) + gboolean bind_lazy, + gboolean bind_local) { shl_t shl_handle; diff --git a/gmodule/gmodule-dyld.c b/gmodule/gmodule-dyld.c index 93bfc7771..3a96017d1 100644 --- a/gmodule/gmodule-dyld.c +++ b/gmodule/gmodule-dyld.c @@ -26,7 +26,8 @@ static gpointer self_module = GINT_TO_POINTER (1); static gpointer _g_module_open (const gchar *file_name, - gboolean bind_lazy) + gboolean bind_lazy, + gboolean bind_local) { NSObjectFileImage image; NSObjectFileImageReturnCode ret; @@ -66,7 +67,9 @@ _g_module_open (const gchar *file_name, return NULL; } - options = NSLINKMODULE_OPTION_RETURN_ON_ERROR | NSLINKMODULE_OPTION_PRIVATE; + options = NSLINKMODULE_OPTION_RETURN_ON_ERROR; + if (bind_local) + options |= NSLINKMODULE_OPTION_PRIVATE; if (!bind_lazy) options |= NSLINKMODULE_OPTION_BINDNOW; module = NSLinkModule (image, file_name, options); diff --git a/gmodule/gmodule-os2.c b/gmodule/gmodule-os2.c index 49d7351b4..4dd0404d7 100644 --- a/gmodule/gmodule-os2.c +++ b/gmodule/gmodule-os2.c @@ -68,11 +68,13 @@ /* --- functions --- */ static gpointer _g_module_open (const gchar *file_name, - gboolean bind_lazy) + gboolean bind_lazy, + gboolean bind_local) { gpointer handle; - handle = dlopen (file_name, RTLD_GLOBAL | (bind_lazy ? RTLD_LAZY : RTLD_NOW)); + handle = dlopen (file_name, + (bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW)); if (!handle) g_module_set_error (dlerror ()); diff --git a/gmodule/gmodule-win32.c b/gmodule/gmodule-win32.c index ebf0cbb55..882ee7b0a 100644 --- a/gmodule/gmodule-win32.c +++ b/gmodule/gmodule-win32.c @@ -52,7 +52,8 @@ set_error (void) /* --- functions --- */ static gpointer _g_module_open (const gchar *file_name, - gboolean bind_lazy) + gboolean bind_lazy, + gboolean bind_local) { HINSTANCE handle; #ifdef G_WITH_CYGWIN diff --git a/gmodule/gmodule.c b/gmodule/gmodule.c index 25a463e50..1429a3283 100644 --- a/gmodule/gmodule.c +++ b/gmodule/gmodule.c @@ -68,7 +68,8 @@ struct _GModule /* --- prototypes --- */ static gpointer _g_module_open (const gchar *file_name, - gboolean bind_lazy); + gboolean bind_lazy, + gboolean bind_local); static void _g_module_close (gpointer handle, gboolean is_unref); static gpointer _g_module_self (void); @@ -153,7 +154,8 @@ g_module_set_error (const gchar *error) "not supported by this system"); return rv; } static gpointer _g_module_open (const gchar *file_name, - gboolean bind_lazy) + gboolean bind_lazy, + gboolean bind_local) { return NULL; } @@ -384,7 +386,8 @@ g_module_open (const gchar *file_name, name = real_name; } if (name) - handle = _g_module_open (name, (flags & G_MODULE_BIND_LAZY) != 0); + handle = _g_module_open (name, (flags & G_MODULE_BIND_LAZY) != 0, + (flags & G_MODULE_BIND_LOCAL) != 0); } else g_module_set_error_unduped (g_strdup_printf ("unable to access file \"%s\"", file_name)); diff --git a/gmodule/gmodule.h b/gmodule/gmodule.h index 819ba1086..75de322cb 100644 --- a/gmodule/gmodule.h +++ b/gmodule/gmodule.h @@ -44,7 +44,8 @@ G_BEGIN_DECLS typedef enum { G_MODULE_BIND_LAZY = 1 << 0, - G_MODULE_BIND_MASK = 0x01 + G_MODULE_BIND_LOCAL = 1 << 1, + G_MODULE_BIND_MASK = 0x03 } GModuleFlags; typedef struct _GModule GModule;