dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Dotgnu-pnet-commits] CVS: pnet/support dynlib.c,1.7,1.8


From: Rhys Weatherley <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnet/support dynlib.c,1.7,1.8
Date: Sat, 14 Jun 2003 23:53:38 -0400

Update of /cvsroot/dotgnu-pnet/pnet/support
In directory subversions:/tmp/cvs-serv3608/support

Modified Files:
        dynlib.c 
Log Message:


Try using NSAddImage to load dynamic libraries on MacOS X if
NSCreateObjectFileImageFromFile fails; use a different symbol lookup
mechanism if it is an image; improved error reporting when something
goes wrong.


Index: dynlib.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/support/dynlib.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -r1.7 -r1.8
*** dynlib.c    14 Jun 2003 04:46:32 -0000      1.7
--- dynlib.c    15 Jun 2003 03:53:36 -0000      1.8
***************
*** 156,164 ****
        NSObjectFileImageReturnCode result;
        NSModule module;
  
        /* Attempt to open the dylib file */
        result = NSCreateObjectFileImageFromFile(name, &file);
!       if (result != NSObjectFileImageSuccess)
        {
                return 0;
        }
--- 156,191 ----
        NSObjectFileImageReturnCode result;
        NSModule module;
+       void *image;
+       const char *msg;
  
        /* Attempt to open the dylib file */
        result = NSCreateObjectFileImageFromFile(name, &file);
!       if(result == NSObjectFileImageInappropriateFile)
        {
+               /* May be an image, and not a bundle */
+               image = (void *)NSAddImage(name, 
NSADDIMAGE_OPTION_RETURN_ON_ERROR);
+               if(image)
+               {
+                       return image;
+               }
+       }
+       if(result != NSObjectFileImageSuccess)
+       {
+               switch(result)
+               {
+                       case NSObjectFileImageFailure:
+                               msg = " (NSObjectFileImageFailure)"; break;
+                       case NSObjectFileImageInappropriateFile:
+                               msg = " (NSObjectFileImageInappropriateFile)"; 
break;
+                       case NSObjectFileImageArch:
+                               msg = " (NSObjectFileImageArch)"; break;
+                       case NSObjectFileImageFormat:
+                               msg = " (NSObjectFileImageFormat)"; break;
+                       case NSObjectFileImageAccess:
+                               msg = " (NSObjectFileImageAccess)"; break;
+                       default:
+                               msg = ""; break;
+               }
+               fprintf(stderr, "%s: could not load dynamic library%s\n", name, 
msg);
                return 0;
        }
***************
*** 174,177 ****
--- 201,210 ----
  void  ILDynLibraryClose(void *handle)
  {
+       if((((struct mach_header *)handle)->magic == MH_MAGIC) ||
+          (((struct mach_header *)handle)->magic == MH_CIGAM))
+       {
+               /* Cannot remove dynamic images once they've been loaded */
+               return;
+       }
        NSUnLinkModule((NSModule)handle, NSUNLINKMODULE_OPTION_NONE);
  }
***************
*** 180,188 ****
  {
        NSSymbol sym;
!       sym = NSLookupSymbolInModule((NSModule)handle, symbol);
        if(sym == 0)
        {
                return 0;
        }
        return (void *)NSAddressOfSymbol(sym);
  }
--- 213,244 ----
  {
        NSSymbol sym;
! 
!       /* We have to use a different lookup approach for images and modules */
!       if((((struct mach_header *)handle)->magic == MH_MAGIC) ||
!          (((struct mach_header *)handle)->magic == MH_CIGAM))
!       {
!               if(NSIsSymbolNameDefinedInImage((struct mach_header *)handle, 
symbol))
!               {
!                       sym = NSLookupSymbolInImage((struct mach_header 
*)handle, symbol,
!                                               
NSLOOKUPSYMBOLINIMAGE_OPTION_BIND |
!                                               
NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
!               }
!               else
!               {
!                       sym = 0;
!               }
!       }
!       else
!       {
!               sym = NSLookupSymbolInModule((NSModule)handle, symbol);
!       }
! 
!       /* Did we find the symbol? */
        if(sym == 0)
        {
                return 0;
        }
+ 
+       /* Convert the symbol into the address that we require */
        return (void *)NSAddressOfSymbol(sym);
  }





reply via email to

[Prev in Thread] Current Thread [Next in Thread]