1 /* sysdll.c --- system dependent support for dynamic linked libraries
2 Copyright (C) 1998 Free Software Foundation, Inc.
3 Author: William Perry <wmperry@aventail.com>
5 This file is part of XEmacs.
7 XEmacs is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with XEmacs; see the file COPYING. If not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
30 /* This whole file is conditional upon HAVE_SHLIB */
33 /* Thankfully, most systems follow the ELFish dlopen() method.
36 #if defined(HAVE_DLOPEN)
41 #endif /* RTLD_LAZY isn't defined under FreeBSD - ick */
48 dll_init (const char *arg)
55 dll_open (const char *fname)
57 return (dll_handle) dlopen (fname, RTLD_NOW);
61 dll_close (dll_handle h)
63 return dlclose ((void *) h);
67 dll_function (dll_handle h, const char *n)
69 #ifdef DLSYM_NEEDS_UNDERSCORE
70 char *buf = alloca_array (char, strlen (n) + 2);
75 return (dll_func) dlsym ((void *) h, n);
79 dll_variable (dll_handle h, const char *n)
81 #ifdef DLSYM_NEEDS_UNDERSCORE
82 char *buf = alloca_array (char, strlen (n) + 2);
87 return (dll_var)dlsym ((void *)h, n);
91 dll_error (dll_handle h)
93 #if defined(HAVE_DLERROR) || defined(dlerror)
94 return (const char *) dlerror ();
95 #elif defined(HAVE__DLERROR)
96 return (const char *) _dlerror();
98 return "Shared library error";
102 #elif defined(HAVE_SHL_LOAD)
103 /* This is the HP/UX version */
106 dll_init (const char *arg)
112 dll_open (const char *fname)
114 /* shl_load will hang hard if passed a NULL fname. */
115 if (fname == NULL) return NULL;
117 return (dll_handle) shl_load (fname, BIND_DEFERRED,0L);
121 dll_close (dll_handle h)
123 return shl_unload ((shl_t) h);
127 dll_function (dll_handle h, const char *n)
131 if (shl_findsym ((shl_t *) &h, n, TYPE_PROCEDURE, &handle))
134 return (dll_func) handle;
138 dll_variable (dll_handle h, const char *n)
142 if (shl_findsym ((shl_t *) &h, n, TYPE_DATA, &handle))
145 return (dll_var) handle;
149 dll_error (dll_handle h)
151 /* #### WTF?! Shouldn't this at least attempt to get strerror or
152 something? --hniksic */
153 return "Generic shared library error";
156 #elif defined(HAVE_DLD_INIT)
159 dll_init (const char *arg)
161 char *real_exe = dld_find_executable (arg);
164 rc = dld_init (real_exe);
174 dll_open (const char *fname)
176 rc = dld_link (fname);
180 return (dll_handle) 1;
184 dll_close (dll_handle h)
186 /* *sigh* DLD is pretty lame and doesn't return a handle that you can use
187 ** later on to free the file - you have to remember the filename and
188 ** use that as the unlinker. We should eventually keep a linked list
189 ** of loaded modules and then use the node pointer as the unique id
190 ** for the shared library. Wheeee. But not now.
196 dll_function (dll_handle h, const char *n)
198 return dld_get_func (n);
202 dll_variable (dll_handle h, const char *n)
204 return dld_get_symbol (n);
206 #elif defined (WIN32_NATIVE)
208 #define WIN32_LEAN_AND_MEAN
210 #undef WIN32_LEAN_AND_MEAN
213 dll_init (const char *arg)
219 dll_open (const char *fname)
221 return (dll_handle) LoadLibrary (fname);
225 dll_close (dll_handle h)
227 return FreeLibrary (h);
231 dll_function (dll_handle h, const char *n)
233 return (dll_func) GetProcAddress (h, n);
237 dll_variable (dll_handle h, const char *n)
239 return (dll_func) GetProcAddress (h, n);
243 dll_error (dll_handle h)
245 return "Windows DLL Error";
247 #elif defined(HAVE_DYLD)
250 This section supports MacOSX dynamic libraries. Dynamically
251 loadable libraries must be compiled as bundles, not dynamiclibs.
254 #include <mach-o/dyld.h>
257 dll_init (const char *arg)
263 dll_open (const char *fname)
265 NSObjectFileImage file;
266 NSObjectFileImageReturnCode ret =
267 NSCreateObjectFileImageFromFile(fname, &file);
268 if (ret != NSObjectFileImageSuccess) {
271 return (dll_handle)NSLinkModule(file, fname,
272 NSLINKMODULE_OPTION_BINDNOW |
273 NSLINKMODULE_OPTION_PRIVATE |
274 NSLINKMODULE_OPTION_RETURN_ON_ERROR);
278 dll_close (dll_handle h)
280 return NSUnLinkModule((NSModule)h, NSUNLINKMODULE_OPTION_NONE);
284 dll_function (dll_handle h, const char *n)
287 #ifdef DLSYM_NEEDS_UNDERSCORE
288 char *buf = alloca_array (char, strlen (n) + 2);
293 sym = NSLookupSymbolInModule((NSModule)h, n);
294 if (sym == 0) return 0;
295 return (dll_func)NSAddressOfSymbol(sym);
299 dll_variable (dll_handle h, const char *n)
302 #ifdef DLSYM_NEEDS_UNDERSCORE
303 char *buf = alloca_array (char, strlen (n) + 2);
308 sym = NSLookupSymbolInModule((NSModule)h, n);
309 if (sym == 0) return 0;
310 return (dll_var)NSAddressOfSymbol(sym);
314 dll_error (dll_handle h)
318 const char *fileNameWithError, *errorString;
319 NSLinkEditError(&c, &errorNumber, &fileNameWithError, &errorString);
325 /* Catchall if we don't know about this system's method of dynamic loading */
327 dll_init (const char *arg)
333 dll_open (const char *fname)
339 dll_close (dll_handle h)
345 dll_function (dll_handle h, const char *n)
351 dll_variable (dll_handle h, const char *n)
357 dll_error (dll_handle h)
359 return "Shared libraries not implemented on this system";
361 #endif /* System conditionals */
363 #endif /* HAVE_SHLIB */