comparison src/sysdll.c @ 4990:8f0cf4fd3d2c

Automatic merge
author Ben Wing <ben@xemacs.org>
date Sat, 06 Feb 2010 04:01:46 -0600
parents 4aebb0131297
children f283b08ff0c9
comparison
equal deleted inserted replaced
4989:d2ec55325515 4990:8f0cf4fd3d2c
1 /* sysdll.c --- system dependent support for dynamic linked libraries 1 /* sysdll.c --- system dependent support for dynamic linked libraries
2 Copyright (C) 1998 Free Software Foundation, Inc. 2 Copyright (C) 1998 Free Software Foundation, Inc.
3 Copyright (C) 2010 Ben Wing.
4
3 Author: William Perry <wmperry@aventail.com> 5 Author: William Perry <wmperry@aventail.com>
4 6
5 This file is part of XEmacs. 7 This file is part of XEmacs.
6 8
7 XEmacs is free software; you can redistribute it and/or modify it 9 XEmacs is free software; you can redistribute it and/or modify it
17 You should have received a copy of the GNU General Public License 19 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 20 along with XEmacs; see the file COPYING. If not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 21 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */ 22 02111-1307, USA. */
21 23
24 /* This file has been Mule-ized, Ben Wing, 1-26-10. */
25
22 #ifdef HAVE_CONFIG_H 26 #ifdef HAVE_CONFIG_H
23 #include <config.h> 27 #include <config.h>
24 #endif 28 #endif
25 29
26 #include <stdlib.h> 30 #include <stdlib.h>
27 #include "lisp.h" 31 #include "lisp.h"
28 #include "sysdll.h" 32 #include "sysdll.h"
29 33
30 #ifdef DLSYM_NEEDS_UNDERSCORE 34 #ifdef DLSYM_NEEDS_UNDERSCORE
31 #define MAYBE_PREPEND_UNDERSCORE(n) do { \ 35 #define MAYBE_PREPEND_UNDERSCORE(n) do { \
32 CIbyte *buf = alloca_array (CIbyte, strlen (n) + 2); \ 36 Ibyte *buf = alloca_array (Ibyte, qxestrlen (n) + 2); \
33 *buf = '_'; \ 37 *buf = '_'; \
34 strcpy (buf + 1, n); \ 38 qxestrcpy (buf + 1, n); \
35 n = buf; \ 39 n = buf; \
36 } while (0) 40 } while (0)
37 #else 41 #else
38 #define MAYBE_PREPEND_UNDERSCORE(n) 42 #define MAYBE_PREPEND_UNDERSCORE(n)
39 #endif 43 #endif
71 { 75 {
72 soname = NULL; 76 soname = NULL;
73 } 77 }
74 else 78 else
75 { 79 {
76 LISP_STRING_TO_EXTERNAL (fname, soname, Qdll_filename_encoding); 80 soname = LISP_STRING_TO_EXTERNAL (fname, Qdll_filename_encoding);
77 } 81 }
78 return (dll_handle) dlopen (soname, RTLD_NOW); 82 return (dll_handle) dlopen (soname, RTLD_NOW);
79 } 83 }
80 84
81 int 85 int
83 { 87 {
84 return dlclose ((void *) h); 88 return dlclose ((void *) h);
85 } 89 }
86 90
87 dll_func 91 dll_func
88 dll_function (dll_handle h, const CIbyte *n) 92 dll_function (dll_handle h, const Ibyte *n)
89 { 93 {
94 Extbyte *next;
90 MAYBE_PREPEND_UNDERSCORE (n); 95 MAYBE_PREPEND_UNDERSCORE (n);
91 return (dll_func) dlsym ((void *) h, n); 96 next = ITEXT_TO_EXTERNAL (n, Qdll_function_name_encoding);
97 return (dll_func) dlsym ((void *) h, next);
92 } 98 }
93 99
94 dll_var 100 dll_var
95 dll_variable (dll_handle h, const CIbyte *n) 101 dll_variable (dll_handle h, const Ibyte *n)
96 { 102 {
103 Extbyte *next;
97 MAYBE_PREPEND_UNDERSCORE (n); 104 MAYBE_PREPEND_UNDERSCORE (n);
98 return (dll_var)dlsym ((void *)h, n); 105 next = ITEXT_TO_EXTERNAL (n, Qdll_variable_name_encoding);
106 return (dll_var)dlsym ((void *)h, next);
99 } 107 }
100 108
101 Lisp_Object 109 Lisp_Object
102 dll_error () 110 dll_error ()
103 { 111 {
107 #elif defined(HAVE__DLERROR) 115 #elif defined(HAVE__DLERROR)
108 msg = (const Extbyte *) _dlerror(); 116 msg = (const Extbyte *) _dlerror();
109 #else 117 #else
110 msg = (const Extbyte *) "Shared library error"; 118 msg = (const Extbyte *) "Shared library error";
111 #endif 119 #endif
112 return build_ext_string (msg, Qerror_message_encoding); 120 return build_extstring (msg, Qerror_message_encoding);
113 } 121 }
114 122
115 #elif defined(HAVE_SHL_LOAD) 123 #elif defined(HAVE_SHL_LOAD)
116 /* This is the HP/UX version */ 124 /* This is the HP/UX version */
117 #include <dl.h> 125 #include <dl.h>
124 { 132 {
125 soname = NULL; 133 soname = NULL;
126 } 134 }
127 else 135 else
128 { 136 {
129 LISP_STRING_TO_EXTERNAL (fname, soname, Qdll_filename_encoding); 137 soname = LISP_STRING_TO_EXTERNAL (fname, Qdll_filename_encoding);
130 } 138 }
131 return (dll_handle) shl_load (soname, BIND_DEFERRED, 0L); 139 return (dll_handle) shl_load (soname, BIND_DEFERRED, 0L);
132 } 140 }
133 141
134 int 142 int
162 Lisp_Object 170 Lisp_Object
163 dll_error () 171 dll_error ()
164 { 172 {
165 /* #### WTF?! Shouldn't this at least attempt to get strerror or 173 /* #### WTF?! Shouldn't this at least attempt to get strerror or
166 something? --hniksic */ 174 something? --hniksic */
167 return build_string ("Generic shared library error", 175 return build_ascstring ("Generic shared library error");
168 Qerror_message_encoding);
169 } 176 }
170 177
171 #elif defined (WIN32_NATIVE) || defined (CYGWIN) 178 #elif defined (WIN32_NATIVE) || defined (CYGWIN)
172 179
173 #include "syswindows.h" 180 #include "syswindows.h"
194 { 201 {
195 return FreeLibrary ((HMODULE) h); 202 return FreeLibrary ((HMODULE) h);
196 } 203 }
197 204
198 dll_func 205 dll_func
199 dll_function (dll_handle h, const CIbyte *n) 206 dll_function (dll_handle h, const Ibyte *n)
200 { 207 {
201 return (dll_func) GetProcAddress ((HINSTANCE) h, n); 208 Extbyte *next = ITEXT_TO_EXTERNAL (n, Qmswindows_multibyte);
202 } 209 return (dll_func) GetProcAddress ((HINSTANCE) h, next);
203 210 }
204 dll_func 211
205 dll_variable (dll_handle h, const CIbyte *n) 212 dll_func
206 { 213 dll_variable (dll_handle h, const Ibyte *n)
207 return (dll_func) GetProcAddress ((HINSTANCE) h, n); 214 {
215 Extbyte *next = ITEXT_TO_EXTERNAL (n, Qmswindows_multibyte);
216 return (dll_func) GetProcAddress ((HINSTANCE) h, next);
208 } 217 }
209 218
210 Lisp_Object 219 Lisp_Object
211 dll_error () 220 dll_error ()
212 { 221 {
213 CIbyte err[32]; 222 Ascbyte err[32];
214 snprintf (err, 32, "Windows DLL Error %lu", GetLastError ()); 223 snprintf (err, 32, "Windows DLL Error %lu", GetLastError ());
215 return build_string (err); 224 return build_ascstring (err);
216 } 225 }
217 #elif defined(HAVE_DYLD) 226 #elif defined (HAVE_DYLD)
218 /* This section supports MacOSX dynamic libraries. Dynamically 227 /* This section supports MacOSX dynamic libraries. Dynamically
219 loadable libraries must be compiled as bundles, not dynamiclibs. 228 loadable libraries must be compiled as bundles, not dynamiclibs.
220 */ 229 */
221 230
222 #include <mach-o/dyld.h> 231 #include <mach-o/dyld.h>
239 { 248 {
240 return NULL; 249 return NULL;
241 } 250 }
242 else 251 else
243 { 252 {
244 LISP_STRING_TO_EXTERNAL (fname, soname, Qdll_filename_encoding); 253 soname = LISP_STRING_TO_EXTERNAL (fname, Qdll_filename_encoding);
245 } 254 }
246 ret = NSCreateObjectFileImageFromFile(soname, &file); 255 ret = NSCreateObjectFileImageFromFile (soname, &file);
247 if (ret != NSObjectFileImageSuccess) { 256 if (ret != NSObjectFileImageSuccess)
248 return NULL; 257 return NULL;
249 } 258 out = NSLinkModule (file, soname,
250 out = NSLinkModule(file, soname, 259 NSLINKMODULE_OPTION_BINDNOW |
251 NSLINKMODULE_OPTION_BINDNOW | 260 NSLINKMODULE_OPTION_PRIVATE |
252 NSLINKMODULE_OPTION_PRIVATE | 261 NSLINKMODULE_OPTION_RETURN_ON_ERROR);
253 NSLINKMODULE_OPTION_RETURN_ON_ERROR); 262 return (dll_handle) out;
254 return (dll_handle)out;
255 } 263 }
256 264
257 int 265 int
258 dll_close (dll_handle h) 266 dll_close (dll_handle h)
259 { 267 {
260 return NSUnLinkModule((NSModule)h, NSUNLINKMODULE_OPTION_NONE); 268 return NSUnLinkModule ((NSModule) h, NSUNLINKMODULE_OPTION_NONE);
261 } 269 }
262 270
263 /* Given an address, return the mach_header for the image containing it 271 /* Given an address, return the mach_header for the image containing it
264 * or zero if the given address is not contained in any loaded images. 272 * or zero if the given address is not contained in any loaded images.
265 * 273 *
266 * Note: image_for_address(), my_find_image() and search_linked_libs() are 274 * Note: image_for_address(), my_find_image() and search_linked_libs() are
267 * based on code from the dlcompat library 275 * based on code from the dlcompat library
268 * (http://www.opendarwin.org/projects/dlcompat). 276 * (http://www.opendarwin.org/projects/dlcompat).
269 */ 277 */
270 278
271 static const struct mach_header* 279 static const struct mach_header *
272 image_for_address(void *address) 280 image_for_address (void *address)
273 { 281 {
274 unsigned long i; 282 unsigned long i;
275 unsigned long count = _dyld_image_count(); 283 unsigned long count = _dyld_image_count ();
276 const struct mach_header *mh = 0; 284 const struct mach_header *mh = 0;
277 285
278 for (i = 0; i < count; i++) 286 for (i = 0; i < count; i++)
279 { 287 {
280 unsigned long addr = (unsigned long)address - 288 unsigned long addr = (unsigned long) address -
281 _dyld_get_image_vmaddr_slide(i); 289 _dyld_get_image_vmaddr_slide (i);
282 mh = _dyld_get_image_header(i); 290 mh = _dyld_get_image_header (i);
283 291
284 if (mh) 292 if (mh)
285 { 293 {
286 struct load_command *lc = 294 struct load_command *lc =
287 (struct load_command *)((char *)mh + sizeof(struct mach_header)); 295 (struct load_command *) ((Rawbyte *) mh +
296 sizeof(struct mach_header));
288 unsigned long j; 297 unsigned long j;
289 298
290 for (j = 0; j < mh->ncmds; 299 for (j = 0; j < mh->ncmds;
291 j++, lc = (struct load_command *)((char *)lc + lc->cmdsize)) 300 j++, lc = (struct load_command *) ((Rawbyte *)lc + lc->cmdsize))
292 { 301 {
293 if (LC_SEGMENT == lc->cmd && 302 if (LC_SEGMENT == lc->cmd &&
294 addr >= ((struct segment_command *)lc)->vmaddr && 303 addr >= ((struct segment_command *)lc)->vmaddr &&
295 addr < 304 addr <
296 ((struct segment_command *)lc)->vmaddr + 305 ((struct segment_command *)lc)->vmaddr +
306 315
307 image_found: 316 image_found:
308 return mh; 317 return mh;
309 } 318 }
310 319
311 static const struct mach_header* 320 static const struct mach_header *
312 my_find_image(const char *name) 321 my_find_image (const char *name)
313 { 322 {
314 const struct mach_header *mh = (struct mach_header *) 323 const struct mach_header *mh = (struct mach_header *)
315 NSAddImage(name, NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED | 324 NSAddImage (name, NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED |
316 NSADDIMAGE_OPTION_RETURN_ON_ERROR); 325 NSADDIMAGE_OPTION_RETURN_ON_ERROR);
317 326
318 if (!mh) 327 if (!mh)
319 { 328 {
320 int count = _dyld_image_count(); 329 int count = _dyld_image_count ();
321 int j; 330 int j;
322 331
323 for (j = 0; j < count; j++) 332 for (j = 0; j < count; j++)
324 { 333 {
325 const char *id = _dyld_get_image_name(j); 334 const char *id = _dyld_get_image_name (j);
326 335
327 if (!strcmp(id, name)) 336 if (!strcmp (id, name))
328 { 337 {
329 mh = _dyld_get_image_header(j); 338 mh = _dyld_get_image_header (j);
330 break; 339 break;
331 } 340 }
332 } 341 }
333 } 342 }
334 343
341 * should do the same... but we don't bother adding the extra dependencies, if 350 * should do the same... but we don't bother adding the extra dependencies, if
342 * the symbols are neither in the loaded image nor any of it's direct 351 * the symbols are neither in the loaded image nor any of it's direct
343 * dependencies, then it probably isn't there. 352 * dependencies, then it probably isn't there.
344 */ 353 */
345 static NSSymbol 354 static NSSymbol
346 search_linked_libs(const struct mach_header * mh, const char *symbol) 355 search_linked_libs (const struct mach_header * mh, const Ibyte *symbol)
347 { 356 {
348 unsigned long n; 357 unsigned long n;
349 NSSymbol nssym = 0; 358 NSSymbol nssym = 0;
350 359
351 struct load_command *lc = 360 struct load_command *lc =
352 (struct load_command *)((char *)mh + sizeof(struct mach_header)); 361 (struct load_command *) ((Rawbyte *) mh + sizeof (struct mach_header));
353 362
354 for (n = 0; n < mh->ncmds; 363 for (n = 0; n < mh->ncmds;
355 n++, lc = (struct load_command *)((char *)lc + lc->cmdsize)) 364 n++, lc = (struct load_command *) ((Rawbyte *) lc + lc->cmdsize))
356 { 365 {
357 if ((LC_LOAD_DYLIB == lc->cmd) || (LC_LOAD_WEAK_DYLIB == lc->cmd)) 366 if ((LC_LOAD_DYLIB == lc->cmd) || (LC_LOAD_WEAK_DYLIB == lc->cmd))
358 { 367 {
359 struct mach_header *wh; 368 struct mach_header *wh;
360 369
361 if ((wh = (struct mach_header *) 370 if ((wh = (struct mach_header *)
362 my_find_image((char *)(((struct dylib_command *)lc)->dylib.name.offset + 371 my_find_image((Rawbyte *)
363 (char *)lc)))) 372 (((struct dylib_command *) lc)->
373 dylib.name.offset + (Rawbyte *) lc))))
364 { 374 {
365 if (NSIsSymbolNameDefinedInImage(wh, symbol)) 375 Extbyte *symext =
376 ITEXT_TO_EXTERNAL (symbol, Qdll_symbol_encoding);
377 if (NSIsSymbolNameDefinedInImage (wh, symext))
366 { 378 {
367 nssym = 379 nssym =
368 NSLookupSymbolInImage(wh, 380 NSLookupSymbolInImage
369 symbol, 381 (wh,
370 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | 382 symext,
371 NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); 383 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND |
384 NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
372 break; 385 break;
373 } 386 }
374 } 387 }
375 } 388 }
376 } 389 }
377 390
378 return nssym; 391 return nssym;
379 } 392 }
380 393
381 dll_func 394 dll_func
382 dll_function (dll_handle h, const CIbyte *n) 395 dll_function (dll_handle h, const Ibyte *n)
383 { 396 {
384 NSSymbol sym = 0; 397 NSSymbol sym = 0;
398 Extbyte *next;
399
385 MAYBE_PREPEND_UNDERSCORE (n); 400 MAYBE_PREPEND_UNDERSCORE (n);
401 next = ITEXT_TO_EXTERNAL (n, Qdll_function_name_encoding);
386 402
387 /* NULL means the program image and shared libraries, not bundles. */ 403 /* NULL means the program image and shared libraries, not bundles. */
388 404
389 if (h == NULL) 405 if (h == NULL)
390 { 406 {
391 /* NOTE: This assumes that this function is included in the main program 407 /* NOTE: This assumes that this function is included in the main program
392 and not in a shared library. */ 408 and not in a shared library. */
393 const struct mach_header* my_mh = image_for_address((void*) &dll_function); 409 const struct mach_header* my_mh =
394 410 image_for_address ((void*) &dll_function);
395 if (NSIsSymbolNameDefinedInImage(my_mh, n)) 411
412 if (NSIsSymbolNameDefinedInImage (my_mh, next))
396 { 413 {
397 sym = 414 sym =
398 NSLookupSymbolInImage(my_mh, 415 NSLookupSymbolInImage
399 n, 416 (my_mh,
400 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | 417 next,
401 NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); 418 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND |
419 NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
402 } 420 }
403 421
404 if (!sym) 422 if (!sym)
405 { 423 {
406 sym = search_linked_libs(my_mh, n); 424 sym = search_linked_libs (my_mh, n);
407 } 425 }
408 } 426 }
409 else 427 else
410 { 428 {
411 sym = NSLookupSymbolInModule((NSModule)h, n); 429 sym = NSLookupSymbolInModule ((NSModule)h, next);
412 } 430 }
413 431
414 if (sym == 0) return 0; 432 if (sym == 0) return 0;
415 return (dll_func)NSAddressOfSymbol(sym); 433 return (dll_func) NSAddressOfSymbol (sym);
416 } 434 }
417 435
418 dll_var 436 dll_var
419 dll_variable (dll_handle h, const CIbyte *n) 437 dll_variable (dll_handle h, const Ibyte *n)
420 { 438 {
421 NSSymbol sym; 439 NSSymbol sym;
440 Extbyte *next;
441
422 MAYBE_PREPEND_UNDERSCORE (n); 442 MAYBE_PREPEND_UNDERSCORE (n);
423 sym = NSLookupSymbolInModule((NSModule)h, n); 443 next = ITEXT_TO_EXTERNAL (n, Qdll_variable_name_encoding);
444
445 sym = NSLookupSymbolInModule ((NSModule) h, n);
424 if (sym == 0) return 0; 446 if (sym == 0) return 0;
425 return (dll_var)NSAddressOfSymbol(sym); 447 return (dll_var) NSAddressOfSymbol (sym);
426 } 448 }
427 449
428 Lisp_Object 450 Lisp_Object
429 dll_error () 451 dll_error (void)
430 { 452 {
431 NSLinkEditErrors c; 453 NSLinkEditErrors c;
432 int errorNumber; 454 int errorNumber;
433 const CIbyte *fileNameWithError, *errorString; 455 const Extbyte *fileNameWithError, *errorString;
434 NSLinkEditError(&c, &errorNumber, &fileNameWithError, &errorString); 456 NSLinkEditError (&c, &errorNumber, &fileNameWithError, &errorString);
435 return build_ext_string (errorString, Qerror_message_encoding); 457 return build_extstring (errorString, Qerror_message_encoding);
436 } 458 }
437 #elif HAVE_LTDL 459 #elif HAVE_LTDL
438 /* Libtool's libltdl */ 460 /* Libtool's libltdl */
439 #include <ltdl.h> 461 #include <ltdl.h>
440 462
447 { 469 {
448 soname = NULL; 470 soname = NULL;
449 } 471 }
450 else 472 else
451 { 473 {
452 LISP_STRING_TO_EXTERNAL (fname, soname, Qdll_filename_encoding); 474 soname = LISP_STRING_TO_EXTERNAL (fname, Qdll_filename_encoding);
453 } 475 }
454 return (dll_handle) lt_dlopen (soname); 476 return (dll_handle) lt_dlopen (soname);
455 } 477 }
456 478
457 int 479 int
459 { 481 {
460 return lt_dlclose ((lt_dlhandle) h); 482 return lt_dlclose ((lt_dlhandle) h);
461 } 483 }
462 484
463 dll_func 485 dll_func
464 dll_function (dll_handle h, const CIbyte *n) 486 dll_function (dll_handle h, const Ibyte *n)
465 { 487 {
488 Extbyte *next;
466 MAYBE_PREPEND_UNDERSCORE (n); 489 MAYBE_PREPEND_UNDERSCORE (n);
467 return (dll_func) lt_dlsym ((lt_dlhandle) h, n); 490 next = ITEXT_TO_EXTERNAL (n, Qdll_function_name_encoding);
491 return (dll_func) lt_dlsym ((lt_dlhandle) h, next);
468 } 492 }
469 493
470 dll_var 494 dll_var
471 dll_variable (dll_handle h, const CIbyte *n) 495 dll_variable (dll_handle h, const Ibyte *n)
472 { 496 {
497 Extbyte *next;
473 MAYBE_PREPEND_UNDERSCORE (n); 498 MAYBE_PREPEND_UNDERSCORE (n);
474 return (dll_var) lt_dlsym ((lt_dlhandle) h, n); 499 next = ITEXT_TO_EXTERNAL (n, Qdll_variable_name_encoding);
500 return (dll_var) lt_dlsym ((lt_dlhandle) h, next);
475 } 501 }
476 502
477 Lisp_Object 503 Lisp_Object
478 dll_error () 504 dll_error (void)
479 { 505 {
480 return build_ext_string (lt_dlerror (), Qerror_message_encoding); 506 return build_extstring (lt_dlerror (), Qerror_message_encoding);
481 } 507 }
482 #else 508 #else
483 /* Catchall if we don't know about this system's method of dynamic loading */ 509 /* Catchall if we don't know about this system's method of dynamic loading */
484 dll_handle 510 dll_handle
485 dll_open (Lisp_Object fname) 511 dll_open (Lisp_Object fname)
492 { 518 {
493 return 0; 519 return 0;
494 } 520 }
495 521
496 dll_func 522 dll_func
497 dll_function (dll_handle h, const CIbyte *n) 523 dll_function (dll_handle h, const Ibyte *n)
498 { 524 {
499 return NULL; 525 return NULL;
500 } 526 }
501 527
502 dll_func 528 dll_func
503 dll_variable (dll_handle h, const CIbyte *n) 529 dll_variable (dll_handle h, const Ibyte *n)
504 { 530 {
505 return NULL; 531 return NULL;
506 } 532 }
507 533
508 Lisp_Object 534 Lisp_Object
509 dll_error () 535 dll_error (void)
510 { 536 {
511 return build_string ("Shared libraries not implemented on this system"); 537 return build_ascstring ("Shared libraries not implemented on this system");
512 } 538 }
513 #endif /* System conditionals */ 539 #endif /* System conditionals */
514 540
515 #endif /* HAVE_SHLIB */ 541 #endif /* HAVE_SHLIB */