[Top][All Lists]
[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 */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Dotgnu-pnet-commits] CVS: pnet/support dynlib.c,1.6,1.7,
Rhys Weatherley <address@hidden> <=