diff options
Diffstat (limited to 'unix/tclLoadDyld.c')
| -rw-r--r-- | unix/tclLoadDyld.c | 362 | 
1 files changed, 153 insertions, 209 deletions
| diff --git a/unix/tclLoadDyld.c b/unix/tclLoadDyld.c index dd09749..50c283d 100644 --- a/unix/tclLoadDyld.c +++ b/unix/tclLoadDyld.c @@ -11,49 +11,41 @@   *   * See the file "license.terms" for information on usage and redistribution of   * this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tclLoadDyld.c,v 1.29 2007/12/13 15:28:42 dgp Exp $   */  #include "tclInt.h"  #ifndef MODULE_SCOPE -#define MODULE_SCOPE extern +#   define MODULE_SCOPE extern  #endif -#ifndef TCL_DYLD_USE_DLFCN  /*   * Use preferred dlfcn API on 10.4 and later   */ -#   if !defined(NO_DLFCN_H) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1040 -#	define TCL_DYLD_USE_DLFCN 1 -#   else + +#ifndef TCL_DYLD_USE_DLFCN +#   ifdef NO_DLFCN_H  #	define TCL_DYLD_USE_DLFCN 0 +#   else +#	define TCL_DYLD_USE_DLFCN 1  #   endif  #endif -#ifndef TCL_DYLD_USE_NSMODULE +  /*   * Use deprecated NSModule API only to support 10.3 and earlier:   */ -#   if MAC_OS_X_VERSION_MIN_REQUIRED < 1040 -#	define TCL_DYLD_USE_NSMODULE 1 -#   else -#	define TCL_DYLD_USE_NSMODULE 0 -#   endif + +#ifndef TCL_DYLD_USE_NSMODULE +#   define TCL_DYLD_USE_NSMODULE 0  #endif -#if TCL_DYLD_USE_DLFCN -#include <dlfcn.h> -#if defined(HAVE_WEAK_IMPORT) && MAC_OS_X_VERSION_MIN_REQUIRED < 1040  /* - * Support for weakly importing dlfcn API. + * Use includes for the API we're using.   */ -extern void *dlopen(const char *path, int mode) WEAK_IMPORT_ATTRIBUTE; -extern void *dlsym(void *handle, const char *symbol) WEAK_IMPORT_ATTRIBUTE; -extern int dlclose(void *handle) WEAK_IMPORT_ATTRIBUTE; -extern char *dlerror(void) WEAK_IMPORT_ATTRIBUTE; -#endif -#endif + +#if TCL_DYLD_USE_DLFCN +#   include <dlfcn.h> +#endif /* TCL_DYLD_USE_DLFCN */  #if TCL_DYLD_USE_NSMODULE || defined(TCL_LOAD_FROM_MEMORY)  #include <mach-o/dyld.h> @@ -62,39 +54,33 @@ extern char *dlerror(void) WEAK_IMPORT_ATTRIBUTE;  #include <mach-o/arch.h>  #include <libkern/OSByteOrder.h>  #include <mach/mach.h> -#include <stdbool.h>  typedef struct Tcl_DyldModuleHandle {      struct Tcl_DyldModuleHandle *nextPtr;      NSModule module;  } Tcl_DyldModuleHandle; -#endif /* TCL_DYLD_USE_NSMODULE */ +#endif /* TCL_DYLD_USE_NSMODULE || TCL_LOAD_FROM_MEMORY */ -typedef struct Tcl_DyldLoadHandle { -#if TCL_DYLD_USE_DLFCN +typedef struct {      void *dlHandle; -#endif  #if TCL_DYLD_USE_NSMODULE || defined(TCL_LOAD_FROM_MEMORY)      const struct mach_header *dyldLibHeader;      Tcl_DyldModuleHandle *modulePtr;  #endif  } Tcl_DyldLoadHandle; -#if (TCL_DYLD_USE_DLFCN && MAC_OS_X_VERSION_MIN_REQUIRED < 1040) || \ -	defined(TCL_LOAD_FROM_MEMORY) -MODULE_SCOPE long tclMacOSXDarwinRelease; +#if TCL_DYLD_USE_DLFCN || defined(TCL_LOAD_FROM_MEMORY) +MODULE_SCOPE long	tclMacOSXDarwinRelease;  #endif -#ifdef TCL_DEBUG_LOAD -#define TclLoadDbgMsg(m, ...) do { \ -	    fprintf(stderr, "%s:%d: %s(): " m ".\n", \ -	    strrchr(__FILE__, '/')+1, __LINE__, __func__, ##__VA_ARGS__); \ -	} while (0) -#else -#define TclLoadDbgMsg(m, ...) -#endif +/* + * Static functions defined in this file. + */ + +static void *		FindSymbol(Tcl_Interp *interp, +			    Tcl_LoadHandle loadHandle, const char *symbol); +static void		UnloadFile(Tcl_LoadHandle handle); -#if TCL_DYLD_USE_NSMODULE || defined(TCL_LOAD_FROM_MEMORY)  /*   *----------------------------------------------------------------------   * @@ -112,7 +98,8 @@ MODULE_SCOPE long tclMacOSXDarwinRelease;   *----------------------------------------------------------------------   */ -static CONST char* +#if TCL_DYLD_USE_NSMODULE || defined(TCL_LOAD_FROM_MEMORY) +static const char *  DyldOFIErrorMsg(      int err)  { @@ -133,7 +120,7 @@ DyldOFIErrorMsg(  	return "unknown error";      }  } -#endif /* TCL_DYLD_USE_NSMODULE */ +#endif /* TCL_DYLD_USE_NSMODULE || TCL_LOAD_FROM_MEMORY */  /*   *---------------------------------------------------------------------- @@ -161,15 +148,15 @@ TclpDlopen(      Tcl_LoadHandle *loadHandle, /* Filled with token for dynamically loaded  				 * file which will be passed back to  				 * (*unloadProcPtr)() to unload the file. */ -    Tcl_FSUnloadFileProc **unloadProcPtr) +    Tcl_FSUnloadFileProc **unloadProcPtr,  				/* Filled with address of Tcl_FSUnloadFileProc  				 * function which should be used for this  				 * file. */ +    int flags)  {      Tcl_DyldLoadHandle *dyldLoadHandle; -#if TCL_DYLD_USE_DLFCN +    Tcl_LoadHandle newHandle;      void *dlHandle = NULL; -#endif  #if TCL_DYLD_USE_NSMODULE || defined(TCL_LOAD_FROM_MEMORY)      const struct mach_header *dyldLibHeader = NULL;      Tcl_DyldModuleHandle *modulePtr = NULL; @@ -178,12 +165,14 @@ TclpDlopen(      NSLinkEditErrors editError;      int errorNumber;      const char *errorName, *objFileImageErrMsg = NULL; -#endif +#endif /* TCL_DYLD_USE_NSMODULE */      const char *errMsg = NULL;      int result;      Tcl_DString ds; -    char *fileName = NULL;      const char *nativePath, *nativeFileName = NULL; +#if TCL_DYLD_USE_DLFCN +    int dlopenflags = 0; +#endif /* TCL_DYLD_USE_DLFCN */      /*       * First try the full path the user gave us. This is particularly @@ -192,40 +181,44 @@ TclpDlopen(       */      nativePath = Tcl_FSGetNativePath(pathPtr); +    nativeFileName = Tcl_UtfToExternalDString(NULL, Tcl_GetString(pathPtr), +	    -1, &ds);  #if TCL_DYLD_USE_DLFCN -#if MAC_OS_X_VERSION_MIN_REQUIRED < 1040 -    if (tclMacOSXDarwinRelease >= 8) -#endif -    { -	dlHandle = dlopen(nativePath, RTLD_NOW | RTLD_LOCAL); -	if (!dlHandle) { -	    /* -	     * Let the OS loader examine the binary search path for whatever -	     * string the user gave us which hopefully refers to a file on the -	     * binary path. -	     */ +    /* +     * Use (RTLD_NOW|RTLD_LOCAL) as default, see [Bug #3216070] +     */ -	    fileName = Tcl_GetString(pathPtr); -	    nativeFileName = Tcl_UtfToExternalDString(NULL, fileName, -1, &ds); -	    dlHandle = dlopen(nativeFileName, RTLD_NOW | RTLD_LOCAL); -	} -	if (dlHandle) { -	    TclLoadDbgMsg("dlopen() successful"); -	} else { +    if (flags & TCL_LOAD_GLOBAL) { +    	dlopenflags |= RTLD_GLOBAL; +    } else { +    	dlopenflags |= RTLD_LOCAL; +    } +    if (flags & TCL_LOAD_LAZY) { +    	dlopenflags |= RTLD_LAZY; +    } else { +    	dlopenflags |= RTLD_NOW; +    } +    dlHandle = dlopen(nativePath, dlopenflags); +    if (!dlHandle) { +	/* +	 * Let the OS loader examine the binary search path for whatever string +	 * the user gave us which hopefully refers to a file on the binary +	 * path. +	 */ + +	dlHandle = dlopen(nativeFileName, dlopenflags); +	if (!dlHandle) {  	    errMsg = dlerror(); -	    TclLoadDbgMsg("dlopen() failed: %s", errMsg);  	}      } -    if (!dlHandle)  #endif /* TCL_DYLD_USE_DLFCN */ -    { + +    if (!dlHandle) {  #if TCL_DYLD_USE_NSMODULE  	dyldLibHeader = NSAddImage(nativePath,  		NSADDIMAGE_OPTION_RETURN_ON_ERROR); -	if (dyldLibHeader) { -	    TclLoadDbgMsg("NSAddImage() successful"); -	} else { +	if (!dyldLibHeader) {  	    NSLinkEditError(&editError, &errorNumber, &errorName, &errMsg);  	    if (editError == NSLinkEditFileAccessError) {  		/* @@ -234,20 +227,12 @@ TclpDlopen(  		 * which hopefully refers to a file on the binary path.  		 */ -		if (!fileName) { -		    fileName = Tcl_GetString(pathPtr); -		    nativeFileName = Tcl_UtfToExternalDString(NULL, fileName, -			    -1, &ds); -		}  		dyldLibHeader = NSAddImage(nativeFileName,  			NSADDIMAGE_OPTION_WITH_SEARCHING |  			NSADDIMAGE_OPTION_RETURN_ON_ERROR); -		if (dyldLibHeader) { -		    TclLoadDbgMsg("NSAddImage() successful"); -		} else { +		if (!dyldLibHeader) {  		    NSLinkEditError(&editError, &errorNumber, &errorName,  			    &errMsg); -		    TclLoadDbgMsg("NSAddImage() failed: %s", errMsg);  		}  	    } else if ((editError == NSLinkEditFileFormatError  		    && errorNumber == EBADMACHO) @@ -264,72 +249,70 @@ TclpDlopen(  		err = NSCreateObjectFileImageFromFile(nativePath,  			&dyldObjFileImage);  		if (err == NSObjectFileImageSuccess && dyldObjFileImage) { -		    TclLoadDbgMsg("NSCreateObjectFileImageFromFile() " -			    "successful"); -		    module = NSLinkModule(dyldObjFileImage, nativePath, -			    NSLINKMODULE_OPTION_BINDNOW -			    | NSLINKMODULE_OPTION_RETURN_ON_ERROR); +		    int nsflags = NSLINKMODULE_OPTION_RETURN_ON_ERROR; +		    if (!(flags & 1)) nsflags |= NSLINKMODULE_OPTION_PRIVATE; +		    if (!(flags & 2)) nsflags |= NSLINKMODULE_OPTION_BINDNOW; +		    module = NSLinkModule(dyldObjFileImage, nativePath, nsflags);  		    NSDestroyObjectFileImage(dyldObjFileImage);  		    if (module) { -			modulePtr = (Tcl_DyldModuleHandle *) -				ckalloc(sizeof(Tcl_DyldModuleHandle)); +			modulePtr = ckalloc(sizeof(Tcl_DyldModuleHandle));  			modulePtr->module = module;  			modulePtr->nextPtr = NULL; -			TclLoadDbgMsg("NSLinkModule() successful");  		    } else {  			NSLinkEditError(&editError, &errorNumber, &errorName,  				&errMsg); -			TclLoadDbgMsg("NSLinkModule() failed: %s", errMsg);  		    }  		} else {  		    objFileImageErrMsg = DyldOFIErrorMsg(err); -		    TclLoadDbgMsg("NSCreateObjectFileImageFromFile() failed: " -			    "%s", objFileImageErrMsg);  		}  	    }  	}  #endif /* TCL_DYLD_USE_NSMODULE */      } -    if (0 -#if TCL_DYLD_USE_DLFCN -	    || dlHandle -#endif + +    if (dlHandle  #if TCL_DYLD_USE_NSMODULE  	    || dyldLibHeader || modulePtr -#endif +#endif /* TCL_DYLD_USE_NSMODULE */      ) { -	dyldLoadHandle = (Tcl_DyldLoadHandle *) -		ckalloc(sizeof(Tcl_DyldLoadHandle)); -#if TCL_DYLD_USE_DLFCN +	dyldLoadHandle = ckalloc(sizeof(Tcl_DyldLoadHandle));  	dyldLoadHandle->dlHandle = dlHandle; -#endif  #if TCL_DYLD_USE_NSMODULE || defined(TCL_LOAD_FROM_MEMORY)  	dyldLoadHandle->dyldLibHeader = dyldLibHeader;  	dyldLoadHandle->modulePtr = modulePtr; -#endif -	*loadHandle = (Tcl_LoadHandle) dyldLoadHandle; -	*unloadProcPtr = &TclpUnloadFile; +#endif /* TCL_DYLD_USE_NSMODULE || TCL_LOAD_FROM_MEMORY */ +	newHandle = ckalloc(sizeof(*newHandle)); +	newHandle->clientData = dyldLoadHandle; +	newHandle->findSymbolProcPtr = &FindSymbol; +	newHandle->unloadFileProcPtr = &UnloadFile; +	*unloadProcPtr = &UnloadFile; +	*loadHandle = newHandle;  	result = TCL_OK;      } else { -	Tcl_AppendResult(interp, errMsg, NULL); +	Tcl_Obj *errObj = Tcl_NewObj(); + +	if (errMsg != NULL) { +	    Tcl_AppendToObj(errObj, errMsg, -1); +	}  #if TCL_DYLD_USE_NSMODULE  	if (objFileImageErrMsg) { -	    Tcl_AppendResult(interp, "\nNSCreateObjectFileImageFromFile() " -		    "error: ", objFileImageErrMsg, NULL); +	    Tcl_AppendPrintfToObj(errObj, +		    "\nNSCreateObjectFileImageFromFile() error: %s", +		    objFileImageErrMsg);  	} -#endif +#endif /* TCL_DYLD_USE_NSMODULE */ +	Tcl_SetObjResult(interp, errObj);  	result = TCL_ERROR;      } -    if(fileName) { -	Tcl_DStringFree(&ds); -    } + +    Tcl_DStringFree(&ds);      return result;  }  /*   *----------------------------------------------------------------------   * - * TclpFindSymbol -- + * FindSymbol --   *   *	Looks up a symbol, by name, through a handle associated with a   *	previously loaded piece of code (shared library). @@ -342,31 +325,27 @@ TclpDlopen(   *----------------------------------------------------------------------   */ -MODULE_SCOPE Tcl_PackageInitProc * -TclpFindSymbol( +static void * +FindSymbol(      Tcl_Interp *interp,		/* For error reporting. */      Tcl_LoadHandle loadHandle,	/* Handle from TclpDlopen. */ -    CONST char *symbol)		/* Symbol name to look up. */ +    const char *symbol)		/* Symbol name to look up. */  { -    Tcl_DyldLoadHandle *dyldLoadHandle = (Tcl_DyldLoadHandle *) loadHandle; +    Tcl_DyldLoadHandle *dyldLoadHandle = loadHandle->clientData;      Tcl_PackageInitProc *proc = NULL;      const char *errMsg = NULL;      Tcl_DString ds;      const char *native;      native = Tcl_UtfToExternalDString(NULL, symbol, -1, &ds); -#if TCL_DYLD_USE_DLFCN      if (dyldLoadHandle->dlHandle) { +#if TCL_DYLD_USE_DLFCN  	proc = dlsym(dyldLoadHandle->dlHandle, native); -	if (proc) { -	    TclLoadDbgMsg("dlsym() successful"); -	} else { +	if (!proc) {  	    errMsg = dlerror(); -	    TclLoadDbgMsg("dlsym() failed: %s", errMsg);  	} -    } else  #endif /* TCL_DYLD_USE_DLFCN */ -    { +    } else {  #if TCL_DYLD_USE_NSMODULE || defined(TCL_LOAD_FROM_MEMORY)  	NSSymbol nsSymbol = NULL;  	Tcl_DString newName; @@ -376,20 +355,19 @@ TclpFindSymbol(  	 */  	Tcl_DStringInit(&newName); -	Tcl_DStringAppend(&newName, "_", 1); +	TclDStringAppendLiteral(&newName, "_");  	native = Tcl_DStringAppend(&newName, native, -1);  	if (dyldLoadHandle->dyldLibHeader) {  	    nsSymbol = NSLookupSymbolInImage(dyldLoadHandle->dyldLibHeader,  		    native, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW |  		    NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);  	    if (nsSymbol) { -		TclLoadDbgMsg("NSLookupSymbolInImage() successful"); -#ifdef DYLD_SUPPORTS_DYLIB_UNLOADING  		/*  		 * Until dyld supports unloading of MY_DYLIB binaries, the  		 * following is not needed.  		 */ +#ifdef DYLD_SUPPORTS_DYLIB_UNLOADING  		NSModule module = NSModuleForSymbol(nsSymbol);  		Tcl_DyldModuleHandle *modulePtr = dyldLoadHandle->modulePtr; @@ -400,8 +378,7 @@ TclpFindSymbol(  		    modulePtr = modulePtr->nextPtr;  		}  		if (modulePtr == NULL) { -		    modulePtr = (Tcl_DyldModuleHandle *) -			    ckalloc(sizeof(Tcl_DyldModuleHandle)); +		    modulePtr = ckalloc(sizeof(Tcl_DyldModuleHandle));  		    modulePtr->module = module;  		    modulePtr->nextPtr = dyldLoadHandle->modulePtr;  		    dyldLoadHandle->modulePtr = modulePtr; @@ -413,31 +390,23 @@ TclpFindSymbol(  		const char *errorName;  		NSLinkEditError(&editError, &errorNumber, &errorName, &errMsg); -		TclLoadDbgMsg("NSLookupSymbolInImage() failed: %s", errMsg);  	    }  	} else if (dyldLoadHandle->modulePtr) {  	    nsSymbol = NSLookupSymbolInModule(  		    dyldLoadHandle->modulePtr->module, native); -	    if (nsSymbol) { -		TclLoadDbgMsg("NSLookupSymbolInModule() successful"); -	    } else { -		TclLoadDbgMsg("NSLookupSymbolInModule() failed"); -	    }  	}  	if (nsSymbol) {  	    proc = NSAddressOfSymbol(nsSymbol); -	    if (proc) { -		TclLoadDbgMsg("NSAddressOfSymbol() successful"); -	    } else { -		TclLoadDbgMsg("NSAddressOfSymbol() failed"); -	    }  	}  	Tcl_DStringFree(&newName);  #endif /* TCL_DYLD_USE_NSMODULE */      }      Tcl_DStringFree(&ds); -    if (errMsg) { -	Tcl_AppendResult(interp, errMsg, NULL); +    if (errMsg && (interp != NULL)) { +	Tcl_SetObjResult(interp, Tcl_ObjPrintf( +		"cannot find symbol \"%s\": %s", symbol, errMsg)); +	Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "LOAD_SYMBOL", symbol, +		NULL);      }      return proc;  } @@ -445,7 +414,7 @@ TclpFindSymbol(  /*   *----------------------------------------------------------------------   * - * TclpUnloadFile -- + * UnloadFile --   *   *	Unloads a dynamically loaded binary code file from memory. Code   *	pointers in the formerly loaded file are no longer valid after calling @@ -462,48 +431,34 @@ TclpFindSymbol(   *----------------------------------------------------------------------   */ -MODULE_SCOPE void -TclpUnloadFile( +static void +UnloadFile(      Tcl_LoadHandle loadHandle)	/* loadHandle returned by a previous call to  				 * TclpDlopen(). The loadHandle is a token  				 * that represents the loaded file. */  { -    Tcl_DyldLoadHandle *dyldLoadHandle = (Tcl_DyldLoadHandle *) loadHandle; +    Tcl_DyldLoadHandle *dyldLoadHandle = loadHandle->clientData; -#if TCL_DYLD_USE_DLFCN      if (dyldLoadHandle->dlHandle) { -	int result; - -	result = dlclose(dyldLoadHandle->dlHandle); -	if (!result) { -	    TclLoadDbgMsg("dlclose() successful"); -	} else { -	    TclLoadDbgMsg("dlclose() failed: %s", dlerror()); -	} -    } else +#if TCL_DYLD_USE_DLFCN +	(void) dlclose(dyldLoadHandle->dlHandle);  #endif /* TCL_DYLD_USE_DLFCN */ -    { +    } else {  #if TCL_DYLD_USE_NSMODULE || defined(TCL_LOAD_FROM_MEMORY)  	Tcl_DyldModuleHandle *modulePtr = dyldLoadHandle->modulePtr;  	while (modulePtr != NULL) { -	    void *ptr; -	    bool result; +	    void *ptr = modulePtr; -	    result = NSUnLinkModule(modulePtr->module, +	    (void) NSUnLinkModule(modulePtr->module,  		    NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES); -	    if (result) { -		TclLoadDbgMsg("NSUnLinkModule() successful"); -	    } else { -		TclLoadDbgMsg("NSUnLinkModule() failed"); -	    } -	    ptr = modulePtr;  	    modulePtr = modulePtr->nextPtr;  	    ckfree(ptr);  	}  #endif /* TCL_DYLD_USE_NSMODULE */      } -    ckfree((char*) dyldLoadHandle); +    ckfree(dyldLoadHandle); +    ckfree(loadHandle);  }  /* @@ -528,7 +483,7 @@ TclpUnloadFile(  int  TclGuessPackageName( -    CONST char *fileName,	/* Name of file containing package (already +    const char *fileName,	/* Name of file containing package (already  				 * translated to local form if needed). */      Tcl_DString *bufPtr)	/* Initialized empty dstring. Append package  				 * name to this if possible. */ @@ -536,7 +491,6 @@ TclGuessPackageName(      return 0;  } -#ifdef TCL_LOAD_FROM_MEMORY  /*   *----------------------------------------------------------------------   * @@ -553,6 +507,7 @@ TclGuessPackageName(   *----------------------------------------------------------------------   */ +#ifdef TCL_LOAD_FROM_MEMORY  MODULE_SCOPE void *  TclpLoadMemoryGetBuffer(      Tcl_Interp *interp,		/* Used for error reporting. */ @@ -577,6 +532,7 @@ TclpLoadMemoryGetBuffer(      }      return buffer;  } +#endif /* TCL_LOAD_FROM_MEMORY */  /*   *---------------------------------------------------------------------- @@ -596,6 +552,7 @@ TclpLoadMemoryGetBuffer(   *----------------------------------------------------------------------   */ +#ifdef TCL_LOAD_FROM_MEMORY  MODULE_SCOPE int  TclpLoadMemory(      Tcl_Interp *interp,		/* Used for error reporting. */ @@ -608,16 +565,19 @@ TclpLoadMemory(      Tcl_LoadHandle *loadHandle, /* Filled with token for dynamically loaded  				 * file which will be passed back to  				 * (*unloadProcPtr)() to unload the file. */ -    Tcl_FSUnloadFileProc **unloadProcPtr) +    Tcl_FSUnloadFileProc **unloadProcPtr,  				/* Filled with address of Tcl_FSUnloadFileProc  				 * function which should be used for this  				 * file. */ +    int flags)  { +    Tcl_LoadHandle newHandle;      Tcl_DyldLoadHandle *dyldLoadHandle;      NSObjectFileImage dyldObjFileImage = NULL;      Tcl_DyldModuleHandle *modulePtr;      NSModule module;      const char *objFileImageErrMsg = NULL; +    int nsflags = NSLINKMODULE_OPTION_RETURN_ON_ERROR;      /*       * Try to create an object file image that we can load from. @@ -629,15 +589,15 @@ TclpLoadMemory(  	uint32_t ms = 0;  #ifndef __LP64__  	const struct mach_header *mh = NULL; -	#define mh_size  sizeof(struct mach_header) -	#define mh_magic MH_MAGIC -	#define arch_abi 0 +#	define mh_size  sizeof(struct mach_header) +#	define mh_magic MH_MAGIC +#	define arch_abi 0  #else  	const struct mach_header_64 *mh = NULL; -	#define mh_size  sizeof(struct mach_header_64) -	#define mh_magic MH_MAGIC_64 -	#define arch_abi CPU_ARCH_ABI64 -#endif +#	define mh_size  sizeof(struct mach_header_64) +#	define mh_magic MH_MAGIC_64 +#	define arch_abi CPU_ARCH_ABI64 +#endif /*  __LP64__ */  	if ((size_t) codeSize >= sizeof(struct fat_header)  		&& fh->magic == OSSwapHostToBigInt32(FAT_MAGIC)) { @@ -647,7 +607,6 @@ TclpLoadMemory(  	     * Fat binary, try to find mach_header for our architecture  	     */ -	    TclLoadDbgMsg("Fat binary, %d archs", fh_nfat_arch);  	    if ((size_t) codeSize >= sizeof(struct fat_header) +  		    fh_nfat_arch * sizeof(struct fat_arch)) {  		void *fatarchs = (char*)buffer + sizeof(struct fat_header); @@ -660,22 +619,15 @@ TclpLoadMemory(  		fa = NXFindBestFatArch(arch->cputype | arch_abi,  			arch->cpusubtype, fatarchs, fh_nfat_arch);  		if (fa) { -		    TclLoadDbgMsg("NXFindBestFatArch() successful: " -			    "local cputype %d subtype %d, " -			    "fat cputype %d subtype %d", -			    arch->cputype | arch_abi, arch->cpusubtype, -			    fa->cputype, fa->cpusubtype); -		    mh = (void*)((char*)buffer + fa->offset); +		    mh = (void *)((char *) buffer + fa->offset);  		    ms = fa->size;  		} else { -		    TclLoadDbgMsg("NXFindBestFatArch() failed");  		    err = NSObjectFileImageInappropriateFile;  		}  		if (fh->magic != FAT_MAGIC) {  		    swap_fat_arch(fatarchs, fh_nfat_arch, arch->byteorder);  		}  	    } else { -		TclLoadDbgMsg("Fat binary header failure");  		err = NSObjectFileImageInappropriateFile;  	    }  	} else { @@ -683,26 +635,18 @@ TclpLoadMemory(  	     * Thin binary  	     */ -	    TclLoadDbgMsg("Thin binary");  	    mh = buffer;  	    ms = codeSize;  	}  	if (ms && !(ms >= mh_size && mh->magic == mh_magic &&  		 mh->filetype == MH_BUNDLE)) { -	    TclLoadDbgMsg("Inappropriate file: magic %x filetype %d", -		    mh->magic, mh->filetype);  	    err = NSObjectFileImageInappropriateFile;  	}  	if (err == NSObjectFileImageSuccess) {  	    err = NSCreateObjectFileImageFromMemory(buffer, codeSize,  		    &dyldObjFileImage); -	    if (err == NSObjectFileImageSuccess) { -		TclLoadDbgMsg("NSCreateObjectFileImageFromMemory() " -			"successful"); -	    } else { +	    if (err != NSObjectFileImageSuccess) {  		objFileImageErrMsg = DyldOFIErrorMsg(err); -		TclLoadDbgMsg("NSCreateObjectFileImageFromMemory() failed: %s", -			objFileImageErrMsg);  	    }  	} else {  	    objFileImageErrMsg = DyldOFIErrorMsg(err); @@ -717,8 +661,9 @@ TclpLoadMemory(      if (dyldObjFileImage == NULL) {  	vm_deallocate(mach_task_self(), (vm_address_t) buffer, size);  	if (objFileImageErrMsg != NULL) { -	    Tcl_AppendResult(interp, "NSCreateObjectFileImageFromMemory() " -		    "error: ", objFileImageErrMsg, NULL); +	    Tcl_SetObjResult(interp, Tcl_ObjPrintf( +		    "NSCreateObjectFileImageFromMemory() error: %s", +		    objFileImageErrMsg));  	}  	return TCL_ERROR;      } @@ -727,19 +672,17 @@ TclpLoadMemory(       * Extract the module we want from the image of the object file.       */ -    module = NSLinkModule(dyldObjFileImage, "[Memory Based Bundle]", -	    NSLINKMODULE_OPTION_BINDNOW | NSLINKMODULE_OPTION_RETURN_ON_ERROR); +    if (!(flags & 1)) nsflags |= NSLINKMODULE_OPTION_PRIVATE; +    if (!(flags & 2)) nsflags |= NSLINKMODULE_OPTION_BINDNOW; +    module = NSLinkModule(dyldObjFileImage, "[Memory Based Bundle]", nsflags);      NSDestroyObjectFileImage(dyldObjFileImage); -    if (module) { -	TclLoadDbgMsg("NSLinkModule() successful"); -    } else { +    if (!module) {  	NSLinkEditErrors editError;  	int errorNumber;  	const char *errorName, *errMsg;  	NSLinkEditError(&editError, &errorNumber, &errorName, &errMsg); -	TclLoadDbgMsg("NSLinkModule() failed: %s", errMsg); -	Tcl_AppendResult(interp, errMsg, NULL); +	Tcl_SetObjResult(interp, Tcl_NewStringObj(errMsg, -1));  	return TCL_ERROR;      } @@ -747,18 +690,19 @@ TclpLoadMemory(       * Stash the module reference within the load handle we create and return.       */ -    modulePtr = (Tcl_DyldModuleHandle *) ckalloc(sizeof(Tcl_DyldModuleHandle)); +    modulePtr = ckalloc(sizeof(Tcl_DyldModuleHandle));      modulePtr->module = module;      modulePtr->nextPtr = NULL; -    dyldLoadHandle = (Tcl_DyldLoadHandle *) -	    ckalloc(sizeof(Tcl_DyldLoadHandle)); -#if TCL_DYLD_USE_DLFCN +    dyldLoadHandle = ckalloc(sizeof(Tcl_DyldLoadHandle));      dyldLoadHandle->dlHandle = NULL; -#endif      dyldLoadHandle->dyldLibHeader = NULL;      dyldLoadHandle->modulePtr = modulePtr; -    *loadHandle = (Tcl_LoadHandle) dyldLoadHandle; -    *unloadProcPtr = &TclpUnloadFile; +    newHandle = ckalloc(sizeof(*newHandle)); +    newHandle->clientData = dyldLoadHandle; +    newHandle->findSymbolProcPtr = &FindSymbol; +    newHandle->unloadFileProcPtr = &UnloadFile; +    *loadHandle = newHandle; +    *unloadProcPtr = &UnloadFile;      return TCL_OK;  }  #endif /* TCL_LOAD_FROM_MEMORY */ | 
