From: Christophe R. <cr...@us...> - 2003-08-16 21:54:28
|
Update of /cvsroot/sbcl/sbcl/src/runtime In directory sc8-pr-cvs1:/tmp/cvs-serv963/src/runtime Modified Files: Config.ppc-darwin ldso-stubs.S ppc-darwin-os.c Added Files: ppc-darwin-dlshim.c Log Message: 0.8.2.34: Merge patch from Brian Mastenbrook for better dlfoo handling on Darwin (plus more-likely cpp options, add boilerplate) ... reindent to 4 spaces; ASSQ patch from observation by PFD sbcl-devel 2003-08-16 ... (NOT (NULL PAIR)) plus explanatory comment; Pragmatism: since not all lisps implement arrays with NIL specialized-array-element-type, our cross-compiler version needs to be more robust. Symptoms: building sbcl/ppc from openmcl loses in cold-init; sbcl/sparc from sbcl-0.7.x hangs in cross-compiler compilation of STRING ... since we don't need any (ARRAY NIL)s to cross-compile SBCL, the answer to SIMPLE-ARRAY-NIL-P for constant-folding purposes in the cross-compiler is always NIL. --- NEW FILE: ppc-darwin-dlshim.c --- /* * These functions emulate a small subset of the dlopen / dlsym * functionality under Darwin's Mach-O dyld system. */ /* * This software is part of the SBCL system. See the README file for * more information. * * This software is derived from the CMU CL system, which was * written at Carnegie Mellon University and released into the * public domain. The software is in the public domain and is * provided with absolutely no warranty. See the COPYING and CREDITS * files for more information. */ #include <mach-o/dyld.h> #include <stdio.h> #include <stdlib.h> #include <string.h> /* Darwin does not define the standard ELF * dlopen/dlclose/dlsym/dlerror interface to shared libraries, so this * is an attempt at a minimal wrapper to allow SBCL to work without * external dependency on pogma's dlcompat library. */ /* For now, there is no RTLD_GLOBAL emulation either. */ static char dl_self; /* I'm going to abuse this */ #define RTLD_LAZY 1 #define RTLD_NOW 2 #define RTLD_GLOBAL 0x100 static int callback_count; static struct mach_header* last_header; void dlshim_image_callback(struct mach_header* ptr, unsigned long phooey) { callback_count++; last_header = ptr; } int lib_path_count(void) { char* libpath; int i; int count; libpath = getenv("DYLD_LIBRARY_PATH"); count = 1; if (libpath) { for (i = 0; libpath[i] != '\0'; i++) { if (libpath[i] == ':') count++; } } return count; } const char* lib_path_prefixify(int index, const char* filename) { static char* retbuf = NULL; int fi, li, i, count; char* libpath; if (!retbuf) { retbuf = (char*) malloc(1024*sizeof(char)); } count = 0; fi = 0; li = -1; libpath = getenv("DYLD_LIBRARY_PATH"); if (libpath) { i = 0; while (count != index && libpath[i] != '\0') { if (libpath[i] == ':') count++; i++; } fi = i; while (libpath[i] != '\0' && libpath[i] != ':') { i++; } li = i - 1; } if (li - fi > 0) { if (li - fi + 1 > 1022 - strlen(filename)) { retbuf = (char*) realloc(retbuf, (li - fi + 3 + strlen(filename))*sizeof(char)); } memcpy(retbuf, libpath + fi, (li - fi + 1)*sizeof(char)); retbuf[li - fi + 1] = '/'; memcpy(retbuf + li - fi + 2, filename, strlen(filename) + 1); return retbuf; } else { return filename; } } void* dlopen(const char* filename, int flags) { static char has_callback = 0; if (!has_callback) { _dyld_register_func_for_add_image(dlshim_image_callback); } if (!filename) { return &dl_self; } else { struct mach_header* img = NULL; if (!img) img = NSAddImage(filename, NSADDIMAGE_OPTION_RETURN_ON_ERROR); if (!img) img = NSAddImage(filename, NSADDIMAGE_OPTION_RETURN_ON_ERROR | NSADDIMAGE_OPTION_WITH_SEARCHING); if (!img) { NSObjectFileImage fileImage; callback_count = 0; last_header = NULL; if (NSCreateObjectFileImageFromFile(filename, &fileImage) == NSObjectFileImageSuccess) { NSLinkModule(fileImage, filename, NSLINKMODULE_OPTION_BINDNOW | ((flags & RTLD_GLOBAL)?NSLINKMODULE_OPTION_PRIVATE:0) | NSLINKMODULE_OPTION_RETURN_ON_ERROR); if (callback_count && last_header) img = last_header; } } if (!img) { NSObjectFileImage fileImage; int i, maxi; char* prefixfilename; maxi = lib_path_count(); for (i = 0; i < maxi && !img; i++) { prefixfilename = lib_path_prefixify(i, filename); callback_count = 0; last_header = NULL; if (NSCreateObjectFileImageFromFile(prefixfilename, &fileImage) == NSObjectFileImageSuccess) { NSLinkModule(fileImage, filename, NSLINKMODULE_OPTION_BINDNOW | ((flags & RTLD_GLOBAL)?NSLINKMODULE_OPTION_PRIVATE:0) | NSLINKMODULE_OPTION_RETURN_ON_ERROR); if (callback_count && last_header) img = last_header; } } } if (img) { if (flags & RTLD_NOW) { NSLookupSymbolInImage(img, "", NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); } if (NSIsSymbolNameDefinedInImage(img, "__init")) { NSSymbol* initsymbol; void (*initfunc) (void); initsymbol = NSLookupSymbolInImage(img, "__init", 0); initfunc = NSAddressOfSymbol(initsymbol); initfunc(); } } return img; } } const char* dlerror() { static char* errbuf = NULL; NSLinkEditErrors a; int b; char *c, *d; NSLinkEditError(&a, &b, &c, &d); if (!errbuf) { errbuf = (char*) malloc(256*sizeof(char)); } snprintf(errbuf, 255, "%s in %s: %d %d", c, d, a, b); return errbuf; } void* dlsym(void* handle, char* symbol) { if (handle == &dl_self) { if (NSIsSymbolNameDefined(symbol)) { NSSymbol* retsym; retsym = NSLookupAndBindSymbol(symbol); return NSAddressOfSymbol(retsym); } else { return NULL; } } else { if (NSIsSymbolNameDefinedInImage(handle, symbol)) { NSSymbol* retsym; retsym = NSLookupSymbolInImage(handle, symbol, 0); return NSAddressOfSymbol(retsym); } else { return NULL; } } } int dlclose(void *handle) { /* dlclose is not implemented, and never will be for dylibs. * return -1 to signal an error; it's not used by SBCL anyhow */ return -1; } Index: Config.ppc-darwin =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/Config.ppc-darwin,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- Config.ppc-darwin 29 Jul 2003 13:01:56 -0000 1.1 +++ Config.ppc-darwin 16 Aug 2003 21:46:30 -0000 1.2 @@ -1,19 +1,17 @@ # -*- makefile -*- -CFLAGS = -ggdb -Wall -O3 -traditional-cpp -OS_SRC = bsd-os.c os-common.c ppc-darwin-os.c -OS_LIBS = -lSystem -lc -lm /sw/lib/libdl.a +CFLAGS = -DDARWIN -Dppc -g -Wall -O3 -no-cpp-precomp +OS_SRC = bsd-os.c os-common.c ppc-darwin-os.c ppc-darwin-dlshim.c +OS_LIBS = -lSystem -lc -lm + +# Avoid the dreaded gcc 3.3 prerelease tarpit of death! +CC = gcc3 ASSEM_SRC = ppc-assem.S ldso-stubs.S ARCH_SRC = ppc-arch.c -CPP = cpp -traditional-cpp +CPP = cpp -no-cpp-precomp -# Until sbcl-0.6.7.3, we used "OS_LINK_FLAGS=-static" here, which -# worked fine for most things, but LOAD-FOREIGN & friends require -# dlopen() etc., which in turn depend on dynamic linking of the -# runtime. -OS_LINK_FLAGS = -dynamic -L/sw/lib +OS_LINK_FLAGS = -dynamic -L$(HOME)/local/lib -L/sw/lib -L/opt/local/lib -L/usr/local/lib GC_SRC= cheneygc.c -CFLAGS=-DDARWIN -Dppc -g -traditional-cpp Index: ldso-stubs.S =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/ldso-stubs.S,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- ldso-stubs.S 29 Jul 2003 13:01:56 -0000 1.18 +++ ldso-stubs.S 16 Aug 2003 21:46:30 -0000 1.19 @@ -123,10 +123,12 @@ LDSO_STUBIFY(connect) LDSO_STUBIFY(cosh) LDSO_STUBIFY(creat) +#ifndef LISP_FEATURE_DARWIN LDSO_STUBIFY(dlclose) LDSO_STUBIFY(dlerror) LDSO_STUBIFY(dlopen) LDSO_STUBIFY(dlsym) +#endif LDSO_STUBIFY(dup) LDSO_STUBIFY(dup2) LDSO_STUBIFY(execve) Index: ppc-darwin-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/ppc-darwin-os.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- ppc-darwin-os.c 29 Jul 2003 13:01:56 -0000 1.1 +++ ppc-darwin-os.c 16 Aug 2003 21:46:30 -0000 1.2 @@ -1,3 +1,20 @@ +/* + * This is the PowerPC/Darwin incarnation of arch-dependent + * OS-dependent routines. See also "bsdos.c". + */ + +/* + * This software is part of the SBCL system. See the README file for + * more information. + * + * This software is derived from the CMU CL system, which was + * written at Carnegie Mellon University and released into the + * public domain. The software is in the public domain and is + * provided with absolutely no warranty. See the COPYING and CREDITS + * files for more information. + */ + + #include "globals.h" #include <signal.h> #include <ucontext.h> |