Mercurial > hg > xemacs-beta
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 */ |
