diff options
Diffstat (limited to 'unix/tclLoadDyld.c')
| -rw-r--r-- | unix/tclLoadDyld.c | 44 | 
1 files changed, 30 insertions, 14 deletions
| diff --git a/unix/tclLoadDyld.c b/unix/tclLoadDyld.c index 95735a4..50c283d 100644 --- a/unix/tclLoadDyld.c +++ b/unix/tclLoadDyld.c @@ -16,7 +16,7 @@  #include "tclInt.h"  #ifndef MODULE_SCOPE -#   define MODULE_SCOPE		extern +#   define MODULE_SCOPE extern  #endif  /* @@ -148,10 +148,11 @@ 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;      Tcl_LoadHandle newHandle; @@ -169,6 +170,9 @@ TclpDlopen(      int result;      Tcl_DString ds;      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 @@ -182,20 +186,28 @@ TclpDlopen(  #if TCL_DYLD_USE_DLFCN      /* -     * Use (RTLD_NOW|RTLD_LOCAL) always, see [Bug #3216070] +     * Use (RTLD_NOW|RTLD_LOCAL) as default, see [Bug #3216070]       */ -    dlHandle = dlopen(nativePath, RTLD_NOW | RTLD_LOCAL); +    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. -	 * -	 * Use (RTLD_NOW|RTLD_LOCAL) always, see [Bug #3216070]  	 */ -	dlHandle = dlopen(nativeFileName, RTLD_NOW | RTLD_LOCAL); +	dlHandle = dlopen(nativeFileName, dlopenflags);  	if (!dlHandle) {  	    errMsg = dlerror();  	} @@ -237,9 +249,10 @@ TclpDlopen(  		err = NSCreateObjectFileImageFromFile(nativePath,  			&dyldObjFileImage);  		if (err == NSObjectFileImageSuccess && dyldObjFileImage) { -		    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 = ckalloc(sizeof(Tcl_DyldModuleHandle)); @@ -552,10 +565,11 @@ 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; @@ -563,6 +577,7 @@ TclpLoadMemory(      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. @@ -647,7 +662,7 @@ TclpLoadMemory(  	vm_deallocate(mach_task_self(), (vm_address_t) buffer, size);  	if (objFileImageErrMsg != NULL) {  	    Tcl_SetObjResult(interp, Tcl_ObjPrintf( -		    "NSCreateObjectFileImageFromMemory() error: ", +		    "NSCreateObjectFileImageFromMemory() error: %s",  		    objFileImageErrMsg));  	}  	return TCL_ERROR; @@ -657,8 +672,9 @@ 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) {  	NSLinkEditErrors editError; | 
