void * Instance_Module_Load(const char * libLocation, const char * name, void ** Load, void ** Unload) { char fileName[MAX_LOCATION]; char extension[MAX_EXTENSION]; void * library = null; #if defined(__unix__) || defined(__APPLE__) int attempts = 0; char * paths[] = { null, "/usr/lib/ec/lib", "/usr/lib32/ec/lib" }; #endif *Load = null; *Unload = null; #if defined(__WIN32__) strcpy(fileName, name); GetExtension(fileName, extension); if(!extension[0]) strcat(fileName, ".dll"); { uint16 _wfileName[MAX_LOCATION]; UTF8toUTF16Buffer(fileName, _wfileName, MAX_LOCATION); library = LoadLibraryW(_wfileName); } if(library) { #ifdef _WIN64 *Load = (void *)GetProcAddress(library, "__ecereDll_Load"); *Unload = (void *)GetProcAddress(library, "__ecereDll_Unload"); #else *Load = (void *)GetProcAddress(library, "__ecereDll_Load@4"); *Unload = (void *)GetProcAddress(library, "__ecereDll_Unload@4"); #endif if(!*Load) FreeLibrary(library); } #elif defined(__unix__) || defined(__APPLE__) if(libLocation || strchr(name, '/')) strcpy(fileName, libLocation ? libLocation : ""); else strcpy(fileName, "lib"); strcat(fileName, name); GetExtension(fileName, extension); if(!extension[0]) #if defined(__APPLE__) strcat(fileName, ".dylib"); #else strcat(fileName, ".so"); #endif #if !defined(__EMSCRIPTEN__) // dlerror(); library = dlopen(fileName, RTLD_LAZY); // if(!library) // printf("Error opening %s: %s", fileName, dlerror()); #endif while(!library && attempts < sizeof(paths)/sizeof(paths[0])) { if(paths[attempts]) strcpy(fileName, paths[attempts++]); else { attempts++; #ifdef DEB_HOST_MULTIARCH strcpy(fileName, DEB_HOST_MULTIARCH); strcat(fileName, "/ec/lib"); #else continue; #endif } strcat(fileName, name); GetExtension(fileName, extension); if(!extension[0]) #if defined(__APPLE__) strcat(fileName, ".dylib"); #else strcat(fileName, ".so"); #endif #if !defined(__EMSCRIPTEN__) library = dlopen(fileName, RTLD_LAZY); #endif } if(library) { *Load = dlsym(library, "__ecereDll_Load"); *Unload = dlsym(library, "__ecereDll_Unload"); #if !defined(__EMSCRIPTEN__) if(!*Load) dlclose(library); #endif } #elif defined(__APPLE__) if(libLocation || strchr(name, '/')) strcpy(fileName, libLocation ? libLocation : ""); else strcpy(fileName, "lib"); strcat(fileName, name); GetExtension(fileName, extension); if(!extension[0]) strcat(fileName, ".dylib"); { NSObjectFileImage *fileImage; NSObjectFileImageReturnCode returnCode = NSCreateObjectFileImageFromFile(fileName, &fileImage); if(returnCode == NSObjectFileImageSuccess) { printf("NSObjectFileImageSuccess!\n"); library = NSLinkModule(fileImage,fileName, NSLINKMODULE_OPTION_RETURN_ON_ERROR | NSLINKMODULE_OPTION_PRIVATE); // NSDestroyObjectFileImage(fileImage); if(library) { *Load = NSAddressOfSymbol(NSLookupSymbolInModule(library, "__ecereDll_Load")); *Unload = NSAddressOfSymbol(NSLookupSymbolInModule(library, "__ecereDll_Unload")); if(!*Load) { NSUnLinkModule(library, 0); } else printf("Found Load!\n"); } } else printf("No Success :(\n"); } #endif return library; }
bool Instance_LocateModule(char * name, char * fileName) { #if defined(__WIN32__) HMODULE hModule = null; if(name && name[0]) { uint16 _wmoduleName[MAX_LOCATION]; UTF8toUTF16Buffer(name, _wmoduleName, MAX_LOCATION); hModule = GetModuleHandle(_wmoduleName); if(!hModule) { wcscat(_wmoduleName, L".exe"); hModule = GetModuleHandle(_wmoduleName); } if(hModule) { uint16 _wfileName[MAX_LOCATION]; GetModuleFileNameW(hModule, _wfileName, MAX_LOCATION); UTF16toUTF8Buffer(_wfileName, (byte *)fileName, MAX_LOCATION); return true; } } else { uint16 _wfileName[MAX_LOCATION]; GetModuleFileNameW(null, _wfileName, MAX_LOCATION); UTF16toUTF8Buffer(_wfileName, (byte *)fileName, MAX_LOCATION); return true; } #elif defined(__APPLE__) if(name && name[0]) { int imageCount = _dyld_image_count(); int c; int nameLen = strlen(name); for(c = 0; c<imageCount; c++) { struct mach_header * header = _dyld_get_image_header(c); char * path = _dyld_get_image_name(c); int pathLen = strlen(path); char * subStr = RSearchString(path, name, pathLen, false, false); if(subStr) { if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) && (!subStr[nameLen] || !strncmp(subStr + nameLen, ".dylib", 6))) { strcpy(fileName, path); return true; } } } } else { int size = MAX_LOCATION; _NSGetExecutablePath(fileName, &size); return true; } #elif defined(__unix__) //File f = FileOpen("/proc/self/maps", read); FILE * f; char exeName[MAX_FILENAME]; exeName[0] = 0; #if defined(__linux__) f = fopen("/proc/self/status", "r"); #else f = fopen("/proc/curproc/status", "r"); #endif if(f) { char line[1025]; while(fgets(line, sizeof(line), f)) { char * name = strstr(line, "Name:\t"); if(name) { int nameLen; name += 6; nameLen = strlen(name); name[--nameLen] = 0; strcpy(exeName, name); break; } } fclose(f); } #if defined(__linux__) f = fopen("/proc/self/maps", "r"); #else f = fopen("/proc/curproc/map", "r"); #endif if(f) { char line[1025]; //while(f.GetLine(line, sizeof(line))) while(fgets(line, sizeof(line), f)) { char * path = strstr(line, "/"); if(path) { int pathLen = strlen(path); path[--pathLen] = 0; if(name && name[0]) { int nameLen = strlen(name); char * subStr; subStr = RSearchString(path, name, pathLen, false, false); if(subStr) { if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) && (!subStr[nameLen] || !strncmp(subStr + nameLen, ".so", 3))) { char * space = strchr(path, ' '); if(space) *space = 0; strcpy(fileName, path); fclose(f); return true; } } } else { char name[MAX_FILENAME]; GetLastDirectory(path, name); if(!exeName[0] || !strcmp(name, exeName)) { char * space = strchr(path, ' '); if(space) *space = 0; strcpy(fileName, path); fclose(f); return true; } } } } fclose(f); } if(!name || !name[0]) { strcpy(fileName, exeLocation); return true; } #endif return false; }
bool Instance_LocateModule(const char * name, char * fileName) { #if defined(__WIN32__) HMODULE hModule = null; if(name && name[0]) { uint16 _wmoduleName[MAX_LOCATION]; UTF8toUTF16Buffer(name, _wmoduleName, MAX_LOCATION); hModule = GetModuleHandle(_wmoduleName); if(!hModule) { wcscat(_wmoduleName, L".exe"); hModule = GetModuleHandle(_wmoduleName); } if(hModule) { uint16 _wfileName[MAX_LOCATION]; GetModuleFileNameW(hModule, _wfileName, MAX_LOCATION); UTF16toUTF8Buffer(_wfileName, fileName, MAX_LOCATION); return true; } } else { uint16 _wfileName[MAX_LOCATION]; GetModuleFileNameW(null, _wfileName, MAX_LOCATION); UTF16toUTF8Buffer(_wfileName, fileName, MAX_LOCATION); return true; } #elif defined(__APPLE__) if(name && name[0]) { int imageCount = _dyld_image_count(); int c; int nameLen = strlen(name); for(c = 0; c<imageCount; c++) { struct mach_header * header = _dyld_get_image_header(c); char * path = _dyld_get_image_name(c); int pathLen = strlen(path); char * subStr = RSearchString(path, name, pathLen, false, false); if(subStr) { if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) && (!subStr[nameLen] || !strncmp(subStr + nameLen, ".dylib", 6))) { strcpy(fileName, path); return true; } } } } else { int size = MAX_LOCATION; _NSGetExecutablePath(fileName, &size); return true; } #elif defined(__unix__) //File f = FileOpen("/proc/self/maps", read); FILE * f = null; char exeName[MAX_FILENAME]; exeName[0] = 0; #if defined(__linux__) f = fopen("/proc/self/status", "r"); #else f = fopen("/proc/curproc/status", "r"); #endif if(f) { char line[1025]; while(fgets(line, sizeof(line), f)) { char * name = strstr(line, "Name:\t"); if(name) { int nameLen; name += 6; nameLen = strlen(name); name[--nameLen] = 0; strcpy(exeName, name); break; } } fclose(f); } #if defined(__linux__) f = fopen("/proc/self/maps", "r"); #else f = fopen("/proc/curproc/map", "r"); #endif if(f) { char line[1025]; //while(f.GetLine(line, sizeof(line))) while(fgets(line, sizeof(line), f)) { char * path = strstr(line, "/"); if(path) { int pathLen = strlen(path); path[--pathLen] = 0; if(name && name[0]) { int nameLen = strlen(name); char * subStr; subStr = RSearchString(path, name, pathLen, false, false); if(subStr) { if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) && (!subStr[nameLen] || !strncmp(subStr + nameLen, ".so", 3))) { char * space = strchr(path, ' '); if(space) *space = 0; strcpy(fileName, path); fclose(f); return true; } } } else { char name[MAX_FILENAME]; GetLastDirectory(path, name); if(!exeName[0] || !strcmp(name, exeName)) { char * space = strchr(path, ' '); if(space) *space = 0; strcpy(fileName, path); fclose(f); return true; } } } } fclose(f); } #if !defined(ECERE_NOFILE) && !defined(__linux__) && !defined(__EMSCRIPTEN__) if(name && name[0]) { // Couldn't locate libraries with /proc/curmap/map, attempt with ldd FILE * in = null, * out = null; _DualPipe * p; char command[MAX_LOCATION]; snprintf(command, sizeof(command), "ldd /proc/%d/file", (int)getpid()); p = _DualPipeOpen(1, command, null, &in, &out); if(p) { bool result = false; char line[1025]; int nameLen = strlen(name); while(DualPipe_GetLine(in, line, sizeof(line))) { char * path = strstr(line, "/"); if(path) { int pathLen = strlen(path); char * subStr; path[--pathLen] = 0; subStr = RSearchString(path, name, pathLen, false, false); if(subStr) { if(( *(subStr-1) == '/' || !strncmp(subStr - 4, "/lib", 4)) && (!subStr[nameLen] || !strncmp(subStr + nameLen, ".so", 3))) { char * space = strchr(path, ' '); if(space) *space = 0; strcpy(fileName, path); result = true; } } } } DualPipe_Wait(p); fclose(in); DualPipe_Destructor(p); return result; } } #endif if(!name || !name[0]) { #if defined(__FreeBSD__) { int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; size_t cb = MAX_LOCATION; fileName[0] = 0; sysctl(mib, 4, fileName, &cb, null, 0); if(fileName[0]) return true; } #endif #if !defined(__linux__) { char * env; if(!access("/proc/curproc/file", F_OK)) { strcpy(fileName, "/proc/curproc/file"); return true; } if((env = getenv("_"))) { strcpy(fileName, env); return true; } } #endif strcpy(fileName, exeLocation); return true; } #endif return false; }
void * Instance_Module_Load(char * name, void ** Load, void ** Unload) { char fileName[MAX_LOCATION]; char extension[MAX_EXTENSION]; void * library = null; *Load = null; *Unload = null; #if defined(__WIN32__) strcpy(fileName, name); GetExtension(fileName, extension); if(!extension[0]) strcat(fileName, ".dll"); { uint16 _wfileName[MAX_LOCATION]; UTF8toUTF16Buffer(fileName, _wfileName, MAX_LOCATION); library = LoadLibraryW(_wfileName); } if(library) { *Load = (void *)GetProcAddress(library, "__ecereDll_Load@4"); *Unload = (void *)GetProcAddress(library, "__ecereDll_Unload@4"); if(!*Load) FreeLibrary(library); } #elif defined(__unix__) || defined(__APPLE__) strcpy(fileName, "lib"); strcat(fileName, name); GetExtension(fileName, extension); if(!extension[0]) #if defined(__APPLE__) strcat(fileName, ".dylib"); #else strcat(fileName, ".so"); #endif library = dlopen(fileName, RTLD_LAZY); if(library) { *Load = dlsym(library, "__ecereDll_Load"); *Unload = dlsym(library, "__ecereDll_Unload"); if(!*Load) dlclose(library); } #elif defined(__APPLE__) strcpy(fileName, "lib"); strcat(fileName, name); GetExtension(fileName, extension); if(!extension[0]) strcat(fileName, ".dylib"); { NSObjectFileImage *fileImage; NSObjectFileImageReturnCode returnCode = NSCreateObjectFileImageFromFile(fileName, &fileImage); if(returnCode == NSObjectFileImageSuccess) { printf("NSObjectFileImageSuccess!\n"); library = NSLinkModule(fileImage,fileName, NSLINKMODULE_OPTION_RETURN_ON_ERROR | NSLINKMODULE_OPTION_PRIVATE); // NSDestroyObjectFileImage(fileImage); if(library) { *Load = NSAddressOfSymbol(NSLookupSymbolInModule(library, "__ecereDll_Load")); *Unload = NSAddressOfSymbol(NSLookupSymbolInModule(library, "__ecereDll_Unload")); if(!*Load) { NSUnLinkModule(library, 0); } else printf("Found Load!\n"); } } else printf("No Success :(\n"); } #endif return library; }