1 /* GMODULE - GLIB wrapper code for dynamic module loading
2 * Copyright (C) 1998, 2000 Tim Janik
4 * dyld (Darwin) GMODULE implementation
5 * Copyright (C) 2001 Dan Winship
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
24 #include <mach-o/dyld.h>
26 static gpointer self_module = GINT_TO_POINTER (1);
29 _g_module_open (const gchar *file_name,
33 NSObjectFileImage image;
34 NSObjectFileImageReturnCode ret;
36 unsigned long options;
39 ret = NSCreateObjectFileImageFromFile (file_name, &image);
40 if (ret != NSObjectFileImageSuccess)
44 case NSObjectFileImageInappropriateFile:
45 case NSObjectFileImageFormat:
46 msg = g_strdup_printf ("%s is not a loadable module", file_name);
49 case NSObjectFileImageArch:
50 msg = g_strdup_printf ("%s is not built for this architecture",
54 case NSObjectFileImageAccess:
55 if (access (file_name, F_OK) == 0)
56 msg = g_strdup_printf ("%s: permission denied", file_name);
58 msg = g_strdup_printf ("%s: no such file or directory", file_name);
62 msg = g_strdup_printf ("unknown error for %s", file_name);
66 g_module_set_error (msg);
71 options = NSLINKMODULE_OPTION_RETURN_ON_ERROR;
73 options |= NSLINKMODULE_OPTION_PRIVATE;
75 options |= NSLINKMODULE_OPTION_BINDNOW;
76 module = NSLinkModule (image, file_name, options);
77 NSDestroyObjectFileImage (image);
82 const char *file, *error;
84 NSLinkEditError (&c, &error_number, &file, &error);
85 msg = g_strdup_printf ("could not link %s: %s", file_name, error);
86 g_module_set_error (msg);
101 _g_module_close (gpointer handle,
104 if (handle == &self_module)
107 if (!NSUnLinkModule (handle, 0))
108 g_module_set_error ("could not unlink module");
112 _g_module_symbol (gpointer handle,
113 const gchar *symbol_name)
118 if (handle == &self_module)
120 if (NSIsSymbolNameDefined (symbol_name))
121 sym = NSLookupAndBindSymbol (symbol_name);
126 sym = NSLookupSymbolInModule (handle, symbol_name);
130 msg = g_strdup_printf ("no such symbol %s", symbol_name);
131 g_module_set_error (msg);
136 return NSAddressOfSymbol (sym);
140 _g_module_build_path (const gchar *directory,
141 const gchar *module_name)
143 if (directory && *directory)
145 if (strncmp (module_name, "lib", 3) == 0)
146 return g_strconcat (directory, "/", module_name, NULL);
148 return g_strconcat (directory, "/lib", module_name, "." G_MODULE_SUFFIX, NULL);
150 else if (strncmp (module_name, "lib", 3) == 0)
151 return g_strdup (module_name);
153 return g_strconcat ("lib", module_name, "." G_MODULE_SUFFIX, NULL);