Exemplo n.º 1
0
Val   _lib7_U_Dynload_dlopen   (Task* task, Val arg)   {	//  (String, Bool, Bool) -> one_word_unt::Unt
    //======================
    //
    // Open a dynamically loaded library.
    //

									    ENTER_MYTHRYL_CALLABLE_C_FN("_lib7_U_Dynload_dlopen");

    Val ml_libname = GET_TUPLE_SLOT_AS_VAL (arg, 0);
    int lazy       = GET_TUPLE_SLOT_AS_VAL (arg, 1) == HEAP_TRUE;
    int global     = GET_TUPLE_SLOT_AS_VAL (arg, 2) == HEAP_TRUE;

    char *libname = NULL;
    void *handle;


    Mythryl_Heap_Value_Buffer  libname_buf;

    if (ml_libname != OPTION_NULL) {
	//
        libname = HEAP_STRING_AS_C_STRING (OPTION_GET (ml_libname));
	//
	// Copy libname out of Mythryl heap to
        // make it safe to reference between
	// RELEASE_MYTHRYL_HEAP and
	// RECOVER_MYTHRYL_HEAP:
	//
	libname =  (char*)  buffer_mythryl_heap_value( &libname_buf, (void*)libname, strlen(libname)+1 );		// '+1' for terminal NUL on string.
    }

    #ifdef OPSYS_WIN32

	handle = (void *) LoadLibrary (libname);

	if (handle == NULL && libname != NULL)	  dlerror_set ("Library `%s' not found", libname);

    #else
	int flag = (lazy ? RTLD_LAZY : RTLD_NOW);

	if (global) flag |= RTLD_GLOBAL;

	RELEASE_MYTHRYL_HEAP( task->pthread, "_lib7_U_Dynload_dlopen", NULL );
	    //
	    handle = dlopen (libname, flag);
	    //
	RECOVER_MYTHRYL_HEAP( task->pthread, "_lib7_U_Dynload_dlopen" );
    #endif

    if (libname)  unbuffer_mythryl_heap_value( &libname_buf );

    return  make_one_word_unt(task,  (Vunt) handle  );
}
Exemplo n.º 2
0
/* _ml_P_Dynload_dlsym : Word32.word * string -> Word32.word
 *
 * Extract symbol from dynamically loaded library.
 */
ml_val_t _ml_U_Dynload_dlsym (ml_state_t *msp, ml_val_t arg)
{
  ml_val_t ml_handle = REC_SEL (arg, 0);
  char *symname = STR_MLtoC (REC_SEL (arg, 1));
  void *handle = (void *) (WORD_MLtoC (ml_handle));
  void *addr;
  ml_val_t res;

#ifdef OPSYS_WIN32
  addr = GetProcAddress (handle, symname);
  if (addr == NULL && symname != NULL)
    dlerror_set ("Symbol `%s' not found", symname);
#else
  addr = dlsym (handle, symname);
#endif
  
  WORD_ALLOC (msp, res, (Word_t) addr);
  return res;
}