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