diff --git a/src/code/x86-vm.lisp b/src/code/x86-vm.lisp index 2171d60a5951919244cee0445059ac12d5d2ee83..a7e307d78f5e791082b6885324203474e6160363 100644 --- a/src/code/x86-vm.lisp +++ b/src/code/x86-vm.lisp @@ -336,6 +336,9 @@ ;;; (defun extern-alien-name (name) (declare (type simple-string name)) + #-elf + (concatenate 'string "_" name) + #+elf name) #+(and (or linux (and freebsd elf)) (not linkage-table)) diff --git a/src/compiler/generic/new-genesis.lisp b/src/compiler/generic/new-genesis.lisp index 953d9ba9ee540dd6099304ab9fcb5a0696cedede..bae4df7508520d3f75c2608d72013222fbb55750 100644 --- a/src/compiler/generic/new-genesis.lisp +++ b/src/compiler/generic/new-genesis.lisp @@ -2183,7 +2183,7 @@ ;; This has gotta be the first entry. This has to match what ;; os_foreign_linkage_init does! #+(or x86 amd64) - (cold-register-foreign-linkage "resolve_linkage_tramp" :code) + (cold-register-foreign-linkage (vm::extern-alien-name "resolve_linkage_tramp") :code) #+(or sparc ppc) (progn (cold-register-foreign-linkage (vm::extern-alien-name "call_into_c") :code) diff --git a/src/lisp/Darwin-os.c b/src/lisp/Darwin-os.c index 0efb72f391f590e6a68c0159469f3b512effdce4..49e660cc726c378785844e23c2ea35762d79a835 100644 --- a/src/lisp/Darwin-os.c +++ b/src/lisp/Darwin-os.c @@ -532,7 +532,13 @@ os_dlsym(const char *sym_name, lispobj lib_list) { static void *program_handle; void *sym_addr = 0; + int offset = sym_name[0] == '_' ? 1 : 0; +#if 1 + if (offset == 0) { + fprintf(stderr, "sym-name = %s\n", sym_name); + } +#endif if (!program_handle) program_handle = dlopen((void *) 0, RTLD_LAZY | RTLD_GLOBAL); if (lib_list != NIL) { @@ -543,21 +549,17 @@ os_dlsym(const char *sym_name, lispobj lib_list) struct cons *lib_cons = CONS(CONS(lib_list_head)->car); struct sap *dlhandle = (struct sap *) PTR(lib_cons->car); -#if 0 && defined(__ppc__) - sym_addr = dlsym((void *) dlhandle->pointer, (sym_name[0] == '_' ? sym_name + 1 : sym_name)); -#else - sym_addr = dlsym((void *) dlhandle->pointer, sym_name); -#endif + /* + * On Darwin, dlsym assumes the C name, so skip the underscore that + * is prepended by EXTERN-ALIEN-NAME. + */ + sym_addr = dlsym((void *) dlhandle->pointer, sym_name + offset); if (sym_addr) - return sym_addr; + return sym_addr; } } -#if 0 && defined(__ppc__) - sym_addr = dlsym(program_handle, (sym_name[0] == '_' ? sym_name + 1 : sym_name)); -#else - sym_addr = dlsym(program_handle, sym_name); -#endif + sym_addr = dlsym(program_handle, sym_name + offset); return sym_addr; } diff --git a/src/lisp/os-common.c b/src/lisp/os-common.c index b183d066a1203d8849f6d3636d48bca10fba3544..ff9cffb5e427ca09cb9c602bbc32190070cbc755 100755 --- a/src/lisp/os-common.c +++ b/src/lisp/os-common.c @@ -167,6 +167,16 @@ convert_lisp_string(char* c_string, void* lisp_string, int len) return c_string; } +/* + * C version of lisp's EXTERN-ALIEN-NAME. For systems that use elf, + * do nothing. Otherwise, we prepend an underscore. + */ +#if defined(FEATURE_ELF) +#define EXTERN_ALIEN_NAME(x) x +#else +#define EXTERN_ALIEN_NAME(x) "_" x +#endif + void os_foreign_linkage_init(void) { @@ -212,25 +222,27 @@ os_foreign_linkage_init(void) #endif if (i == 0) { #if defined(sparc) - if (type != LINKAGE_CODE_TYPE || strcmp(c_symbol_name, "call_into_c")) { + if (type != LINKAGE_CODE_TYPE || strcmp(c_symbol_name, EXTERN_ALIEN_NAME("call_into_c"))) { fprintf(stderr, "linkage_data is %s but expected call_into_c\n", - (char *) symbol_name->data); + c_symbol_name); lose("First element of linkage_data is bogus.\n"); } arch_make_linkage_entry(i, (void*) call_into_c, 1); #elif (defined(DARWIN) && defined(__ppc__)) - if (type != 1 || strcmp(c_symbol_name, "call_into_c")) { - fprintf(stderr, "linkage_data is %s but expected call_into_c\n", - (char *) c_symbol_name); + if (type != 1 || strcmp(c_symbol_name, EXTERN_ALIEN_NAME("call_into_c"))) { + fprintf(stderr, "linkage_data is %s but expected %s\n", + c_symbol_name, + EXTERN_ALIEN_NAME("call_into_c")); lose("First element of linkage_data is bogus.\n"); } arch_make_linkage_entry(i, &call_into_c, 1); #else if (type != LINKAGE_CODE_TYPE || strcmp(c_symbol_name, - "resolve_linkage_tramp")) { + EXTERN_ALIEN_NAME("resolve_linkage_tramp"))) { fprintf(stderr, - "linkage_data is %s but expected resolve_linkage_tramp\n", - (char *) c_symbol_name); + "linkage_data is %s but expected %s\n", + c_symbol_name, + EXTERN_ALIEN_NAME("resolve_linkage_tramp")); lose("First element of linkage_data is bogus.\n"); } arch_make_linkage_entry(i, (void *) &resolve_linkage_tramp, 1); @@ -241,7 +253,7 @@ os_foreign_linkage_init(void) void *target_addr = os_dlsym(c_symbol_name, NIL); if (!target_addr) { -#if 1 +#if 0 int k; unsigned short int* wide_string; @@ -262,7 +274,6 @@ os_foreign_linkage_init(void) } else { arch_make_lazy_linkage(i / LINKAGE_DATA_ENTRY_SIZE); } - } #endif /* LINKAGE_TABLE */ } diff --git a/src/tools/cross-scripts/cross-x86-x86.lisp b/src/tools/cross-scripts/cross-x86-x86.lisp index 3f579f34fbb9c877837f199fa6965d72f6b365e8..eacbbe112404ffbd70a33be8a94f73fdb0b1ffff 100644 --- a/src/tools/cross-scripts/cross-x86-x86.lisp +++ b/src/tools/cross-scripts/cross-x86-x86.lisp @@ -205,6 +205,9 @@ (in-package :vm) (defun extern-alien-name (name) (declare (type simple-string name)) + #-elf + (concatenate 'simple-string "_" name) + #+elf name) (export 'extern-alien-name) (in-package :cl-user)