applied patch from David Schleef <ds@schleef.org> which implements a

Fri Feb 20 02:39:03 2004  Tim Janik  <timj@gtk.org>

        * applied patch from David Schleef <ds@schleef.org> which implements
        a G_MODULE_BIND_LOCAL flag to g_module_open() to disable global
        symbol registration.
This commit is contained in:
Tim Janik
2004-02-20 01:41:00 +00:00
committed by Tim Janik
parent fb464bde99
commit defca980e4
15 changed files with 85 additions and 15 deletions

View File

@@ -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 <Errors.h>
@@ -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;

View File

@@ -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));

View File

@@ -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;

View File

@@ -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);

View File

@@ -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 ());

View File

@@ -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

View File

@@ -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));

View File

@@ -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;