From: Cyrus Harmon Date: Thu, 31 Aug 2006 07:48:06 +0000 (+0000) Subject: 0.9.16.7: renamed ppc-darwin-{langinfo,dlshim} to X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=28ed41eb0eed3f0c1baeebf10793a3d21cb0eb9d;p=sbcl.git 0.9.16.7: renamed ppc-darwin-{langinfo,dlshim} to darwin-{langinfo,dlshim} * removed ppc-darwin-dlshim.{c,h} * removed ppc-darwin-langinfo.{c,h} * removed x86-darwin-langinfo.c * added darwin-dlshim.{c,h} * added darwin-langinfo.{c,h} * fixed references to these in Config.x86-darwin and Config.ppc-darwin * fixed references to these in grovel-headers.c --- diff --git a/src/runtime/Config.ppc-darwin b/src/runtime/Config.ppc-darwin index c7d0dec..5c8d34c 100644 --- a/src/runtime/Config.ppc-darwin +++ b/src/runtime/Config.ppc-darwin @@ -10,7 +10,7 @@ # files for more information. CFLAGS = -g -Wall -O2 -fdollars-in-identifiers -OS_SRC = bsd-os.c darwin-os.c ppc-darwin-os.c ppc-darwin-dlshim.c ppc-darwin-langinfo.c +OS_SRC = bsd-os.c darwin-os.c ppc-darwin-os.c darwin-dlshim.c darwin-langinfo.c OS_LIBS = -lSystem -lc OS_OBJS = ppc-darwin-rospace.o diff --git a/src/runtime/Config.x86-darwin b/src/runtime/Config.x86-darwin index 1937452..e6e92b6 100644 --- a/src/runtime/Config.x86-darwin +++ b/src/runtime/Config.x86-darwin @@ -10,7 +10,7 @@ # files for more information. CFLAGS = -g -Wall -O2 -fdollars-in-identifiers -OS_SRC = bsd-os.c x86-bsd-os.c darwin-os.c x86-darwin-os.c ppc-darwin-dlshim.c x86-darwin-langinfo.c +OS_SRC = bsd-os.c x86-bsd-os.c darwin-os.c x86-darwin-os.c darwin-dlshim.c darwin-langinfo.c OS_LIBS = -lSystem -lc -ldl OS_OBJS = x86-darwin-rospace.o diff --git a/src/runtime/darwin-dlshim.c b/src/runtime/darwin-dlshim.c new file mode 100644 index 0000000..5f49459 --- /dev/null +++ b/src/runtime/darwin-dlshim.c @@ -0,0 +1,232 @@ +/* + * 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 +#include +#include +#include +#include "darwin-dlshim.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 */ + +static int callback_count; +static struct mach_header* last_header; + +#define DLSYM_ERROR 1 +#define DLOPEN_ERROR 2 + +static int last_error = 0; + +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; + } +} + +const 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 { + const 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; + const 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(); + } + } else + last_error = DLOPEN_ERROR; + return img; + } +} + +const char* +dlerror() +{ + NSLinkEditErrors c; + int errorNumber; + const char *fileName, *errorString; + char *result = NULL; + + if (last_error) { + NSLinkEditError(&c, &errorNumber, &fileName, &errorString); + /* The errorString obtained by the above is too verbose for + * our needs, so we just translate the errno. + * + * We also have simple fallbacks in case we've somehow lost + * the context before this point. */ + if (errorNumber) { + result = strerror(errorNumber); + } else if (DLSYM_ERROR == last_error) { + result = "dlsym(3) failed"; + } else if (DLOPEN_ERROR == last_error) { + result = "dlopen(3) failed"; + } + last_error = 0; + } + + return result; +} + +void* +dlsym(void* handle, char* symbol) +{ + if (handle == &dl_self) { + if (NSIsSymbolNameDefined(symbol)) { + NSSymbol* retsym; + retsym = NSLookupAndBindSymbol(symbol); + return NSAddressOfSymbol(retsym); + } else { + last_error = DLSYM_ERROR; + return NULL; + } + } else { + if (NSIsSymbolNameDefinedInImage(handle, symbol)) { + NSSymbol* retsym; + retsym = NSLookupSymbolInImage(handle, symbol, 0); + return NSAddressOfSymbol(retsym); + } else { + last_error = DLSYM_ERROR; + 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; +} diff --git a/src/runtime/darwin-dlshim.h b/src/runtime/darwin-dlshim.h new file mode 100644 index 0000000..1c9128e --- /dev/null +++ b/src/runtime/darwin-dlshim.h @@ -0,0 +1,24 @@ +/* + * 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. + */ + +#ifndef PPC_DARWIN_DLSHIM_H +#define PPC_DARWIN_DLSHIM_H + +#define RTLD_LAZY 1 +#define RTLD_NOW 2 +#define RTLD_GLOBAL 0x100 + +#endif /* PPC_DARWIN_DLSHIM_H */ diff --git a/src/runtime/darwin-langinfo.c b/src/runtime/darwin-langinfo.c new file mode 100644 index 0000000..c1be651 --- /dev/null +++ b/src/runtime/darwin-langinfo.c @@ -0,0 +1,45 @@ +/* + * This is a minimal nl_langinfo replacement that only handles CODESET. + * By default, it returns UTF-8. It checks if LC_CTYPE or LANG are set, and + * uses LATIN-1 if it finds one set to C, or UTF-8 if it finds one set to + * anything else. + */ + +/* + * 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 +#include "darwin-langinfo.h" + +char *nl_langinfo(nl_item item) +{ + char *nada = "", *utf8 = "UTF-8", *latin1 = "LATIN-1"; + + if (item != CODESET) { + return nada; + } else { + char *ctype = getenv ("LC_CTYPE"); + + if ((ctype != NULL) && (!strcmp(ctype, "C"))) { + return latin1; + } else if (ctype != NULL) { + return utf8; + } else { + char *lang = getenv ("LANG"); + + if ((lang != NULL) && (!strcmp(lang, "C"))) { + return latin1; + } else { + return utf8; + } + } + } +} diff --git a/src/runtime/darwin-langinfo.h b/src/runtime/darwin-langinfo.h new file mode 100644 index 0000000..bb96a8a --- /dev/null +++ b/src/runtime/darwin-langinfo.h @@ -0,0 +1,20 @@ +/* + * 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. + */ + +#ifndef PPC_DARWIN_LANGINFO_H +#define PPC_DARWIN_LANGINFO_H + +#define CODESET 49 + +typedef int nl_item; +char *nl_langinfo (nl_item); + +#endif /* PPC_DARWIN_LANGINFO_H */ diff --git a/tools-for-build/grovel-headers.c b/tools-for-build/grovel-headers.c index 3503f5c..6ea5763 100644 --- a/tools-for-build/grovel-headers.c +++ b/tools-for-build/grovel-headers.c @@ -31,8 +31,8 @@ #include #include #ifdef __APPLE_CC__ - #include "../src/runtime/ppc-darwin-dlshim.h" - #include "../src/runtime/ppc-darwin-langinfo.h" + #include "../src/runtime/darwin-dlshim.h" + #include "../src/runtime/darwin-langinfo.h" #else #include #include diff --git a/version.lisp-expr b/version.lisp-expr index d2080d2..97e2fb4 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,5 +17,5 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.9.16.6" +"0.9.16.7"