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.6,1.7


From: Rhys Weatherley <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnet/support dynlib.c,1.6,1.7
Date: Sat, 14 Jun 2003 00:46:35 -0400

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

Modified Files:
        dynlib.c 
Log Message:


Improve dynamic library support under MacOS X.


Index: dynlib.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/support/dynlib.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** dynlib.c    15 May 2003 02:46:28 -0000      1.6
--- dynlib.c    14 Jun 2003 04:46:32 -0000      1.7
***************
*** 147,150 ****
--- 147,217 ----
  }
  
+ #elif defined(__APPLE__) && defined(__MACH__) /* MacOS X */
+ 
+ #include <mach-o/dyld.h>
+ 
+ void *ILDynLibraryOpen(const char *name)
+ {
+       NSObjectFileImage file;
+       NSObjectFileImageReturnCode result;
+       NSModule module;
+ 
+       /* Attempt to open the dylib file */
+       result = NSCreateObjectFileImageFromFile(name, &file);
+       if (result != NSObjectFileImageSuccess)
+       {
+               return 0;
+       }
+ 
+       /* Link the module dependencies */
+       module = NSLinkModule(file, name,
+                                                 NSLINKMODULE_OPTION_BINDNOW |
+                                                 NSLINKMODULE_OPTION_PRIVATE |
+                                                 
NSLINKMODULE_OPTION_RETURN_ON_ERROR);
+       return (void *)module;
+ }
+ 
+ void  ILDynLibraryClose(void *handle)
+ {
+       NSUnLinkModule((NSModule)handle, NSUNLINKMODULE_OPTION_NONE);
+ }
+ 
+ static void *GetSymbol(void *handle, const char *symbol)
+ {
+       NSSymbol sym;
+       sym = NSLookupSymbolInModule((NSModule)handle, symbol);
+       if(sym == 0)
+       {
+               return 0;
+       }
+       return (void *)NSAddressOfSymbol(sym);
+ }
+ 
+ void *ILDynLibraryGetSymbol(void *handle, const char *symbol)
+ {
+       void *value = GetSymbol(handle, (char *)symbol);
+       char *newName;
+       if(value)
+       {
+               return value;
+       }
+       newName = (char *)ILMalloc(strlen(symbol) + 2);
+       if(newName)
+       {
+               /* Try again with '_' prepended to the name */
+               newName[0] = '_';
+               strcpy(newName + 1, symbol);
+               value = GetSymbol(handle, newName);
+               if(value)
+               {
+                       ILFree(newName);
+                       return value;
+               }
+               ILFree(newName);
+       }
+       fprintf(stderr, "%s: could not find the specified symbol\n", symbol);
+       return 0;
+ }
+ 
  #else /* No dynamic library support */
  





reply via email to

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