Fix compile problem on OS X Snow Leopard. The Mac code for dynamic
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 28 Sep 2009 16:05:34 +0000 (16:05 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 28 Sep 2009 16:05:34 +0000 (16:05 +0000)
library loading was using some non-public OS X functions, which give
linking issues for me. Since OS X 10.3 standard unix dlopen() is
supported, so I just removed this code, we don't support earlier
versions anyway.

source/blender/blenlib/intern/dynlib.c

index 858aa6e60bf96582c5379469b431d79d27bd0681..4820f5529c132ccb259bb0824cc1e7413eba288f 100644 (file)
@@ -23,8 +23,6 @@
  * The Original Code is: all of this file, with exception of below:
  *
  * Contributor(s): Peter O'Gorman
- * The functions osxdlopen() and osxerror() 
- * are Copyright (c) 2002 Peter O'Gorman <ogorman@users.sourceforge.net>
  *
  * ***** END GPL LICENSE BLOCK *****
  */
@@ -102,202 +100,6 @@ void PIL_dynlib_close(PILdynlib *lib) {
        free(lib);
 }
 
-#else
-#ifdef __APPLE__       /* MacOS X */
-
-#include <mach-o/dyld.h>
-#include <dlfcn.h>
-#include <stdarg.h>
-
-#define ERR_STR_LEN 256
-
-struct PILdynlib {
-       void *handle;
-};
-
-static char *osxerror(int setget, const char *str, ...)
-{
-       static char errstr[ERR_STR_LEN];
-       static int err_filled = 0;
-       char *retval;
-       NSLinkEditErrors ler;
-       int lerno;
-       const char *dylderrstr;
-       const char *file;
-       va_list arg;
-       if (setget <= 0)
-       {
-               va_start(arg, str);
-               strncpy(errstr, "dlsimple: ", ERR_STR_LEN);
-               vsnprintf(errstr + 10, ERR_STR_LEN - 10, str, arg);
-               va_end(arg);
-       /* We prefer to use the dyld error string if setget is 0 */
-               if (setget == 0) {
-                       NSLinkEditError(&ler, &lerno, &file, &dylderrstr);
-//                     printf("dyld: %s\n",dylderrstr);
-                       if (dylderrstr && strlen(dylderrstr))
-                               strncpy(errstr,dylderrstr,ERR_STR_LEN);
-               }               
-               err_filled = 1;
-               retval = NULL;
-       }
-       else
-       {
-               if (!err_filled)
-                       retval = NULL;
-               else
-                       retval = errstr;
-               err_filled = 0;
-       }
-       return retval;
-}
-
-static void *osxdlopen(const char *path, int mode)
-{
-       void *module = 0;
-       NSObjectFileImage ofi = 0;
-       NSObjectFileImageReturnCode ofirc;
-       static int (*make_private_module_public) (NSModule module) = 0;
-       unsigned int flags =  NSLINKMODULE_OPTION_RETURN_ON_ERROR | NSLINKMODULE_OPTION_PRIVATE;
-
-       /* If we got no path, the app wants the global namespace, use -1 as the marker
-          in this case */
-       if (!path)
-               return (void *)-1;
-
-       /* Create the object file image, works for things linked with the -bundle arg to ld */
-       ofirc = NSCreateObjectFileImageFromFile(path, &ofi);
-       switch (ofirc)
-       {
-               case NSObjectFileImageSuccess:
-                       /* It was okay, so use NSLinkModule to link in the image */
-                       if (!(mode & RTLD_LAZY)) flags += NSLINKMODULE_OPTION_BINDNOW;
-                       module = NSLinkModule(ofi, path,flags);
-                       /* Don't forget to destroy the object file image, unless you like leaks */
-                       NSDestroyObjectFileImage(ofi);
-                       /* If the mode was global, then change the module, this avoids
-                          multiply defined symbol errors to first load private then make
-                          global. Silly, isn't it. */
-                       if ((mode & RTLD_GLOBAL))
-                       {
-                         if (!make_private_module_public)
-                         {
-                           _dyld_func_lookup("__dyld_NSMakePrivateModulePublic", 
-                               (unsigned long *)&make_private_module_public);
-                         }
-                         make_private_module_public(module);
-                       }
-                       break;
-               case NSObjectFileImageInappropriateFile:
-                       /* It may have been a dynamic library rather than a bundle, try to load it */
-                       module = (void *)NSAddImage(path, NSADDIMAGE_OPTION_RETURN_ON_ERROR);
-                       break;
-               case NSObjectFileImageFailure:
-                       osxerror(0,"Object file setup failure :  \"%s\"", path);
-                       return 0;
-               case NSObjectFileImageArch:
-                       osxerror(0,"No object for this architecture :  \"%s\"", path);
-                       return 0;
-               case NSObjectFileImageFormat:
-                       osxerror(0,"Bad object file format :  \"%s\"", path);
-                       return 0;
-               case NSObjectFileImageAccess:
-                       osxerror(0,"Can't read object file :  \"%s\"", path);
-                       return 0;               
-       }
-       if (!module)
-               osxerror(0, "Can not open \"%s\"", path);
-       return module;
-}
-
-PILdynlib *PIL_dynlib_open(char *name) {
-       void *handle= osxdlopen(name, RTLD_LAZY);
-
-       if (handle) {   
-               PILdynlib *lib= malloc(sizeof(*lib));
-               lib->handle= handle;
-               
-               return lib;
-       } else {
-               return NULL;
-       }
-}
-
-void *PIL_dynlib_find_symbol(PILdynlib* lib, char *symname) 
-{
-       int sym_len = strlen(symname);
-       void *value = NULL;
-       char *malloc_sym = NULL;
-       NSSymbol *nssym = 0;
-       malloc_sym = malloc(sym_len + 2);
-       if (malloc_sym)
-       {
-               sprintf(malloc_sym, "_%s", symname);
-               /* If the lib->handle is -1, if is the app global context */
-               if (lib->handle == (void *)-1)
-               {
-                       /* Global context, use NSLookupAndBindSymbol */
-                       if (NSIsSymbolNameDefined(malloc_sym))
-                       {
-                               nssym = NSLookupAndBindSymbol(malloc_sym);
-                       }
-               }
-               /* Now see if the lib->handle is a struch mach_header* or not, use NSLookupSymbol in image
-                  for libraries, and NSLookupSymbolInModule for bundles */
-               else
-               {
-                       /* Check for both possible magic numbers depending on x86/ppc byte order */
-                       if ((((struct mach_header *)lib->handle)->magic == MH_MAGIC) ||
-                               (((struct mach_header *)lib->handle)->magic == MH_CIGAM))
-                       {
-                               if (NSIsSymbolNameDefinedInImage((struct mach_header *)lib->handle, malloc_sym))
-                               {
-                                       nssym = NSLookupSymbolInImage((struct mach_header *)lib->handle,
-                                                                                                 malloc_sym,
-                                                                                                 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND
-                                                                                                 | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
-                               }
-       
-                       }
-                       else
-                       {
-                               nssym = NSLookupSymbolInModule(lib->handle, malloc_sym);
-                       }
-               }
-               if (!nssym)
-               {
-                       osxerror(0, "symname \"%s\" Not found", symname);
-               }
-               value = NSAddressOfSymbol(nssym);
-               free(malloc_sym);
-       }
-       else
-       {
-               osxerror(-1, "Unable to allocate memory");
-       }
-       return value;
-}
-
-char *PIL_dynlib_get_error_as_string(PILdynlib* lib) 
-{
-       return osxerror(1, (char *)NULL);
-}
-       
-void PIL_dynlib_close(PILdynlib *lib) 
-{
-       if ((((struct mach_header *)lib->handle)->magic == MH_MAGIC) ||
-               (((struct mach_header *)lib->handle)->magic == MH_CIGAM))
-       {
-               osxerror(-1, "Can't remove dynamic libraries on darwin");
-       }
-       if (!NSUnLinkModule(lib->handle, 0))
-       {
-               osxerror(0, "unable to unlink module %s", NSNameOfModule(lib->handle));
-       }
-       
-       free(lib);
-}
-
 #else  /* Unix */
 
 #include <dlfcn.h>
@@ -334,4 +136,4 @@ void PIL_dynlib_close(PILdynlib *lib) {
 }
 
 #endif
-#endif
+