CBinaryFile* CBinaryManager::FindBinary(char* szPath, bool bSrvCheck /* = true */) { std::string szBinaryPath = szPath; #ifdef __linux__ if (bSrvCheck && !str_ends_with(szBinaryPath.data(), "_srv") && !str_ends_with(szBinaryPath.data(), ".so")) szBinaryPath += "_srv.so"; else if (!str_ends_with(szBinaryPath.data(), ".so")) szBinaryPath += ".so"; #endif unsigned long ulAddr = (unsigned long) dlLoadLibrary(szBinaryPath.data()); #ifdef __linux__ if (!ulAddr) { char szGameDir[MAX_PATH_LENGTH]; engine->GetGameDir(szGameDir, MAX_PATH_LENGTH); // If the previous path failed, try the "bin" folder of the game. // This will allow passing e.g. "server" to this function. szBinaryPath = std::string(szGameDir) + "/bin/" + szBinaryPath; ulAddr = (unsigned long) dlLoadLibrary(szBinaryPath.data()); } #endif if (!ulAddr) { szBinaryPath = "Unable to find " + szBinaryPath; #ifdef _WIN32 if (!str_ends_with(szBinaryPath.data(), ".dll")) szBinaryPath += ".dll"; #endif BOOST_RAISE_EXCEPTION(PyExc_IOError, szBinaryPath.data()) }
int main(int argc, char* argv[]) { int i, n; DLLib* pLib; const char* libPath; if (argc == 1) { fprintf(stderr, "usage : %s <dllpath>\n", argv[0]); return 1; } libPath = argv[1]; /* load lib */ pLib = dlLoadLibrary(libPath); if (!pLib) { fprintf(stderr, "unable to open library %s\n", libPath); return 2; } list_syms(libPath); dlFreeLibrary(pLib); return 0; }
static PyObject* pydc_load(PyObject* self, PyObject* args) { const char* libpath; void* libhandle; if ( !PyArg_ParseTuple(args,"s", &libpath) ) return PyErr_Format(PyExc_RuntimeError, "libpath argument (string) missing"); libhandle = dlLoadLibrary(libpath); if (!libhandle) return PyErr_Format(PyExc_RuntimeError, "dlLoadLibrary('%s') failed", libpath); return PyCObject_FromVoidPtr(libhandle, &free_library); }
static MODLIST _FAR *addlib(MODLIST *root, AMX *amx, const TCHAR *name) { MODLIST _FAR *item; const TCHAR *ptr = skippath(name); assert(findlib(root, amx, name) == NULL); /* should not already be there */ if ((item = malloc(sizeof(MODLIST))) == NULL) goto error; memset(item, 0, sizeof(MODLIST)); assert(ptr != NULL); if ((item->name = malloc((_tcslen(ptr) + 1) * sizeof(TCHAR))) == NULL) goto error; _tcscpy(item->name, ptr); #if defined HAVE_DYNCALL_H item->inst=dlLoadLibrary(name); #else item->inst=(void*)LoadLibrary(name); #if !(defined __WIN32__ || defined _WIN32 || defined WIN32) if ((unsigned long)item->inst<=32) item->inst=NULL; #endif #endif if (item->inst==NULL) goto error; item->amx = amx; item->next = root->next; root->next = item; return item; error: if (item != NULL) { if (item->name != NULL) free(item->name); if (item->inst != 0) { #if defined HAVE_DYNCALL_H dlFreeLibrary(item->inst); #else FreeLibrary((HINSTANCE)item->inst); #endif } /* if */ free(item); } /* if */ return NULL; }
DLSyms* dlSymsInit(const char* libPath) { DLLib* pLib = dlLoadLibrary(libPath); DLSyms* pSyms = (DLSyms*)dlAllocMem(sizeof(DLSyms)); const char* base = (const char*) pLib; IMAGE_DOS_HEADER* pDOSHeader = (IMAGE_DOS_HEADER*) base; IMAGE_NT_HEADERS* pNTHeader = (IMAGE_NT_HEADERS*) ( base + pDOSHeader->e_lfanew ); IMAGE_DATA_DIRECTORY* pExportsDataDir = &pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; IMAGE_EXPORT_DIRECTORY* pExports = (IMAGE_EXPORT_DIRECTORY*) (base + pExportsDataDir->VirtualAddress); pSyms->pBase = base; pSyms->pNames = (DWORD*)(base + pExports->AddressOfNames); pSyms->pFuncs = (DWORD*)(base + pExports->AddressOfFunctions); pSyms->pOrds = (unsigned short*)(base + pExports->AddressOfNameOrdinals); pSyms->count = (size_t)pExports->NumberOfNames; pSyms->pLib = pLib; return pSyms; }
SEXP rdcLoad(SEXP sLibPath) { void* libHandle; const char* libPath; SEXP r; libPath = CHAR(STRING_ELT(sLibPath,0)); libHandle = dlLoadLibrary(libPath); if (!libHandle) { error("rdcLoad failed on path %s", libPath ); } r = R_NilValue; PROTECT( r = R_MakeExternalPtr(libHandle, R_NilValue, R_NilValue) ); UNPROTECT(1); return r; }
int MVM_dll_load(MVMThreadContext *tc, MVMString *name, MVMString *path) { MVMDLLRegistry *entry; char *cpath; DLLib *lib; uv_mutex_lock(&tc->instance->mutex_dll_registry); MVM_string_flatten(tc, name); MVM_HASH_GET(tc, tc->instance->dll_registry, name, entry); /* already loaded */ if (entry && entry->lib) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); return 0; } cpath = MVM_string_utf8_encode_C_string(tc, path); lib = dlLoadLibrary(cpath); if (!lib) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); MVM_exception_throw_adhoc(tc, "failed to load library '%s'", cpath); } free(cpath); if (!entry) { entry = malloc(sizeof *entry); entry->name = name; entry->refcount = 0; MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->name); MVM_HASH_BIND(tc, tc->instance->dll_registry, name, entry); } entry->lib = lib; uv_mutex_unlock(&tc->instance->mutex_dll_registry); return 1; }
/* Copies to the body of one object to another. */ static void copy_to(PARROT_INTERP, STable *st, void *src, void *dest) { NativeCallBody *src_body = (NativeCallBody *)src; NativeCallBody *dest_body = (NativeCallBody *)dest; /* Need a fresh handle for resource management purposes. */ if (src_body->lib_name) { dest_body->lib_name = mem_sys_allocate(strlen(src_body->lib_name) + 1); strcpy(dest_body->lib_name, src_body->lib_name); dest_body->lib_handle = dlLoadLibrary(dest_body->lib_name); } /* Rest is just simple copying. */ dest_body->entry_point = src_body->entry_point; dest_body->convention = src_body->convention; dest_body->num_args = src_body->num_args; if (src_body->arg_types) { dest_body->arg_types = mem_sys_allocate(src_body->num_args * sizeof(INTVAL)); memcpy(dest_body->arg_types, src_body->arg_types, src_body->num_args * sizeof(INTVAL)); } dest_body->ret_type = src_body->ret_type; }
JNIEXPORT void JNICALL Java_org_bridj_v0_17_10_Platform_init(JNIEnv *env, jclass clazz) { const char* libPath = getBridJLibPath(); DLLib* pLib = dlLoadLibrary(libPath); DLSyms* pSyms = dlSymsInit(libPath); const char* packagePattern = "Java_org_bridj_"; size_t packagePatternLen = strlen(packagePattern); int iSym, nSyms = dlSymsCount(pSyms); jclass objectClass = (*env)->FindClass(env, "java/lang/Object"); jclass signatureHelperClass = (*env)->FindClass(env, "org/bridj/v0_7_0/util/JNIUtils"); jmethodID decodeVersionSpecificMethodNameClassAndSignatureMethod = (*env)->GetStaticMethodID(env, signatureHelperClass, "decodeVersionSpecificMethodNameClassAndSignature", "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); jobjectArray nameAndSigArray = (*env)->NewObjectArray(env, 2, objectClass, NULL); JNINativeMethod meth; memset(&meth, 0, sizeof(JNINativeMethod)); //printf("INFO: Found %d symbols\n", nSyms); for (iSym = 0; iSym < nSyms; iSym++) { const char* symbolName = dlSymsName(pSyms, iSym); if (!strcmp(*symbolName == '_' ? symbolName + 1 : symbolName, "Java_org_bridj_v0_17_10_Platform_init")) continue; if (strstr(symbolName, packagePattern)) { if ((meth.fnPtr = getSelfSymbol(pLib, symbolName))) { jstring declaringClassName = (*env)->CallStaticObjectMethod(env, signatureHelperClass, decodeVersionSpecificMethodNameClassAndSignatureMethod, (*env)->NewStringUTF(env, symbolName), nameAndSigArray); if ((*env)->ExceptionCheck(env)) { printf("ERROR: Exception when trying to find method for symbol '%s'\n", symbolName); goto version_specific_init_failed; } if (declaringClassName) { jstring methodName = (*env)->GetObjectArrayElement(env, nameAndSigArray, 0); jstring methodSignature = (*env)->GetObjectArrayElement(env, nameAndSigArray, 1); const char* declaringClassNameStr = (char*)GET_CHARS(declaringClassName); jclass declaringClass = (*env)->FindClass(env, declaringClassNameStr); meth.name = (char*)GET_CHARS(methodName); meth.signature = (char*)GET_CHARS(methodSignature); //printf("INFO: Registering %s.%s with signature %s as %s\n", declaringClassNameStr, meth.name, meth.signature, symbolName); (*env)->RegisterNatives(env, declaringClass, &meth, 1); RELEASE_CHARS(methodName, meth.name); RELEASE_CHARS(methodSignature, meth.signature); RELEASE_CHARS(declaringClassName, declaringClassNameStr); } else { printf("ERROR: Failed to find method for symbol '%s'\n", symbolName); } } else { printf("ERROR: Could not find symbol %s\n", symbolName); } } } Java_org_bridj_Platform_init(env, clazz); version_specific_init_failed: //printf("INFO: Finished binding of symbols\n"); //dlFreeLibrary(pLib); // TODO ? dlSymsCleanup(pSyms); }