示例#1
0
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())
	}
示例#2
0
文件: nm.c 项目: dod38fr/dyncall
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;
}
示例#3
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);
}
示例#4
0
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;
}
示例#5
0
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;
}
示例#6
0
文件: api.c 项目: svn2github/dyncall
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;
}
示例#7
0
文件: dll.c 项目: dagurval/MoarVM
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;
}
示例#8
0
文件: NativeCall.c 项目: thirdm/nqp
/* 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;
}
示例#9
0
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);
}