00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdlib.h>
00025 #include <stdio.h>
00026
00027 #ifdef _WIN32
00028 #include <windows.h>
00029 #include <winbase.h>
00030 #elif defined(__DARWIN__)
00031 #include <mach-o/dyld.h>
00032 #elif defined(__MACOS__)
00033 #include <string.h>
00034 #include <Files.h>
00035 #include <CodeFragments.h>
00036 #else
00037 #include <dlfcn.h>
00038 #endif
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 int GlobalDebugDisplayFlag = 0;
00058
00059
00060
00061
00062
00063
00064
00065
00066 void *dynlolib_LoadLibrary(
00067 char *pszLibraryFile
00068 ){
00069
00070
00071
00072
00073
00074
00075 char *s,*r;
00076 void *pLib;
00077
00078
00079
00080
00081
00082
00083
00084
00085 r = s = malloc(strlen(pszLibraryFile)+1);
00086 if( s == NULL )return NULL;
00087 strcpy(s,pszLibraryFile);
00088
00089 #ifdef _WIN32
00090 for( ; *s ; s++ )
00091 if( *s == '/') *s = '\\';
00092 pLib = (void *)LoadLibrary(r);
00093 #elif defined(__DARWIN__)
00094 for( ; *s ; s++ )
00095 if( *s == '\\' || *s == ':') *s = '/';
00096
00097 if( !_dyld_present() ){
00098 pLib = NULL;
00099 if( GlobalDebugDisplayFlag ) fprintf(stderr,"dynamic linking not available.\n");
00100 }
00101 else {
00102 pLib = (void *)NSAddImage(r, NSADDIMAGE_OPTION_RETURN_ON_ERROR);
00103 if( pLib == NULL && GlobalDebugDisplayFlag ){
00104 NSLinkEditErrors c;
00105 int errorNumber;
00106 const char *fileName;
00107 const char *errorString;
00108 NSLinkEditError(&c,&errorNumber,&fileName,&errorString);
00109 fprintf( stderr, "%s", errorString );
00110 }
00111 }
00112 #elif defined(__MACOS__)
00113 {
00114 FSSpec fileSpec;
00115 Str255 errMsg;
00116 int err, slen;
00117 Ptr mainAddr;
00118 char *hasColon = strchr(s, ':');
00119 pLib = NULL;
00120
00121
00122 slen = strlen(r);
00123 memmove( r+1, r, slen);
00124 *r=(unsigned char)slen;
00125
00126 if( hasColon ){
00127 err = FSMakeFSSpec (0, 0, r, &fileSpec);
00128 if( err == noErr)
00129 err = GetDiskFragment (&fileSpec, 0, 0, NULL, kLoadCFrag, (CFragConnectionID *)&pLib, mainAddr, errMsg );
00130 }
00131 else
00132 err = GetSharedLibrary( r, kPowerPCCFragArch, kLoadCFrag, (CFragConnectionID *)&pLib, mainAddr, errMsg );
00133 if( err < 0 && GlobalDebugDisplayFlag )
00134 fprintf(stderr,"GetSharedLibrary error %d, message=%*s\n", err, *errMsg, errMsg+1);
00135 }
00136 #else
00137 for( ; *s ; s++ )
00138 if( *s == '\\' || *s == ':') *s = '/';
00139 pLib = (void *)dlopen(r,RTLD_LAZY);
00140 if( pLib == NULL && GlobalDebugDisplayFlag ){
00141 fprintf(stderr,"dlopen failed.\n");
00142 fprintf(stderr,"dlerror message=%s\n",dlerror());
00143 }
00144 #endif
00145 free(r);
00146 return pLib;
00147 }
00148
00149
00150
00151
00152
00153
00154
00155 void dynlolib_FreeLibrary(
00156 void *pLibrary
00157 ){
00158
00159
00160
00161
00162 #ifdef _WIN32
00163 FreeLibrary((HMODULE)pLibrary);
00164 #elif defined(__DARWIN__)
00165
00166 #elif defined(__MACOS__)
00167
00168
00169 #else
00170 dlclose(pLibrary);
00171 #endif
00172 return;
00173 }
00174
00175
00176
00177
00178
00179
00180
00181
00182 void *dynlolib_GetFunctionByName(
00183 void *pLibrary,
00184 char *pszFunctionName
00185 ){
00186
00187
00188
00189
00190
00191
00192 #ifdef _WIN32
00193 return GetProcAddress((HMODULE)pLibrary,pszFunctionName);
00194 #elif defined(__DARWIN__)
00195 char *fnName;
00196 NSSymbol sym;
00197
00198 fnName = malloc(strlen(pszFunctionName)+2);
00199 if( fnName==NULL ) return NULL;
00200 strcpy(fnName+1,pszFunctionName);
00201 *fnName = '_';
00202
00203 sym = NSLookupSymbolInImage((struct mach_header *)pLibrary, fnName,
00204 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
00205 free(fnName);
00206 if( !sym ) {
00207 if( GlobalDebugDisplayFlag ){
00208 NSLinkEditErrors c;
00209 int errorNumber;
00210 const char *fileName;
00211 const char *errorString;
00212 NSLinkEditError(&c,&errorNumber,&fileName,&errorString);
00213 fprintf( stderr, "%s", errorString );
00214 }
00215 return NULL;
00216 }
00217 return NSAddressOfSymbol(sym);
00218 #elif defined(__MACOS__)
00219 {
00220 Str255 str255;
00221 void *symAdr = NULL;
00222 CFragSymbolClass symClass;
00223 int err;
00224
00225
00226 *str255 = (unsigned char)strlen(pszFunctionName);
00227 memcpy( str255+1, pszFunctionName, *str255 );
00228
00229 err = FindSymbol( (CFragConnectionID)pLibrary, str255, &symAdr, &symClass );
00230 if( err < 0 && GlobalDebugDisplayFlag )
00231 fprintf(stderr,"FindSymbol error %d: %s\n", err, pszFunctionName);
00232 return symAdr;
00233 }
00234 #else
00235 return dlsym(pLibrary,pszFunctionName);
00236 #endif
00237 }