glib 에서는 이게 가능함.


g_type_module_use (G_TYPE_MODULE (module)) /* dlopen() */

my_object = g_object_new (module->type, NULL); /* my_object 소스내 함수 실행됨 */

g_type_module_unuse (G_TYPE_MODULE (module)); /* dlclose */

my_object_do_something (my_object); /* my_object 소스내 함수, 에러 안 남 */


glib 소스코드를 보니

g_type_module_use 하면 dlopen() 호출되고,

g_type_module_unuse 하면 dlclose() 호출됨.

즉, dlclose() 이후 my_object 함수 호출이 가능한데, 어떻게 그게 가능한지 이해가 안 됨.

GTypeModule 를 모르니... api 문서에서 제공하는데로 그냥 갖다 쓰기만 해서 어떤 원리로 접근 가능한지 모름.


아마 그 비밀이


static gpointer

_g_module_open (const gchar *file_name,

gboolean     bind_lazy,

gboolean     bind_local)

{

  gpointer handle;

  

  handle = dlopen (file_name,

   (bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW));

  if (!handle)

    g_module_set_error (fetch_dlerror (TRUE));

  

  return handle;

}


static gpointer

_g_module_self (void)

{

  gpointer handle;

  

  /* to query symbols from the program itself, special link options

   * are required on some systems.

   */


  /* On Android 32 bit (i.e. not __LP64__), dlopen(NULL)

   * does not work reliable and generally no symbols are found

   * at all. RTLD_DEFAULT works though.

   * On Android 64 bit, dlopen(NULL) seems to work but dlsym(handle)

   * always returns 'undefined symbol'. Only if RTLD_DEFAULT or 

   * NULL is given, dlsym returns an appropriate pointer.

   */

#if defined(__BIONIC__)

  handle = RTLD_DEFAULT;

#else

  handle = dlopen (NULL, RTLD_GLOBAL | RTLD_LAZY);

#endif

  if (!handle)

    g_module_set_error (fetch_dlerror (TRUE));

  

  return handle;

}


아 몰랑 posix c 사용하여 오늘은 플러그인 로딩 부분 재작성하구 자야지

몇 달 지나면 안드로이드에서도 그대로 올릴 수 있음. 좀만 참자.

구글 키보드(GBorad) 축하면 에러나서 그것도 자체 제작해서 쓸거임!! 진짜임!!!