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.
23 #include <mach-o/dyld.h>
25 static gpointer self_module = GINT_TO_POINTER (1);
28 _g_module_open (const gchar *file_name,
32 NSObjectFileImage image;
33 NSObjectFileImageReturnCode ret;
35 unsigned long options;
38 ret = NSCreateObjectFileImageFromFile (file_name, &image);
39 if (ret != NSObjectFileImageSuccess)
43 case NSObjectFileImageInappropriateFile:
44 case NSObjectFileImageFormat:
45 msg = g_strdup_printf ("%s is not a loadable module", file_name);
48 case NSObjectFileImageArch:
49 msg = g_strdup_printf ("%s is not built for this architecture",
53 case NSObjectFileImageAccess:
54 if (access (file_name, F_OK) == 0)
55 msg = g_strdup_printf ("%s: permission denied", file_name);
57 msg = g_strdup_printf ("%s: no such file or directory", file_name);
61 msg = g_strdup_printf ("unknown error for %s", file_name);
65 g_module_set_error (msg);
70 options = NSLINKMODULE_OPTION_RETURN_ON_ERROR;
72 options |= NSLINKMODULE_OPTION_PRIVATE;
74 options |= NSLINKMODULE_OPTION_BINDNOW;
75 module = NSLinkModule (image, file_name, options);
76 NSDestroyObjectFileImage (image);
81 const char *file, *error;
83 NSLinkEditError (&c, &error_number, &file, &error);
84 msg = g_strdup_printf ("could not link %s: %s", file_name, error);
85 g_module_set_error (msg);
100 _g_module_close (gpointer handle,
103 if (handle == &self_module)
106 if (!NSUnLinkModule (handle, 0))
107 g_module_set_error ("could not unlink module");
111 _g_module_symbol (gpointer handle,
112 const gchar *symbol_name)
117 if (handle == &self_module)
119 if (NSIsSymbolNameDefined (symbol_name))
120 sym = NSLookupAndBindSymbol (symbol_name);
125 sym = NSLookupSymbolInModule (handle, symbol_name);
129 msg = g_strdup_printf ("no such symbol %s", symbol_name);
130 g_module_set_error (msg);
135 return NSAddressOfSymbol (sym);
139 _g_module_build_path (const gchar *directory,
140 const gchar *module_name)
142 if (directory && *directory)
144 if (strncmp (module_name, "lib", 3) == 0)
145 return g_strconcat (directory, "/", module_name, NULL);
147 return g_strconcat (directory, "/lib", module_name, "." G_MODULE_SUFFIX, NULL);
149 else if (strncmp (module_name, "lib", 3) == 0)
150 return g_strdup (module_name);
152 return g_strconcat ("lib", module_name, "." G_MODULE_SUFFIX, NULL);