Mercurial > sdl-ios-xcode
diff src/loadso/macosx/SDL_dlcompat.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | e308d020d315 |
children | e1da92da346c |
line wrap: on
line diff
--- a/src/loadso/macosx/SDL_dlcompat.c Thu Jul 06 18:01:37 2006 +0000 +++ b/src/loadso/macosx/SDL_dlcompat.c Mon Jul 10 21:04:37 2006 +0000 @@ -85,7 +85,8 @@ /*include "dlfcn.h"*/ #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif #if defined (__GNUC__) && __GNUC__ > 3 @@ -99,21 +100,24 @@ /* * Structure filled in by dladdr(). */ -typedef struct SDL_OSX_dl_info { - const char *dli_fname; /* Pathname of shared object */ - void *dli_fbase; /* Base address of shared object */ - const char *dli_sname; /* Name of nearest symbol */ - void *dli_saddr; /* Address of nearest symbol */ -} SDL_OSX_Dl_info; + typedef struct SDL_OSX_dl_info + { + const char *dli_fname; /* Pathname of shared object */ + void *dli_fbase; /* Base address of shared object */ + const char *dli_sname; /* Name of nearest symbol */ + void *dli_saddr; /* Address of nearest symbol */ + } SDL_OSX_Dl_info; -static int SDL_OSX_dladdr(const void * dl_restrict, SDL_OSX_Dl_info * dl_restrict); -#endif /* ! _POSIX_SOURCE */ -#endif /* 0 */ + static int SDL_OSX_dladdr(const void *dl_restrict, + SDL_OSX_Dl_info * dl_restrict); +#endif /* ! _POSIX_SOURCE */ +#endif /* 0 */ -static int SDL_OSX_dlclose(void * handle); -static const char * SDL_OSX_dlerror(void); -static void * SDL_OSX_dlopen(const char *path, int mode); -static void * SDL_OSX_dlsym(void * dl_restrict handle, const char * dl_restrict symbol); + static int SDL_OSX_dlclose(void *handle); + static const char *SDL_OSX_dlerror(void); + static void *SDL_OSX_dlopen(const char *path, int mode); + static void *SDL_OSX_dlsym(void *dl_restrict handle, + const char *dl_restrict symbol); #define RTLD_LAZY 0x1 #define RTLD_NOW 0x2 @@ -127,9 +131,9 @@ /* * Special handle arguments for SDL_OSX_dlsym(). */ -#define RTLD_NEXT ((void *) -1) /* Search subsequent objects. */ -#define RTLD_DEFAULT ((void *) -2) /* Use default search algorithm. */ -#endif /* ! _POSIX_SOURCE */ +#define RTLD_NEXT ((void *) -1) /* Search subsequent objects. */ +#define RTLD_DEFAULT ((void *) -2) /* Use default search algorithm. */ +#endif /* ! _POSIX_SOURCE */ #ifdef __cplusplus } @@ -162,10 +166,13 @@ #define NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR 0x4 #endif /* These symbols will be looked for in dyld */ -static const struct mach_header *(*dyld_NSAddImage) (const char *, unsigned long) = 0; -static int (*dyld_NSIsSymbolNameDefinedInImage) (const struct mach_header *, const char *) = 0; -static NSSymbol(*dyld_NSLookupSymbolInImage) - (const struct mach_header *, const char *, unsigned long) = 0; +static const struct mach_header *(*dyld_NSAddImage) (const char *, + unsigned long) = 0; +static int (*dyld_NSIsSymbolNameDefinedInImage) (const struct mach_header *, + const char *) = 0; +static NSSymbol(*dyld_NSLookupSymbolInImage) (const struct mach_header *, + const char *, unsigned long) = + 0; /* Define this to make dlcompat reuse data block. This way in theory we save * a little bit of overhead. However we then couldn't correctly catch excess @@ -194,9 +201,9 @@ struct dlthread { - int lockcnt; - unsigned char errset; - char errstr[ERR_STR_LEN]; + int lockcnt; + unsigned char errset; + char errstr[ERR_STR_LEN]; }; /* This is our central data structure. Whenever a module is loaded via @@ -204,18 +211,19 @@ */ struct dlstatus { - struct dlstatus *next; /* pointer to next element in the linked list */ - NSModule module; - const struct mach_header *lib; - int refs; /* reference count */ - int mode; /* mode in which this module was loaded */ - dev_t device; - ino_t inode; - int flags; /* Any internal flags we may need */ + struct dlstatus *next; /* pointer to next element in the linked list */ + NSModule module; + const struct mach_header *lib; + int refs; /* reference count */ + int mode; /* mode in which this module was loaded */ + dev_t device; + ino_t inode; + int flags; /* Any internal flags we may need */ }; /* Head node of the dlstatus list */ -static struct dlstatus mainStatus = { 0, MAGIC_DYLIB_MOD, NULL, -1, RTLD_GLOBAL, 0, 0, 0 }; +static struct dlstatus mainStatus = + { 0, MAGIC_DYLIB_MOD, NULL, -1, RTLD_GLOBAL, 0, 0, 0 }; static struct dlstatus *stqueue = &mainStatus; @@ -237,10 +245,13 @@ static void insertStatus(struct dlstatus *dls, const struct stat *sbuf); static int promoteLocalToGlobal(struct dlstatus *dls); static void *reference(struct dlstatus *dls, int mode); -static void *dlsymIntern(struct dlstatus *dls, const char *symbol, int canSetError); +static void *dlsymIntern(struct dlstatus *dls, const char *symbol, + int canSetError); static struct dlstatus *allocStatus(void); -static struct dlstatus *loadModule(const char *path, const struct stat *sbuf, int mode); -static NSSymbol search_linked_libs(const struct mach_header *mh, const char *symbol); +static struct dlstatus *loadModule(const char *path, const struct stat *sbuf, + int mode); +static NSSymbol search_linked_libs(const struct mach_header *mh, + const char *symbol); static const char *get_lib_name(const struct mach_header *mh); static const struct mach_header *get_mach_header_from_NSModule(NSModule mod); static void dlcompat_init_func(void); @@ -259,96 +270,98 @@ static void *dlsym_auto_underscore(void *handle, const char *symbol); /* And their _intern counterparts */ -static void *dlsym_prepend_underscore_intern(void *handle, const char *symbol); +static void *dlsym_prepend_underscore_intern(void *handle, + const char *symbol); static void *dlsym_auto_underscore_intern(void *handle, const char *symbol); #endif /* Functions */ -static void debug(const char *fmt, ...) +static void +debug(const char *fmt, ...) { #if DEBUG > 1 - va_list arg; - va_start(arg, fmt); - fprintf(stderr, "DLDEBUG: "); - vfprintf(stderr, fmt, arg); - fprintf(stderr, "\n"); - fflush(stderr); - va_end(arg); + va_list arg; + va_start(arg, fmt); + fprintf(stderr, "DLDEBUG: "); + vfprintf(stderr, fmt, arg); + fprintf(stderr, "\n"); + fflush(stderr); + va_end(arg); #endif } -static void error(const char *str, ...) +static void +error(const char *str, ...) { - va_list arg; - struct dlthread *tss; - char * err_str; - va_start(arg, str); - tss = pthread_getspecific(dlerror_key); - err_str = tss->errstr; - SDL_strlcpy(err_str, "dlcompat: ", ERR_STR_LEN); - vsnprintf(err_str + 10, ERR_STR_LEN - 10, str, arg); - va_end(arg); - debug("ERROR: %s\n", err_str); - tss->errset = 1; + va_list arg; + struct dlthread *tss; + char *err_str; + va_start(arg, str); + tss = pthread_getspecific(dlerror_key); + err_str = tss->errstr; + SDL_strlcpy(err_str, "dlcompat: ", ERR_STR_LEN); + vsnprintf(err_str + 10, ERR_STR_LEN - 10, str, arg); + va_end(arg); + debug("ERROR: %s\n", err_str); + tss->errset = 1; } -static void warning(const char *str) +static void +warning(const char *str) { #if DEBUG > 0 - fprintf(stderr, "WARNING: dlcompat: %s\n", str); + fprintf(stderr, "WARNING: dlcompat: %s\n", str); #endif } -static const char *safegetenv(const char *s) +static const char * +safegetenv(const char *s) { - const char *ss = SDL_getenv(s); - return ss ? ss : ""; + const char *ss = SDL_getenv(s); + return ss ? ss : ""; } /* because this is only used for debugging and error reporting functions, we * don't really care about how elegant it is... it could use the load * commands to find the install name of the library, but... */ -static const char *get_lib_name(const struct mach_header *mh) +static const char * +get_lib_name(const struct mach_header *mh) { - unsigned long count = _dyld_image_count(); - unsigned long i; - const char *val = NULL; - if (mh) - { - for (i = 0; i < count; i++) - { - if (mh == _dyld_get_image_header(i)) - { - val = _dyld_get_image_name(i); - break; - } - } - } - return val; + unsigned long count = _dyld_image_count(); + unsigned long i; + const char *val = NULL; + if (mh) { + for (i = 0; i < count; i++) { + if (mh == _dyld_get_image_header(i)) { + val = _dyld_get_image_name(i); + break; + } + } + } + return val; } /* Returns the mach_header for the module bu going through all the loaded images * and finding the one with the same name as the module. There really ought to be * an api for doing this, would be faster, but there isn't one right now */ -static const struct mach_header *get_mach_header_from_NSModule(NSModule mod) +static const struct mach_header * +get_mach_header_from_NSModule(NSModule mod) { - const char *mod_name = NSNameOfModule(mod); - const struct mach_header *mh = NULL; - unsigned long count = _dyld_image_count(); - unsigned long i; - debug("Module name: %s", mod_name); - for (i = 0; i < count; i++) - { - if (!SDL_strcmp(mod_name, _dyld_get_image_name(i))) - { - mh = _dyld_get_image_header(i); - break; - } - } - return mh; + const char *mod_name = NSNameOfModule(mod); + const struct mach_header *mh = NULL; + unsigned long count = _dyld_image_count(); + unsigned long i; + debug("Module name: %s", mod_name); + for (i = 0; i < count; i++) { + if (!SDL_strcmp(mod_name, _dyld_get_image_name(i))) { + mh = _dyld_get_image_header(i); + break; + } + } + return mh; } @@ -360,225 +373,224 @@ * into one big string, which we then can easily parse. * Splitting this string into the actual path list is done by getSearchPath() */ -static const char *searchList() +static const char * +searchList() { - size_t buf_size; - static char *buf=NULL; - const char *ldlp = safegetenv("LD_LIBRARY_PATH"); - const char *dyldlp = safegetenv("DYLD_LIBRARY_PATH"); - const char *stdpath = SDL_getenv("DYLD_FALLBACK_LIBRARY_PATH"); - if (!stdpath) - stdpath = "/usr/local/lib:/lib:/usr/lib"; - if (!buf) - { - buf_size = SDL_strlen(ldlp) + SDL_strlen(dyldlp) + SDL_strlen(stdpath) + 4; - buf = SDL_malloc(buf_size); - SDL_snprintf(buf, buf_size, "%s%s%s%s%s%c", dyldlp, (dyldlp[0] ? ":" : ""), ldlp, (ldlp[0] ? ":" : ""), - stdpath, '\0'); - } - return buf; + size_t buf_size; + static char *buf = NULL; + const char *ldlp = safegetenv("LD_LIBRARY_PATH"); + const char *dyldlp = safegetenv("DYLD_LIBRARY_PATH"); + const char *stdpath = SDL_getenv("DYLD_FALLBACK_LIBRARY_PATH"); + if (!stdpath) + stdpath = "/usr/local/lib:/lib:/usr/lib"; + if (!buf) { + buf_size = + SDL_strlen(ldlp) + SDL_strlen(dyldlp) + SDL_strlen(stdpath) + 4; + buf = SDL_malloc(buf_size); + SDL_snprintf(buf, buf_size, "%s%s%s%s%s%c", dyldlp, + (dyldlp[0] ? ":" : ""), ldlp, (ldlp[0] ? ":" : ""), + stdpath, '\0'); + } + return buf; } /* Returns the ith search path from the list as computed by searchList() */ -static const char *getSearchPath(int i) +static const char * +getSearchPath(int i) { - static const char *list = 0; - static char **path = (char **)0; - static int end = 0; - static int numsize = MAX_SEARCH_PATHS; - static char **tmp; - /* So we can call SDL_free() in the "destructor" we use i=-1 to return the alloc'd array */ - if (i == -1) - { - return (const char*)path; - } - if (!path) - { - path = (char **)SDL_calloc(MAX_SEARCH_PATHS, sizeof(char **)); - } - if (!list && !end) - list = searchList(); - if (i >= (numsize)) - { - debug("Increasing size for long PATH"); - tmp = (char **)SDL_calloc((MAX_SEARCH_PATHS + numsize), sizeof(char **)); - if (tmp) - { - SDL_memcpy(tmp, path, sizeof(char **) * numsize); - SDL_free(path); - path = tmp; - numsize += MAX_SEARCH_PATHS; - } - else - { - return 0; - } - } + static const char *list = 0; + static char **path = (char **) 0; + static int end = 0; + static int numsize = MAX_SEARCH_PATHS; + static char **tmp; + /* So we can call SDL_free() in the "destructor" we use i=-1 to return the alloc'd array */ + if (i == -1) { + return (const char *) path; + } + if (!path) { + path = (char **) SDL_calloc(MAX_SEARCH_PATHS, sizeof(char **)); + } + if (!list && !end) + list = searchList(); + if (i >= (numsize)) { + debug("Increasing size for long PATH"); + tmp = + (char **) SDL_calloc((MAX_SEARCH_PATHS + numsize), + sizeof(char **)); + if (tmp) { + SDL_memcpy(tmp, path, sizeof(char **) * numsize); + SDL_free(path); + path = tmp; + numsize += MAX_SEARCH_PATHS; + } else { + return 0; + } + } - while (!path[i] && !end) - { - path[i] = strsep((char **)&list, ":"); + while (!path[i] && !end) { + path[i] = strsep((char **) &list, ":"); - if (path[i][0] == 0) - path[i] = 0; - end = (list == 0); - } - return path[i]; + if (path[i][0] == 0) + path[i] = 0; + end = (list == 0); + } + return path[i]; } -static const char *getFullPath(int i, const char *file) +static const char * +getFullPath(int i, const char *file) { - static char buf[PATH_MAX]; - const char *path = getSearchPath(i); - if (path) - { - SDL_snprintf(buf, PATH_MAX, "%s/%s", path, file); - } - return path ? buf : 0; + static char buf[PATH_MAX]; + const char *path = getSearchPath(i); + if (path) { + SDL_snprintf(buf, PATH_MAX, "%s/%s", path, file); + } + return path ? buf : 0; } /* Given a file name, try to determine the full path for that file. Starts * its search in the current directory, and then tries all paths in the * search list in the order they are specified there. */ -static const struct stat *findFile(const char *file, const char **fullPath) +static const struct stat * +findFile(const char *file, const char **fullPath) { - int i = 0; - static struct stat sbuf; - char *fileName; - debug("finding file %s", file); - *fullPath = file; - if (0 == stat(file, &sbuf)) - return &sbuf; - if (SDL_strchr(file, '/')) - return 0; /* If the path had a / we don't look in env var places */ - fileName = NULL; - if (!fileName) - fileName = (char *)file; - while ((*fullPath = getFullPath(i++, fileName))) - { - if (0 == stat(*fullPath, &sbuf)) - return &sbuf; - } - ; - return 0; + int i = 0; + static struct stat sbuf; + char *fileName; + debug("finding file %s", file); + *fullPath = file; + if (0 == stat(file, &sbuf)) + return &sbuf; + if (SDL_strchr(file, '/')) + return 0; /* If the path had a / we don't look in env var places */ + fileName = NULL; + if (!fileName) + fileName = (char *) file; + while ((*fullPath = getFullPath(i++, fileName))) { + if (0 == stat(*fullPath, &sbuf)) + return &sbuf; + } + ; + return 0; } /* Determine whether a given dlstatus is valid or not */ -static int isValidStatus(struct dlstatus *status) +static int +isValidStatus(struct dlstatus *status) { - /* Walk the list to verify status is contained in it */ - struct dlstatus *dls = stqueue; - while (dls && status != dls) - dls = dls->next; - if (dls == 0) - error("invalid handle"); - else if ((dls->module == 0) || (dls->refs == 0)) - error("handle to closed library"); - else - return TRUE; - return FALSE; + /* Walk the list to verify status is contained in it */ + struct dlstatus *dls = stqueue; + while (dls && status != dls) + dls = dls->next; + if (dls == 0) + error("invalid handle"); + else if ((dls->module == 0) || (dls->refs == 0)) + error("handle to closed library"); + else + return TRUE; + return FALSE; } -static inline int isFlagSet(int mode, int flag) +static inline int +isFlagSet(int mode, int flag) { - return (mode & flag) == flag; + return (mode & flag) == flag; } -static struct dlstatus *lookupStatus(const struct stat *sbuf) +static struct dlstatus * +lookupStatus(const struct stat *sbuf) { - struct dlstatus *dls = stqueue; - debug("looking for status"); - while (dls && ( /* isFlagSet(dls->mode, RTLD_UNSHARED) */ 0 - || sbuf->st_dev != dls->device || sbuf->st_ino != dls->inode)) - dls = dls->next; - return dls; + struct dlstatus *dls = stqueue; + debug("looking for status"); + while (dls && ( /* isFlagSet(dls->mode, RTLD_UNSHARED) */ 0 + || sbuf->st_dev != dls->device + || sbuf->st_ino != dls->inode)) + dls = dls->next; + return dls; } -static void insertStatus(struct dlstatus *dls, const struct stat *sbuf) +static void +insertStatus(struct dlstatus *dls, const struct stat *sbuf) { - debug("inserting status"); - dls->inode = sbuf->st_ino; - dls->device = sbuf->st_dev; - dls->refs = 0; - dls->mode = 0; - if ((dls->flags & DL_IN_LIST) == 0) - { - dls->next = stqueue; - stqueue = dls; - dls->flags |= DL_IN_LIST; - } + debug("inserting status"); + dls->inode = sbuf->st_ino; + dls->device = sbuf->st_dev; + dls->refs = 0; + dls->mode = 0; + if ((dls->flags & DL_IN_LIST) == 0) { + dls->next = stqueue; + stqueue = dls; + dls->flags |= DL_IN_LIST; + } } -static struct dlstatus *allocStatus() +static struct dlstatus * +allocStatus() { - struct dlstatus *dls; + struct dlstatus *dls; #ifdef REUSE_STATUS - dls = stqueue; - while (dls && dls->module) - dls = dls->next; - if (!dls) + dls = stqueue; + while (dls && dls->module) + dls = dls->next; + if (!dls) #endif - dls = SDL_calloc(sizeof(*dls),1); - return dls; + dls = SDL_calloc(sizeof(*dls), 1); + return dls; } -static int promoteLocalToGlobal(struct dlstatus *dls) +static int +promoteLocalToGlobal(struct dlstatus *dls) { - static int (*p) (NSModule module) = 0; - debug("promoting"); - if (!p) - _dyld_func_lookup("__dyld_NSMakePrivateModulePublic", (void **)&p); - return (dls->module == MAGIC_DYLIB_MOD) || (p && p(dls->module)); + static int (*p) (NSModule module) = 0; + debug("promoting"); + if (!p) + _dyld_func_lookup("__dyld_NSMakePrivateModulePublic", (void **) &p); + return (dls->module == MAGIC_DYLIB_MOD) || (p && p(dls->module)); } -static void *reference(struct dlstatus *dls, int mode) +static void * +reference(struct dlstatus *dls, int mode) { - if (dls) - { - if (dls->module == MAGIC_DYLIB_MOD && isFlagSet(mode, RTLD_LOCAL)) - { - warning("trying to open a .dylib with RTLD_LOCAL"); - error("unable to open a .dylib with RTLD_LOCAL"); - return NULL; - } - if (isFlagSet(mode, RTLD_GLOBAL) && - !isFlagSet(dls->mode, RTLD_GLOBAL) && !promoteLocalToGlobal(dls)) - { - error("unable to promote local module to global"); - return NULL; - } - dls->mode |= mode; - dls->refs++; - } - else - debug("reference called with NULL argument"); + if (dls) { + if (dls->module == MAGIC_DYLIB_MOD && isFlagSet(mode, RTLD_LOCAL)) { + warning("trying to open a .dylib with RTLD_LOCAL"); + error("unable to open a .dylib with RTLD_LOCAL"); + return NULL; + } + if (isFlagSet(mode, RTLD_GLOBAL) && !isFlagSet(dls->mode, RTLD_GLOBAL) + && !promoteLocalToGlobal(dls)) { + error("unable to promote local module to global"); + return NULL; + } + dls->mode |= mode; + dls->refs++; + } else + debug("reference called with NULL argument"); - return dls; + return dls; } -static const struct mach_header *my_find_image(const char *name) +static const struct mach_header * +my_find_image(const char *name) { - const struct mach_header *mh = 0; - const char *id = NULL; - int i = _dyld_image_count(); - int j; - mh = (struct mach_header *) - dyld_NSAddImage(name, NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED | - NSADDIMAGE_OPTION_RETURN_ON_ERROR); - if (!mh) - { - for (j = 0; j < i; j++) - { - id = _dyld_get_image_name(j); - if (!SDL_strcmp(id, name)) - { - mh = _dyld_get_image_header(j); - break; - } - } - } - return mh; + const struct mach_header *mh = 0; + const char *id = NULL; + int i = _dyld_image_count(); + int j; + mh = (struct mach_header *) + dyld_NSAddImage(name, NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED | + NSADDIMAGE_OPTION_RETURN_ON_ERROR); + if (!mh) { + for (j = 0; j < i; j++) { + id = _dyld_get_image_name(j); + if (!SDL_strcmp(id, name)) { + mh = _dyld_get_image_header(j); + break; + } + } + } + return mh; } /* @@ -587,468 +599,440 @@ * bother adding the extra dependencies, if the symbols are neither in the loaded image nor * any of it's direct dependencies, then it probably isn't there. */ -static NSSymbol search_linked_libs(const struct mach_header * mh, const char *symbol) +static NSSymbol +search_linked_libs(const struct mach_header *mh, const char *symbol) { - unsigned int n; - struct load_command *lc = 0; - struct mach_header *wh; - NSSymbol nssym = 0; - if (dyld_NSAddImage && dyld_NSIsSymbolNameDefinedInImage && dyld_NSLookupSymbolInImage) - { - lc = (struct load_command *)((char *)mh + sizeof(struct mach_header)); - for (n = 0; n < mh->ncmds; n++, lc = (struct load_command *)((char *)lc + lc->cmdsize)) - { - if ((LC_LOAD_DYLIB == lc->cmd) || (LC_LOAD_WEAK_DYLIB == lc->cmd)) - { - if ((wh = (struct mach_header *) - my_find_image((char *)(((struct dylib_command *)lc)->dylib.name.offset + - (char *)lc)))) - { - if (dyld_NSIsSymbolNameDefinedInImage(wh, symbol)) - { - nssym = dyld_NSLookupSymbolInImage(wh, - symbol, - NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | - NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); - break; - } - } - } - } - if ((!nssym) && NSIsSymbolNameDefined(symbol)) - { - /* I've never seen this debug message...*/ - debug("Symbol \"%s\" is defined but was not found", symbol); - } - } - return nssym; + unsigned int n; + struct load_command *lc = 0; + struct mach_header *wh; + NSSymbol nssym = 0; + if (dyld_NSAddImage && dyld_NSIsSymbolNameDefinedInImage + && dyld_NSLookupSymbolInImage) { + lc = (struct load_command *) ((char *) mh + + sizeof(struct mach_header)); + for (n = 0; n < mh->ncmds; + n++, lc = (struct load_command *) ((char *) lc + lc->cmdsize)) { + if ((LC_LOAD_DYLIB == lc->cmd) + || (LC_LOAD_WEAK_DYLIB == lc->cmd)) { + if ((wh = (struct mach_header *) + my_find_image((char + *) (((struct dylib_command *) lc)-> + dylib.name.offset + (char *) lc)))) { + if (dyld_NSIsSymbolNameDefinedInImage(wh, symbol)) { + nssym = dyld_NSLookupSymbolInImage(wh, + symbol, + NSLOOKUPSYMBOLINIMAGE_OPTION_BIND + | + NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); + break; + } + } + } + } + if ((!nssym) && NSIsSymbolNameDefined(symbol)) { + /* I've never seen this debug message... */ + debug("Symbol \"%s\" is defined but was not found", symbol); + } + } + return nssym; } /* Up to the caller to SDL_free() returned string */ -static inline char *dyld_error_str() +static inline char * +dyld_error_str() { - NSLinkEditErrors dylder; - int dylderno; - const char *dylderrstr; - const char *dyldfile; - char* retStr = NULL; - NSLinkEditError(&dylder, &dylderno, &dyldfile, &dylderrstr); - if (dylderrstr && *dylderrstr) - { - retStr = SDL_strdup(dylderrstr); - } - return retStr; + NSLinkEditErrors dylder; + int dylderno; + const char *dylderrstr; + const char *dyldfile; + char *retStr = NULL; + NSLinkEditError(&dylder, &dylderno, &dyldfile, &dylderrstr); + if (dylderrstr && *dylderrstr) { + retStr = SDL_strdup(dylderrstr); + } + return retStr; } -static void *dlsymIntern(struct dlstatus *dls, const char *symbol, int canSetError) +static void * +dlsymIntern(struct dlstatus *dls, const char *symbol, int canSetError) { - NSSymbol nssym = 0; -#ifdef __GCC__ - void *caller = __builtin_return_address(1); /* Be *very* careful about inlining */ + NSSymbol nssym = 0; +#ifdef __GCC__ + void *caller = __builtin_return_address(1); /* Be *very* careful about inlining */ #else - void *caller = NULL; + void *caller = NULL; #endif - const struct mach_header *caller_mh = 0; - char *savedErrorStr = NULL; - resetdlerror(); + const struct mach_header *caller_mh = 0; + char *savedErrorStr = NULL; + resetdlerror(); #ifndef RTLD_SELF #define RTLD_SELF ((void *) -3) #endif - if (NULL == dls) - dls = RTLD_SELF; - if ((RTLD_NEXT == dls) || (RTLD_SELF == dls)) - { - if (dyld_NSIsSymbolNameDefinedInImage && dyld_NSLookupSymbolInImage && caller) - { - caller_mh = image_for_address(caller); - if (RTLD_SELF == dls) - { - /* FIXME: We should be using the NSModule api, if SELF is an MH_BUNDLE - * But it appears to work anyway, and looking at the code in dyld_libfuncs.c - * this is acceptable. - */ - if (dyld_NSIsSymbolNameDefinedInImage(caller_mh, symbol)) - { - nssym = dyld_NSLookupSymbolInImage(caller_mh, - symbol, - NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | - NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); - } - } - if (!nssym) - { - if (RTLD_SELF == dls) - savedErrorStr = dyld_error_str(); - nssym = search_linked_libs(caller_mh, symbol); - } - } - else - { - if (canSetError) - error("RTLD_SELF and RTLD_NEXT are not supported"); - return NULL; - } - } - if (!nssym) - { + if (NULL == dls) + dls = RTLD_SELF; + if ((RTLD_NEXT == dls) || (RTLD_SELF == dls)) { + if (dyld_NSIsSymbolNameDefinedInImage && dyld_NSLookupSymbolInImage + && caller) { + caller_mh = image_for_address(caller); + if (RTLD_SELF == dls) { + /* FIXME: We should be using the NSModule api, if SELF is an MH_BUNDLE + * But it appears to work anyway, and looking at the code in dyld_libfuncs.c + * this is acceptable. + */ + if (dyld_NSIsSymbolNameDefinedInImage(caller_mh, symbol)) { + nssym = dyld_NSLookupSymbolInImage(caller_mh, + symbol, + NSLOOKUPSYMBOLINIMAGE_OPTION_BIND + | + NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); + } + } + if (!nssym) { + if (RTLD_SELF == dls) + savedErrorStr = dyld_error_str(); + nssym = search_linked_libs(caller_mh, symbol); + } + } else { + if (canSetError) + error("RTLD_SELF and RTLD_NEXT are not supported"); + return NULL; + } + } + if (!nssym) { - if (RTLD_DEFAULT == dls) - { - dls = &mainStatus; - } - if (!isValidStatus(dls)) - return NULL; + if (RTLD_DEFAULT == dls) { + dls = &mainStatus; + } + if (!isValidStatus(dls)) + return NULL; - if (dls->module != MAGIC_DYLIB_MOD) - { - nssym = NSLookupSymbolInModule(dls->module, symbol); - if (!nssym && NSIsSymbolNameDefined(symbol)) - { - debug("Searching dependencies"); - savedErrorStr = dyld_error_str(); - nssym = search_linked_libs(get_mach_header_from_NSModule(dls->module), symbol); - } - } - else if (dls->lib && dyld_NSIsSymbolNameDefinedInImage && dyld_NSLookupSymbolInImage) - { - if (dyld_NSIsSymbolNameDefinedInImage(dls->lib, symbol)) - { - nssym = dyld_NSLookupSymbolInImage(dls->lib, - symbol, - NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | - NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); - } - else if (NSIsSymbolNameDefined(symbol)) - { - debug("Searching dependencies"); - savedErrorStr = dyld_error_str(); - nssym = search_linked_libs(dls->lib, symbol); - } - } - else if (dls->module == MAGIC_DYLIB_MOD) - { - /* Global context, use NSLookupAndBindSymbol */ - if (NSIsSymbolNameDefined(symbol)) - { - /* There doesn't seem to be a return on error option for this call??? - this is potentially broken, if binding fails, it will improperly - exit the application. */ - nssym = NSLookupAndBindSymbol(symbol); - } - else - { - if (savedErrorStr) - SDL_free(savedErrorStr); - savedErrorStr = SDL_malloc(256); - SDL_snprintf(savedErrorStr, 256, "Symbol \"%s\" not in global context",symbol); - } - } - } - /* Error reporting */ - if (!nssym) - { - if (!savedErrorStr || !SDL_strlen(savedErrorStr)) - { - if (savedErrorStr) - SDL_free(savedErrorStr); - savedErrorStr = SDL_malloc(256); - SDL_snprintf(savedErrorStr, 256,"Symbol \"%s\" not found",symbol); - } - if (canSetError) - { - error(savedErrorStr); - } - else - { - debug(savedErrorStr); - } - if (savedErrorStr) - SDL_free(savedErrorStr); - return NULL; - } - return NSAddressOfSymbol(nssym); + if (dls->module != MAGIC_DYLIB_MOD) { + nssym = NSLookupSymbolInModule(dls->module, symbol); + if (!nssym && NSIsSymbolNameDefined(symbol)) { + debug("Searching dependencies"); + savedErrorStr = dyld_error_str(); + nssym = + search_linked_libs(get_mach_header_from_NSModule + (dls->module), symbol); + } + } else if (dls->lib && dyld_NSIsSymbolNameDefinedInImage + && dyld_NSLookupSymbolInImage) { + if (dyld_NSIsSymbolNameDefinedInImage(dls->lib, symbol)) { + nssym = dyld_NSLookupSymbolInImage(dls->lib, + symbol, + NSLOOKUPSYMBOLINIMAGE_OPTION_BIND + | + NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); + } else if (NSIsSymbolNameDefined(symbol)) { + debug("Searching dependencies"); + savedErrorStr = dyld_error_str(); + nssym = search_linked_libs(dls->lib, symbol); + } + } else if (dls->module == MAGIC_DYLIB_MOD) { + /* Global context, use NSLookupAndBindSymbol */ + if (NSIsSymbolNameDefined(symbol)) { + /* There doesn't seem to be a return on error option for this call??? + this is potentially broken, if binding fails, it will improperly + exit the application. */ + nssym = NSLookupAndBindSymbol(symbol); + } else { + if (savedErrorStr) + SDL_free(savedErrorStr); + savedErrorStr = SDL_malloc(256); + SDL_snprintf(savedErrorStr, 256, + "Symbol \"%s\" not in global context", symbol); + } + } + } + /* Error reporting */ + if (!nssym) { + if (!savedErrorStr || !SDL_strlen(savedErrorStr)) { + if (savedErrorStr) + SDL_free(savedErrorStr); + savedErrorStr = SDL_malloc(256); + SDL_snprintf(savedErrorStr, 256, "Symbol \"%s\" not found", + symbol); + } + if (canSetError) { + error(savedErrorStr); + } else { + debug(savedErrorStr); + } + if (savedErrorStr) + SDL_free(savedErrorStr); + return NULL; + } + return NSAddressOfSymbol(nssym); } -static struct dlstatus *loadModule(const char *path, const struct stat *sbuf, int mode) +static struct dlstatus * +loadModule(const char *path, const struct stat *sbuf, int mode) { - NSObjectFileImage ofi = 0; - NSObjectFileImageReturnCode ofirc; - struct dlstatus *dls; - NSLinkEditErrors ler; - int lerno; - const char *errstr; - const char *file; - void (*init) (void); + NSObjectFileImage ofi = 0; + NSObjectFileImageReturnCode ofirc; + struct dlstatus *dls; + NSLinkEditErrors ler; + int lerno; + const char *errstr; + const char *file; + void (*init) (void); - ofirc = NSCreateObjectFileImageFromFile(path, &ofi); - switch (ofirc) - { - case NSObjectFileImageSuccess: - break; - case NSObjectFileImageInappropriateFile: - if (dyld_NSAddImage && dyld_NSIsSymbolNameDefinedInImage && dyld_NSLookupSymbolInImage) - { - if (isFlagSet(mode, RTLD_LOCAL)) - { - warning("trying to open a .dylib with RTLD_LOCAL"); - error("unable to open this file with RTLD_LOCAL"); - return NULL; - } - } - else - { - error("opening this file is unsupported on this system"); - return NULL; - } - break; - case NSObjectFileImageFailure: - error("object file setup failure"); - return NULL; - case NSObjectFileImageArch: - error("no object for this architecture"); - return NULL; - case NSObjectFileImageFormat: - error("bad object file format"); - return NULL; - case NSObjectFileImageAccess: - error("can't read object file"); - return NULL; - default: - error("unknown error from NSCreateObjectFileImageFromFile()"); - return NULL; - } - dls = lookupStatus(sbuf); - if (!dls) - { - dls = allocStatus(); - } - if (!dls) - { - error("unable to allocate memory"); - return NULL; - } - // dls->lib = 0; - if (ofirc == NSObjectFileImageInappropriateFile) - { - if ((dls->lib = dyld_NSAddImage(path, NSADDIMAGE_OPTION_RETURN_ON_ERROR))) - { - debug("Dynamic lib loaded at %ld", dls->lib); - ofi = MAGIC_DYLIB_OFI; - dls->module = MAGIC_DYLIB_MOD; - ofirc = NSObjectFileImageSuccess; - /* Although it is possible with a bit of work to modify this so it works and - functions with RTLD_NOW, I don't deem it necessary at the moment */ - } - if (!(dls->module)) - { - NSLinkEditError(&ler, &lerno, &file, &errstr); - if (!errstr || (!SDL_strlen(errstr))) - error("Can't open this file type"); - else - error(errstr); - if ((dls->flags & DL_IN_LIST) == 0) - { - SDL_free(dls); - } - return NULL; - } - } - else - { - dls->module = NSLinkModule(ofi, path, - NSLINKMODULE_OPTION_RETURN_ON_ERROR | - NSLINKMODULE_OPTION_PRIVATE | - (isFlagSet(mode, RTLD_NOW) ? NSLINKMODULE_OPTION_BINDNOW : 0)); - NSDestroyObjectFileImage(ofi); - if (dls->module) - { - dls->lib = get_mach_header_from_NSModule(dls->module); - } - } - if (!dls->module) - { - NSLinkEditError(&ler, &lerno, &file, &errstr); - if ((dls->flags & DL_IN_LIST) == 0) - { - SDL_free(dls); - } - error(errstr); - return NULL; - } + ofirc = NSCreateObjectFileImageFromFile(path, &ofi); + switch (ofirc) { + case NSObjectFileImageSuccess: + break; + case NSObjectFileImageInappropriateFile: + if (dyld_NSAddImage && dyld_NSIsSymbolNameDefinedInImage + && dyld_NSLookupSymbolInImage) { + if (isFlagSet(mode, RTLD_LOCAL)) { + warning("trying to open a .dylib with RTLD_LOCAL"); + error("unable to open this file with RTLD_LOCAL"); + return NULL; + } + } else { + error("opening this file is unsupported on this system"); + return NULL; + } + break; + case NSObjectFileImageFailure: + error("object file setup failure"); + return NULL; + case NSObjectFileImageArch: + error("no object for this architecture"); + return NULL; + case NSObjectFileImageFormat: + error("bad object file format"); + return NULL; + case NSObjectFileImageAccess: + error("can't read object file"); + return NULL; + default: + error("unknown error from NSCreateObjectFileImageFromFile()"); + return NULL; + } + dls = lookupStatus(sbuf); + if (!dls) { + dls = allocStatus(); + } + if (!dls) { + error("unable to allocate memory"); + return NULL; + } + // dls->lib = 0; + if (ofirc == NSObjectFileImageInappropriateFile) { + if ((dls->lib = + dyld_NSAddImage(path, NSADDIMAGE_OPTION_RETURN_ON_ERROR))) { + debug("Dynamic lib loaded at %ld", dls->lib); + ofi = MAGIC_DYLIB_OFI; + dls->module = MAGIC_DYLIB_MOD; + ofirc = NSObjectFileImageSuccess; + /* Although it is possible with a bit of work to modify this so it works and + functions with RTLD_NOW, I don't deem it necessary at the moment */ + } + if (!(dls->module)) { + NSLinkEditError(&ler, &lerno, &file, &errstr); + if (!errstr || (!SDL_strlen(errstr))) + error("Can't open this file type"); + else + error(errstr); + if ((dls->flags & DL_IN_LIST) == 0) { + SDL_free(dls); + } + return NULL; + } + } else { + dls->module = NSLinkModule(ofi, path, + NSLINKMODULE_OPTION_RETURN_ON_ERROR | + NSLINKMODULE_OPTION_PRIVATE | + (isFlagSet(mode, RTLD_NOW) ? + NSLINKMODULE_OPTION_BINDNOW : 0)); + NSDestroyObjectFileImage(ofi); + if (dls->module) { + dls->lib = get_mach_header_from_NSModule(dls->module); + } + } + if (!dls->module) { + NSLinkEditError(&ler, &lerno, &file, &errstr); + if ((dls->flags & DL_IN_LIST) == 0) { + SDL_free(dls); + } + error(errstr); + return NULL; + } - insertStatus(dls, sbuf); - dls = reference(dls, mode); - if ((init = dlsymIntern(dls, "__init", 0))) - { - debug("calling _init()"); - init(); - } - return dls; + insertStatus(dls, sbuf); + dls = reference(dls, mode); + if ((init = dlsymIntern(dls, "__init", 0))) { + debug("calling _init()"); + init(); + } + return dls; } -inline static void dlcompat_init_check(void) +inline static void +dlcompat_init_check(void) { - static pthread_mutex_t l = PTHREAD_MUTEX_INITIALIZER; - static int init_done = 0; + static pthread_mutex_t l = PTHREAD_MUTEX_INITIALIZER; + static int init_done = 0; - pthread_mutex_lock(&l); - if (!init_done) { - dlcompat_init_func(); - init_done = 1; - } - pthread_mutex_unlock(&l); + pthread_mutex_lock(&l); + if (!init_done) { + dlcompat_init_func(); + init_done = 1; + } + pthread_mutex_unlock(&l); } -static void dlcompat_init_func(void) +static void +dlcompat_init_func(void) { - _dyld_func_lookup("__dyld_NSAddImage", (void **)&dyld_NSAddImage); - _dyld_func_lookup("__dyld_NSIsSymbolNameDefinedInImage", - (void **)&dyld_NSIsSymbolNameDefinedInImage); - _dyld_func_lookup("__dyld_NSLookupSymbolInImage", (void **)&dyld_NSLookupSymbolInImage); - if (pthread_mutex_init(&dlcompat_mutex, NULL)) - exit(1); - if (pthread_key_create(&dlerror_key, &dlerrorfree)) - exit(1); + _dyld_func_lookup("__dyld_NSAddImage", (void **) &dyld_NSAddImage); + _dyld_func_lookup("__dyld_NSIsSymbolNameDefinedInImage", + (void **) &dyld_NSIsSymbolNameDefinedInImage); + _dyld_func_lookup("__dyld_NSLookupSymbolInImage", + (void **) &dyld_NSLookupSymbolInImage); + if (pthread_mutex_init(&dlcompat_mutex, NULL)) + exit(1); + if (pthread_key_create(&dlerror_key, &dlerrorfree)) + exit(1); } -static void resetdlerror() +static void +resetdlerror() { - struct dlthread *tss; - tss = pthread_getspecific(dlerror_key); - tss->errset = 0; + struct dlthread *tss; + tss = pthread_getspecific(dlerror_key); + tss->errset = 0; } -static void dlerrorfree(void *data) +static void +dlerrorfree(void *data) { - SDL_free(data); + SDL_free(data); } /* We kind of want a recursive lock here, but meet a little trouble * because they are not available pre OS X 10.2, so we fake it * using thread specific storage to keep a lock count - */ -static inline void dolock(void) + */ +static inline void +dolock(void) { - int err = 0; - struct dlthread *tss; - dlcompat_init_check(); - tss = pthread_getspecific(dlerror_key); - if (!tss) - { - tss = SDL_malloc(sizeof(struct dlthread)); - tss->lockcnt = 0; - tss->errset = 0; - if (pthread_setspecific(dlerror_key, tss)) - { - fprintf(stderr,"dlcompat: pthread_setspecific failed\n"); - exit(1); - } - } - if (!tss->lockcnt) - err = pthread_mutex_lock(&dlcompat_mutex); - tss->lockcnt = tss->lockcnt +1; - if (err) - exit(err); + int err = 0; + struct dlthread *tss; + dlcompat_init_check(); + tss = pthread_getspecific(dlerror_key); + if (!tss) { + tss = SDL_malloc(sizeof(struct dlthread)); + tss->lockcnt = 0; + tss->errset = 0; + if (pthread_setspecific(dlerror_key, tss)) { + fprintf(stderr, "dlcompat: pthread_setspecific failed\n"); + exit(1); + } + } + if (!tss->lockcnt) + err = pthread_mutex_lock(&dlcompat_mutex); + tss->lockcnt = tss->lockcnt + 1; + if (err) + exit(err); } -static inline void dounlock(void) +static inline void +dounlock(void) { - int err = 0; - struct dlthread *tss; - tss = pthread_getspecific(dlerror_key); - tss->lockcnt = tss->lockcnt -1; - if (!tss->lockcnt) - err = pthread_mutex_unlock(&dlcompat_mutex); - if (err) - exit(err); + int err = 0; + struct dlthread *tss; + tss = pthread_getspecific(dlerror_key); + tss->lockcnt = tss->lockcnt - 1; + if (!tss->lockcnt) + err = pthread_mutex_unlock(&dlcompat_mutex); + if (err) + exit(err); } -static void *SDL_OSX_dlopen(const char *path, int mode) +static void * +SDL_OSX_dlopen(const char *path, int mode) { - const struct stat *sbuf; - struct dlstatus *dls; - const char *fullPath; + const struct stat *sbuf; + struct dlstatus *dls; + const char *fullPath; - dolock(); - resetdlerror(); - if (!path) - { - dls = &mainStatus; - goto dlopenok; - } - if (!(sbuf = findFile(path, &fullPath))) - { - error("file \"%s\" not found", path); - goto dlopenerror; - } - /* Now checks that it hasn't been closed already */ - if ((dls = lookupStatus(sbuf)) && (dls->refs > 0)) - { - /* debug("status found"); */ - dls = reference(dls, mode); - goto dlopenok; - } + dolock(); + resetdlerror(); + if (!path) { + dls = &mainStatus; + goto dlopenok; + } + if (!(sbuf = findFile(path, &fullPath))) { + error("file \"%s\" not found", path); + goto dlopenerror; + } + /* Now checks that it hasn't been closed already */ + if ((dls = lookupStatus(sbuf)) && (dls->refs > 0)) { + /* debug("status found"); */ + dls = reference(dls, mode); + goto dlopenok; + } #ifdef RTLD_NOLOAD - if (isFlagSet(mode, RTLD_NOLOAD)) - { - error("no existing handle and RTLD_NOLOAD specified"); - goto dlopenerror; - } + if (isFlagSet(mode, RTLD_NOLOAD)) { + error("no existing handle and RTLD_NOLOAD specified"); + goto dlopenerror; + } #endif - if (isFlagSet(mode, RTLD_LAZY) && isFlagSet(mode, RTLD_NOW)) - { - error("how can I load something both RTLD_LAZY and RTLD_NOW?"); - goto dlopenerror; - } - dls = loadModule(fullPath, sbuf, mode); - + if (isFlagSet(mode, RTLD_LAZY) && isFlagSet(mode, RTLD_NOW)) { + error("how can I load something both RTLD_LAZY and RTLD_NOW?"); + goto dlopenerror; + } + dls = loadModule(fullPath, sbuf, mode); + dlopenok: - dounlock(); - return (void *)dls; + dounlock(); + return (void *) dls; dlopenerror: - dounlock(); - return NULL; + dounlock(); + return NULL; } #if !FINK_BUILD -static void *SDL_OSX_dlsym(void * dl_restrict handle, const char * dl_restrict symbol) +static void * +SDL_OSX_dlsym(void *dl_restrict handle, const char *dl_restrict symbol) { - int sym_len = SDL_strlen(symbol); - void *value = NULL; - char *malloc_sym = NULL; - dolock(); - malloc_sym = SDL_malloc(sym_len + 2); - if (malloc_sym) - { - SDL_snprintf(malloc_sym, sym_len+2, "_%s", symbol); - value = dlsymIntern(handle, malloc_sym, 1); - SDL_free(malloc_sym); - } - else - { - error("Unable to allocate memory"); - goto dlsymerror; - } - dounlock(); - return value; + int sym_len = SDL_strlen(symbol); + void *value = NULL; + char *malloc_sym = NULL; + dolock(); + malloc_sym = SDL_malloc(sym_len + 2); + if (malloc_sym) { + SDL_snprintf(malloc_sym, sym_len + 2, "_%s", symbol); + value = dlsymIntern(handle, malloc_sym, 1); + SDL_free(malloc_sym); + } else { + error("Unable to allocate memory"); + goto dlsymerror; + } + dounlock(); + return value; dlsymerror: - dounlock(); - return NULL; + dounlock(); + return NULL; } #endif #if FINK_BUILD -static void *dlsym_prepend_underscore(void *handle, const char *symbol) +static void * +dlsym_prepend_underscore(void *handle, const char *symbol) { - void *answer; - dolock(); - answer = dlsym_prepend_underscore_intern(handle, symbol); - dounlock(); - return answer; + void *answer; + dolock(); + answer = dlsym_prepend_underscore_intern(handle, symbol); + dounlock(); + return answer; } -static void *dlsym_prepend_underscore_intern(void *handle, const char *symbol) +static void * +dlsym_prepend_underscore_intern(void *handle, const char *symbol) { /* * A quick and easy way for porting packages which call dlsym(handle,"sym") @@ -1059,272 +1043,268 @@ * the underscore always, or not at all. These global functions need to go away * for opendarwin. */ - int sym_len = SDL_strlen(symbol); - void *value = NULL; - char *malloc_sym = NULL; - malloc_sym = SDL_malloc(sym_len + 2); - if (malloc_sym) - { - SDL_snprintf(malloc_sym, sym_len+2, "_%s", symbol); - value = dlsymIntern(handle, malloc_sym, 1); - SDL_free(malloc_sym); - } - else - { - error("Unable to allocate memory"); - } - return value; + int sym_len = SDL_strlen(symbol); + void *value = NULL; + char *malloc_sym = NULL; + malloc_sym = SDL_malloc(sym_len + 2); + if (malloc_sym) { + SDL_snprintf(malloc_sym, sym_len + 2, "_%s", symbol); + value = dlsymIntern(handle, malloc_sym, 1); + SDL_free(malloc_sym); + } else { + error("Unable to allocate memory"); + } + return value; } -static void *dlsym_auto_underscore(void *handle, const char *symbol) +static void * +dlsym_auto_underscore(void *handle, const char *symbol) { - void *answer; - dolock(); - answer = dlsym_auto_underscore_intern(handle, symbol); - dounlock(); - return answer; + void *answer; + dolock(); + answer = dlsym_auto_underscore_intern(handle, symbol); + dounlock(); + return answer; } -static void *dlsym_auto_underscore_intern(void *handle, const char *symbol) +static void * +dlsym_auto_underscore_intern(void *handle, const char *symbol) { - struct dlstatus *dls = handle; - void *addr = 0; - addr = dlsymIntern(dls, symbol, 0); - if (!addr) - addr = dlsym_prepend_underscore_intern(handle, symbol); - return addr; + struct dlstatus *dls = handle; + void *addr = 0; + addr = dlsymIntern(dls, symbol, 0); + if (!addr) + addr = dlsym_prepend_underscore_intern(handle, symbol); + return addr; } -static void *SDL_OSX_dlsym(void * dl_restrict handle, const char * dl_restrict symbol) +static void * +SDL_OSX_dlsym(void *dl_restrict handle, const char *dl_restrict symbol) { - struct dlstatus *dls = handle; - void *addr = 0; - dolock(); - addr = dlsymIntern(dls, symbol, 1); - dounlock(); - return addr; + struct dlstatus *dls = handle; + void *addr = 0; + dolock(); + addr = dlsymIntern(dls, symbol, 1); + dounlock(); + return addr; } #endif -static int SDL_OSX_dlclose(void *handle) +static int +SDL_OSX_dlclose(void *handle) { - struct dlstatus *dls = handle; - dolock(); - resetdlerror(); - if (!isValidStatus(dls)) - { - goto dlcloseerror; - } - if (dls->module == MAGIC_DYLIB_MOD) - { - const char *name; - if (!dls->lib) - { - name = "global context"; - } - else - { - name = get_lib_name(dls->lib); - } - warning("trying to close a .dylib!"); - error("Not closing \"%s\" - dynamic libraries cannot be closed", name); - goto dlcloseerror; - } - if (!dls->module) - { - error("module already closed"); - goto dlcloseerror; - } - - if (dls->refs == 1) - { - unsigned long options = 0; - void (*fini) (void); - if ((fini = dlsymIntern(dls, "__fini", 0))) - { - debug("calling _fini()"); - fini(); - } - options |= NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES; + struct dlstatus *dls = handle; + dolock(); + resetdlerror(); + if (!isValidStatus(dls)) { + goto dlcloseerror; + } + if (dls->module == MAGIC_DYLIB_MOD) { + const char *name; + if (!dls->lib) { + name = "global context"; + } else { + name = get_lib_name(dls->lib); + } + warning("trying to close a .dylib!"); + error("Not closing \"%s\" - dynamic libraries cannot be closed", + name); + goto dlcloseerror; + } + if (!dls->module) { + error("module already closed"); + goto dlcloseerror; + } + + if (dls->refs == 1) { + unsigned long options = 0; + void (*fini) (void); + if ((fini = dlsymIntern(dls, "__fini", 0))) { + debug("calling _fini()"); + fini(); + } + options |= NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES; #ifdef RTLD_NODELETE - if (isFlagSet(dls->mode, RTLD_NODELETE)) - options |= NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED; + if (isFlagSet(dls->mode, RTLD_NODELETE)) + options |= NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED; #endif - if (!NSUnLinkModule(dls->module, options)) - { - error("unable to unlink module"); - goto dlcloseerror; - } - dls->refs--; - dls->module = 0; - /* Note: the dlstatus struct dls is neither removed from the list - * nor is the memory it occupies freed. This shouldn't pose a - * problem in mostly all cases, though. - */ - } - dounlock(); - return 0; + if (!NSUnLinkModule(dls->module, options)) { + error("unable to unlink module"); + goto dlcloseerror; + } + dls->refs--; + dls->module = 0; + /* Note: the dlstatus struct dls is neither removed from the list + * nor is the memory it occupies freed. This shouldn't pose a + * problem in mostly all cases, though. + */ + } + dounlock(); + return 0; dlcloseerror: - dounlock(); - return 1; + dounlock(); + return 1; } -static const char *SDL_OSX_dlerror(void) +static const char * +SDL_OSX_dlerror(void) { - struct dlthread *tss; - const char * err_str = NULL; - dlcompat_init_check(); - tss = pthread_getspecific(dlerror_key); - if (tss != NULL && tss->errset != 0) { - tss->errset = 0; - err_str = tss->errstr; - } - return (err_str); + struct dlthread *tss; + const char *err_str = NULL; + dlcompat_init_check(); + tss = pthread_getspecific(dlerror_key); + if (tss != NULL && tss->errset != 0) { + tss->errset = 0; + err_str = tss->errstr; + } + return (err_str); } /* Given an address, return the mach_header for the image containing it * or zero if the given address is not contained in any loaded images. */ -static const struct mach_header *image_for_address(const void *address) +static const struct mach_header * +image_for_address(const void *address) { - unsigned long i; - unsigned long j; - unsigned long count = _dyld_image_count(); - const struct mach_header *mh = 0; - struct load_command *lc = 0; - unsigned long addr = 0; - for (i = 0; i < count; i++) - { - addr = (unsigned long)address - _dyld_get_image_vmaddr_slide(i); - mh = _dyld_get_image_header(i); - if (mh) - { - lc = (struct load_command *)((char *)mh + sizeof(struct mach_header)); - for (j = 0; j < mh->ncmds; j++, lc = (struct load_command *)((char *)lc + lc->cmdsize)) - { - if (LC_SEGMENT == lc->cmd && - addr >= ((struct segment_command *)lc)->vmaddr && - addr < - ((struct segment_command *)lc)->vmaddr + ((struct segment_command *)lc)->vmsize) - { - goto image_found; - } - } - } - mh = 0; - } + unsigned long i; + unsigned long j; + unsigned long count = _dyld_image_count(); + const struct mach_header *mh = 0; + struct load_command *lc = 0; + unsigned long addr = 0; + for (i = 0; i < count; i++) { + addr = (unsigned long) address - _dyld_get_image_vmaddr_slide(i); + mh = _dyld_get_image_header(i); + if (mh) { + lc = (struct load_command *) ((char *) mh + + sizeof(struct mach_header)); + for (j = 0; j < mh->ncmds; + j++, lc = + (struct load_command *) ((char *) lc + lc->cmdsize)) { + if (LC_SEGMENT == lc->cmd && + addr >= ((struct segment_command *) lc)->vmaddr && + addr < + ((struct segment_command *) lc)->vmaddr + + ((struct segment_command *) lc)->vmsize) { + goto image_found; + } + } + } + mh = 0; + } image_found: - return mh; + return mh; } -#if 0 /* unused */ -static int SDL_OSX_dladdr(const void * dl_restrict p, SDL_OSX_Dl_info * dl_restrict info) +#if 0 /* unused */ +static int +SDL_OSX_dladdr(const void *dl_restrict p, SDL_OSX_Dl_info * dl_restrict info) { /* FIXME: USe the routine image_for_address. */ - unsigned long i; - unsigned long j; - unsigned long count = _dyld_image_count(); - struct mach_header *mh = 0; - struct load_command *lc = 0; - unsigned long addr = NULL; - unsigned long table_off = (unsigned long)0; - int found = 0; - if (!info) - return 0; - dolock(); - resetdlerror(); - info->dli_fname = 0; - info->dli_fbase = 0; - info->dli_sname = 0; - info->dli_saddr = 0; + unsigned long i; + unsigned long j; + unsigned long count = _dyld_image_count(); + struct mach_header *mh = 0; + struct load_command *lc = 0; + unsigned long addr = NULL; + unsigned long table_off = (unsigned long) 0; + int found = 0; + if (!info) + return 0; + dolock(); + resetdlerror(); + info->dli_fname = 0; + info->dli_fbase = 0; + info->dli_sname = 0; + info->dli_saddr = 0; /* Some of this was swiped from code posted by Douglas Davidson <ddavidso AT apple DOT com> * to darwin-development AT lists DOT apple DOT com and slightly modified */ - for (i = 0; i < count; i++) - { - addr = (unsigned long)p - _dyld_get_image_vmaddr_slide(i); - mh = _dyld_get_image_header(i); - if (mh) - { - lc = (struct load_command *)((char *)mh + sizeof(struct mach_header)); - for (j = 0; j < mh->ncmds; j++, lc = (struct load_command *)((char *)lc + lc->cmdsize)) - { - if (LC_SEGMENT == lc->cmd && - addr >= ((struct segment_command *)lc)->vmaddr && - addr < - ((struct segment_command *)lc)->vmaddr + ((struct segment_command *)lc)->vmsize) - { - info->dli_fname = _dyld_get_image_name(i); - info->dli_fbase = (void *)mh; - found = 1; - break; - } - } - if (found) - break; - } - } - if (!found) - { - dounlock(); - return 0; - } - lc = (struct load_command *)((char *)mh + sizeof(struct mach_header)); - for (j = 0; j < mh->ncmds; j++, lc = (struct load_command *)((char *)lc + lc->cmdsize)) - { - if (LC_SEGMENT == lc->cmd) - { - if (!SDL_strcmp(((struct segment_command *)lc)->segname, "__LINKEDIT")) - break; - } - } - table_off = - ((unsigned long)((struct segment_command *)lc)->vmaddr) - - ((unsigned long)((struct segment_command *)lc)->fileoff) + _dyld_get_image_vmaddr_slide(i); - debug("table off %x", table_off); + for (i = 0; i < count; i++) { + addr = (unsigned long) p - _dyld_get_image_vmaddr_slide(i); + mh = _dyld_get_image_header(i); + if (mh) { + lc = (struct load_command *) ((char *) mh + + sizeof(struct mach_header)); + for (j = 0; j < mh->ncmds; + j++, lc = + (struct load_command *) ((char *) lc + lc->cmdsize)) { + if (LC_SEGMENT == lc->cmd && + addr >= ((struct segment_command *) lc)->vmaddr && + addr < + ((struct segment_command *) lc)->vmaddr + + ((struct segment_command *) lc)->vmsize) { + info->dli_fname = _dyld_get_image_name(i); + info->dli_fbase = (void *) mh; + found = 1; + break; + } + } + if (found) + break; + } + } + if (!found) { + dounlock(); + return 0; + } + lc = (struct load_command *) ((char *) mh + sizeof(struct mach_header)); + for (j = 0; j < mh->ncmds; + j++, lc = (struct load_command *) ((char *) lc + lc->cmdsize)) { + if (LC_SEGMENT == lc->cmd) { + if (!SDL_strcmp + (((struct segment_command *) lc)->segname, "__LINKEDIT")) + break; + } + } + table_off = + ((unsigned long) ((struct segment_command *) lc)->vmaddr) - + ((unsigned long) ((struct segment_command *) lc)->fileoff) + + _dyld_get_image_vmaddr_slide(i); + debug("table off %x", table_off); - lc = (struct load_command *)((char *)mh + sizeof(struct mach_header)); - for (j = 0; j < mh->ncmds; j++, lc = (struct load_command *)((char *)lc + lc->cmdsize)) - { - if (LC_SYMTAB == lc->cmd) - { + lc = (struct load_command *) ((char *) mh + sizeof(struct mach_header)); + for (j = 0; j < mh->ncmds; + j++, lc = (struct load_command *) ((char *) lc + lc->cmdsize)) { + if (LC_SYMTAB == lc->cmd) { - struct nlist *symtable = (struct nlist *)(((struct symtab_command *)lc)->symoff + table_off); - unsigned long numsyms = ((struct symtab_command *)lc)->nsyms; - struct nlist *nearest = NULL; - unsigned long diff = 0xffffffff; - unsigned long strtable = (unsigned long)(((struct symtab_command *)lc)->stroff + table_off); - debug("symtable %x", symtable); - for (i = 0; i < numsyms; i++) - { - /* Ignore the following kinds of Symbols */ - if ((!symtable->n_value) /* Undefined */ - || (symtable->n_type >= N_PEXT) /* Debug symbol */ - || (!(symtable->n_type & N_EXT)) /* Local Symbol */ - ) - { - symtable++; - continue; - } - if ((addr >= symtable->n_value) && (diff >= (symtable->n_value - addr))) - { - diff = (unsigned long)symtable->n_value - addr; - nearest = symtable; - } - symtable++; - } - if (nearest) - { - info->dli_saddr = nearest->n_value + ((void *)p - addr); - info->dli_sname = (char *)(strtable + nearest->n_un.n_strx); - } - } - } - dounlock(); - return 1; + struct nlist *symtable = + (struct nlist *) (((struct symtab_command *) lc)->symoff + + table_off); + unsigned long numsyms = ((struct symtab_command *) lc)->nsyms; + struct nlist *nearest = NULL; + unsigned long diff = 0xffffffff; + unsigned long strtable = + (unsigned long) (((struct symtab_command *) lc)->stroff + + table_off); + debug("symtable %x", symtable); + for (i = 0; i < numsyms; i++) { + /* Ignore the following kinds of Symbols */ + if ((!symtable->n_value) /* Undefined */ + ||(symtable->n_type >= N_PEXT) /* Debug symbol */ + ||(!(symtable->n_type & N_EXT)) /* Local Symbol */ + ) { + symtable++; + continue; + } + if ((addr >= symtable->n_value) + && (diff >= (symtable->n_value - addr))) { + diff = (unsigned long) symtable->n_value - addr; + nearest = symtable; + } + symtable++; + } + if (nearest) { + info->dli_saddr = nearest->n_value + ((void *) p - addr); + info->dli_sname = (char *) (strtable + nearest->n_un.n_strx); + } + } + } + dounlock(); + return 1; } #endif @@ -1337,34 +1317,32 @@ * have the same representation, which is true on all platforms FreeBSD * runs on, but is not guaranteed by the C standard. */ -#if 0 -static dlfunc_t SDL_OSX_dlfunc(void * dl_restrict handle, const char * dl_restrict symbol) +#if 0 +static dlfunc_t +SDL_OSX_dlfunc(void *dl_restrict handle, const char *dl_restrict symbol) { - union - { - void *d; - dlfunc_t f; - } rv; - int sym_len = SDL_strlen(symbol); - char *malloc_sym = NULL; - dolock(); - malloc_sym = SDL_malloc(sym_len + 2); - if (malloc_sym) - { - SDL_snprintf(malloc_sym, sym_len+2, "_%s", symbol); - rv.d = dlsymIntern(handle, malloc_sym, 1); - SDL_free(malloc_sym); - } - else - { - error("Unable to allocate memory"); - goto dlfuncerror; - } - dounlock(); - return rv.f; + union + { + void *d; + dlfunc_t f; + } rv; + int sym_len = SDL_strlen(symbol); + char *malloc_sym = NULL; + dolock(); + malloc_sym = SDL_malloc(sym_len + 2); + if (malloc_sym) { + SDL_snprintf(malloc_sym, sym_len + 2, "_%s", symbol); + rv.d = dlsymIntern(handle, malloc_sym, 1); + SDL_free(malloc_sym); + } else { + error("Unable to allocate memory"); + goto dlfuncerror; + } + dounlock(); + return rv.f; dlfuncerror: - dounlock(); - return NULL; + dounlock(); + return NULL; } #endif @@ -1378,30 +1356,34 @@ #include "SDL_loadso.h" -void *SDL_LoadObject(const char *sofile) +void * +SDL_LoadObject(const char *sofile) { - void *handle = SDL_OSX_dlopen(sofile, RTLD_NOW); - const char *loaderror = SDL_OSX_dlerror(); - if ( handle == NULL ) { - SDL_SetError("Failed loading %s: %s", sofile, loaderror); - } - return(handle); + void *handle = SDL_OSX_dlopen(sofile, RTLD_NOW); + const char *loaderror = SDL_OSX_dlerror(); + if (handle == NULL) { + SDL_SetError("Failed loading %s: %s", sofile, loaderror); + } + return (handle); } -void *SDL_LoadFunction(void *handle, const char *name) +void * +SDL_LoadFunction(void *handle, const char *name) { - void *symbol = SDL_OSX_dlsym(handle, name); - if ( symbol == NULL ) { - SDL_SetError("Failed loading %s: %s", name, SDL_OSX_dlerror()); - } - return(symbol); + void *symbol = SDL_OSX_dlsym(handle, name); + if (symbol == NULL) { + SDL_SetError("Failed loading %s: %s", name, SDL_OSX_dlerror()); + } + return (symbol); } -void SDL_UnloadObject(void *handle) +void +SDL_UnloadObject(void *handle) { - if ( handle != NULL ) { - SDL_OSX_dlclose(handle); - } + if (handle != NULL) { + SDL_OSX_dlclose(handle); + } } #endif /* SDL_LOADSO_DLCOMPAT */ +/* vi: set ts=4 sw=4 expandtab: */