Next: Distributing libltdl, Previous: User defined module data, Up: Using libltdl [Contents][Index]
¥â¥¸¥å¡¼¥ë¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤¿¤á¤Îlibltdl¤ÎÊýË¡¤Ï¿¤¤¤±¤ì¤É¡¤¥×¥í¥¸¥§¥¯¥È
¤ÎÌÜŪ¤Ë½½Ê¬¤Ç¤Ê¤¤¤È¤¤â¤¢¤ê¤Þ¤¹¡¥ÆÈ¼«¤Î¥í¡¼¥À¤ò½ñ¤¡¤lt_dlopen
¤¬ÍøÍѤǤ¤ë¤è¤¦¤Ë¡¤libltdl¤Ç¤½¤ì¤òÅÐÏ¿¤¹¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡¥
¥í¡¼¥À¤ò½ñ¤¯¤³¤È¤Ï¡¤lt_dlopen
¡¤lt_dlsym
¤½¤·¤Æ
lt_dlclose
¤Ç¸Æ¤Ó½Ð¤·²Äǽ¤Ê¡¤¾¯¤Ê¤¯¤È¤â»°¤Ä¤Î´Ø¿ô¤ò½ñ¤¯¤³¤È¤òɬ
ÍפȤ·¤Þ¤¹¡¥¥ª¥×¥·¥ç¥ó¤Ç¡¤lt_dlexit
¤¬¼Â¹Ô¤µ¤ì¤ë¤È¤¥¯¥ê¡¼¥ó¥¢¥Ã
¥×½èÍý¤ò¼Â¹Ô¤¹¤ë½ªÎ»´Ø¿ô¤È¡¤lt_dlsym
¤ËÅϤµ¤ì¤ë¤¢¤é¤æ¤ë¥·¥ó¥Ü¥ë
¤ËÁ°ÃÖ¤µ¤ì¤ë¥·¥ó¥Ü¥ë¤ÎÁ°ÃÖʸ»ú¤òÄ󶡤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡¥¤³¤ì¤é¤Î´Ø¿ô¤Ï¡¤
°Ê²¼¤Î´Ø¿ô¤Î¥Ý¥¤¥ó¥¿·¿¤Ë°ìÃפ¹¤ëɬÍפ¬¤¢¤ê¡¤¤½¤Î¸å¡¤¤½¤ì¤é¤ò
lt_user_dlloader
¤ÎÂå¤ï¤ê¤Ë´ØÏ¢ÉÕ¤±¤·¡¤ÅÐÏ¿¤¹¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡¥
¥í¡¼¥À¤ÎÅÐÏ¿¤Ë¤Ï¡¤lt_dlloader_find
¤¬Ç§¼±¤Ç¤¡¤
lt_dlloader_remove
¤Çºï½ü¤Ç¤¤ë¤è¤¦¤Ë¡¤¤½¤ì¤ËÂФ¹¤ë̾Á°¤òÁªÂò¤¹
¤ë¤³¤È¤¬É¬ÍפǤ¹¡¥ÁªÂò¤·¤¿Ì¾Á°¤Ï¥æ¥Ë¡¼¥¯¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¡¤libltdl¤ÎÁÈ
¤ß¹þ¤ß¥í¡¼¥À¤Ç´û¤Ë»ÈÍѤ·¤Æ¤¤¤ë¤â¤Î¤Ï¤¤¤±¤Þ¤»¤ó¡¥
¸ºß¤¹¤ë¾ì¹ç¤Ï¡¤¥·¥¹¥Æ¥à¤Î¥À¥¤¥Ê¥ß¥Ã¥¯¥í¡¼¥À¡¥
libltdl¤¬¥Ó¥ë¥É¤µ¤ì¤¿¤È¤¤Ëlibdld¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¤ GNU dld¥í¡¼¥À¡¥
¥×¥ê¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥¹¥¿¥Æ¥£¥Ã¥¯¥â¥¸¥å¡¼¥ë¤Îlt_dlopen
¤Î¤¿¤á¤Î¥í¡¼
¥À¡¥
Á°ÃÖ¤µ¤ì¤ë"dl"¤Ï¡¤libltdl¤Î¾Íè¤Î¥Ð¡¼¥¸¥ç¥ó¤ÇÄ󶡤µ¤ì¤ë¥í¡¼¥À¤È¤·¤ÆÍ½ Ìó¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¤ÆÈ¼«¤Î¥í¡¼¥À̾¤Ë»ÈÍѤ¹¤Ù¤¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡¥
°Ê²¼¤Î·¿¤Ï¡¤ltdl.h¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡¥
lt_module
¤Ï¥â¥¸¥å¡¼¥ë°Í¸¤Îdlloader¤Ç¤¹¡¥¥À¥¤¥Ê¥ß¥Ã¥¯¥â¥¸¥å¡¼¥ë
¥í¡¼¥À¤Î³ÈÄ¥¤Ï¡¤¤³¤ì¤é¤ÎÄã¥ì¥Ù¥ë¤Î·¿¤ò»ÈÍѤ·¤ÆÄÌ¿®¤ò¹Ô¤Ê¤¤¤Þ¤¹¡¥
lt_dlloader
¤Ï¥â¥¸¥å¡¼¥ë¥í¡¼¥À¤Î·¿¤ËÂФ¹¤ë¥Ï¥ó¥É¥ë¤Ç¤¹¡¥
lt_user_data
¤Ï¥í¡¼¥À¤Î¥¤¥ó¥¹¥¿¥ó¥¹¥Ç¡¼¥¿¤ËÂФ·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡¥
¥À¥¤¥Ê¥ß¥Ã¥¯¥â¥¸¥å¡¼¥ë¤ò³«¤¯¤¿¤á¤Ë¿·¤·¤¤ÊýË¡¤òÄêµÁ¤·¤¿¤¯¤Æ¡¤¤½¤ì¤ò»ÈÍÑ
¤·¤¿lt_dlopen
API¤¬¤¢¤ë¾ì¹ç¡¤¤³¤ì¤é¤Î¹½Â¤ÂΤΥ¤¥ó¥¹¥¿¥ó¥¹
¤òºîÀ®¤·¡¤¤½¤ì¤òlt_dlloader_add
¤ËÅϤ¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡¥¹¥¤ß¤Î
dlloader_data¥Õ¥£¡¼¥ë¥É¤ÇÅϤ¹¤³¤È¤¬²Äǽ¤Ç¡¤¤½¤ì¤Ï¡¤´Ø¿ô¥Ý¥¤¥ó¥¿
¥Õ¥£¡¼¥ë¥É¤Ç»ØÄꤵ¤ì¤Æ¤¤¤ë¡¤¤½¤ì¤¾¤ì¤Î´Ø¿ô¤Ø¤ÎºÇ½é¤Î¥Ñ¥é¥á¡¼¥¿¤ÎÃͤȤ·
¤ÆÊÖ¤µ¤ì¤Þ¤¹¡¥
lt_dlloader
¥â¥¸¥å¡¼¥ë¥í¡¼¥À¤ËÂФ¹¤ë¥í¡¼¥À´Ø¿ô¤Î·¿¤Ç¤¹¡¥
struct lt_user_dlloader
¹½Â¤ÂΤÎdlloader_data¥Õ¥£¡¼¥ë¥É¤ËÀßÄꤵ
¤ì¤ëÃͤϡ¤loader_data¥Ñ¥é¥á¡¼¥¿¤Ç¡¤¤³¤Î´Ø¿ô¤ËÅϤµ¤ì¤Þ¤¹¡¥¤½¤Î¤è
¤¦¤Ê´Ø¿ô¤Î¼ÂÁõ¤Ï¡¤»ØÌ¾¤µ¤ì¤¿¥â¥¸¥å¡¼¥ë¤Î¥í¡¼¥É¤ò»î¤ß¡¤´ØÏ¢¤¹¤ë
lt_module_close
¤Èlt_sym_find
´Ø¿ô¤Î¥Ý¥¤¥ó¥¿¤ËÅϤ¹¤Î¤ËŬÀÚ
¤Êlt_module
¤òÊÖ¤¹¤Ù¤¤Ç¤¹¡¥´Ø¿ô¤¬¼ºÇÔ¤·¤¿¾ì¹ç¤ÏNULL
¤òÊÖ
¤·¡¤lt_dlseterror
¤òÍѤ¤¤Æ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òÀßÄꤹ¤Ù¤¤Ç¤¹¡¥
¥æ¡¼¥¶¤¬ÄêµÁ¤·¤¿¥â¥¸¥å¡¼¥ë¥í¡¼¥À¤ËÂФ¹¤ë¥¢¥ó¥í¡¼¥À¤Î·¿¤Ç¤¹¡¥¤½¤Î¤è¤¦¤Ê
´Ø¿ô¤Î¼ÂÁõ¤Ï¡¤module¥â¥¸¥å¡¼¥ë¤Ë·ë¤ÓÉÕ¤±¤é¤ì¤¿¤¢¤é¤æ¤ë¥ê¥½¡¼¥¹¤Î
²òÊü¤ò»î¤ß¡¤¤½¤Î¸å¤Ç¥á¥â¥ê¤«¤é¥¢¥ó¥í¡¼¥É¤¹¤Ù¤¤Ç¤¹¡¥Íýͳ¤¬¤¢¤Ã¤Æ´Ø¿ô¤¬
¼ºÇÔ¤·¤¿¾ì¹ç¡¤lt_dlseterror
¤òÍѤ¤¤Æ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òÀßÄꤷ¡¤¥¼
¥í°Ê³°¤òÊÖ¤¹¤Ù¤¤Ç¤¹¡¥
¥æ¡¼¥¶¤¬ÄêµÁ¤·¤¿¥â¥¸¥å¡¼¥ë¥í¡¼¥À¤ËÂФ¹¤ë¡¤¥·¥ó¥Ü¥ë¥ë¥Ã¥¯¥¢¥Ã¥×´Ø¿ô¤Î·¿
¤Ç¤¹¡¥¤½¤Î¤è¤¦¤Ê´Ø¿ô¤Î¼ÂÁõ¤Ï¡¤¥â¥¸¥å¡¼¥ëmoduleÆâ¤Î»ØÌ¾¤µ¤ì¤¿
symbol¤Î¥¢¥É¥ì¥¹¤òÊÖ¤¹¡¤¤â¤·¤¯¤Ï¡¤¸¡ºº¤¬¼ºÇÔ¤·¤¿¾ì¹ç¤Ï¡¤¥¨¥é¡¼¥á¥Ã
¥»¡¼¥¸¤òlt_dlseterror
¤ÇÀßÄꤷ¡¤NULL
¤òÊÖ¤¹¤Ù¤¤Ç¤¹¡¥
¥æ¡¼¥¶¤¬ÄêµÁ¤·¤¿¥â¥¸¥å¡¼¥ë¥í¡¼¥À¤ËÂФ¹¤ë¡¤½ªÎ»´Ø¿ô¤Î·¿¤Ç¤¹¡¥¤½¤Î¤è¤¦¤Ê
´Ø¿ô¤Î¼ÂÁõ¤Ï¡¤¥í¡¼¥À¤Ë´ØÏ¢¤¹¤ë¤¢¤é¤æ¤ë¥ê¥½¡¼¥¹¤ò²òÊü¤¹¤Ù¤¤Ç¡¤¤½¤ì¤Ë¤Ï
lt_user_dlloader
¤Îdlloader_data
¥Õ¥£¡¼¥ë¥ÉÆâÉô¤Ë¤¢¤ë¥æ¡¼
¥¶¤¬»ØÄꤷ¤¿¤¢¤é¤æ¤ë¥Ç¡¼¥¿¤ò´Þ¤ß¤Þ¤¹¡¥NULL
¤Ç¤Ê¤¤¾ì¹ç¤Ï¡¤´Ø¿ô¤Ï
lt_dlexit
¤Èlt_dlloader_remove
¤«¤é¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡¥
Î㤨¤Ð¡¤°Ê²¼¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡¥
int register_myloader (void) { lt_user_dlloader dlloader; /* User modules are responsible for their own initialisation. */ if (myloader_init () != 0) return MYLOADER_INIT_ERROR; dlloader.sym_prefix = NULL; dlloader.module_open = myloader_open; dlloader.module_close = myloader_close; dlloader.find_sym = myloader_find_sym. dlloader.dlloader_exit = myloader_exit; dlloader.dlloader_data = (lt_user_data)myloader_function; /* Add my loader as the default module loader. */ if (lt_dlloader_add (lt_dlloader_next (NULL), &dlloader, "myloader") != 0) return ERROR; return OK; }
¥í¡¼¥À¤ËÂФ¹¤ëɬÍפʽé´ü²½¤¬¤¢¤ë¾ì¹ç¤Ï¡¤¥í¡¼¥À¤¬ÅÐÏ¿¤µ¤ì¤ëÁ°¤Ë¼êư¤Ç¼Â ¹Ô¤¹¤ëɬÍפ¬¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤ – libltdl¤Ï¥æ¡¼¥¶¥í¡¼¥À¤Î½é´ü ²½¤ò°·¤¤¤Þ¤»¤ó¡¥
½ªÎ»¤Ïlibltdl¤Ç°·¤ï¤ì¤Þ¤¹¤¬¡¤dlloader_exit
¤Î¥³¡¼¥ë¥Ð¥Ã¥¯
¤¬½é´ü²½¥Õ¥§¡¼¥º¤Î´Ö¤ËÍ׵ᤵ¤ì¤¿¡¤¤¢¤é¤æ¤ë¥ê¥½¡¼¥¹¤ò²òÊü¤¹¤ë¤³¤È¤ò³Î¤«
¤á¤ë¤³¤È¤Ï½ÅÍפǤ¹¡¥
libltdl¤Ï¡¤ÆÈ¼«¤Î¥â¥¸¥å¡¼¥ë¥í¡¼¥À¤ò½ñ¤¯¤¿¤á¤Ë¡¤°Ê²¼¤Î´Ø¿ô¤òÄ󶡤·¤Þ¤¹¡¥
¿·¤·¤¤¥â¥¸¥å¡¼¥ë¥í¡¼¥À¤òÁ´¤Æ¤Î¥í¡¼¥À¥ê¥¹¥È¤Ë²Ã¤¨¡¤¤½¤ì¤Ï¡¤(place
¤¬NULL
¤Î¾ì¹ç¤Ï)ºÇ¸å¤Î¥í¡¼¥À¤È¤·¤Æ¡¤¤½¤ì°Ê³°¤Ç¤Ïplace¤È¤·
¤ÆÅϤµ¤ì¤¿¥í¡¼¥À¤ÎľÁ°¤Ë²Ã¤¨¤Þ¤¹¡¥loader_name¤Ï¡¤¿·¤·¤¯ÅÐÏ¿¤µ¤ì
¤¿¥í¡¼¥À¤¬ÅϤµ¤ì¤¿¾ì¹ç¡¤lt_dlloader_name
¤òÊÖ¤·¤Þ¤¹¡¤¤³¤ì¤é¤Î
loader_name¤Ï¡¤¥æ¥Ë¡¼¥¯¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¡¤¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ï¡¤
lt_dlloader_remove
¤Èlt_dlloader_find
¤ÏưºîÉÔ²Äǽ¤Ç¤¹¡¥À®
¸ù¤ËÂФ·0¤òÊÖ¤·¤Þ¤¹¡¥
{ /* Make myloader be the last one. */ if (lt_dlloader_add (NULL, myloader) != 0) perror (lt_dlerror ()); }
¥æ¥Ë¡¼¥¯¤Ê̾Á°loader_name¤Ç¼±Ê̤µ¤ì¤Æ¤¤¤ë¥í¡¼¥À¤òºï½ü¤·¤Þ¤¹¡¥¤³
¤ì¤¬À®¸ù²Äǽ¤È¤Ê¤ëÁ°¤Ë¡¤»ØÌ¾¤µ¤ì¤¿¥í¡¼¥À¤Ë¤è¤ê³«¤«¤ì¤Æ¤¤¤ëÁ´¤Æ¤Î¥â¥¸¥å¡¼
¥ë¤ò¡¤ÊĤ¸¤Æ¤ª¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡¥À®¸ù¤ËÂФ·0¤òÊÖ¤·¡¤¤½¤ì°Ê³°¤Ç¤Ï¡¤¥¨¥é¡¼
¥á¥Ã¥»¡¼¥¸¤¬lt_dlerror
¤«¤é¼èÆÀ²Äǽ¤Ç¤¹¡¥
{ /* Remove myloader. */ if (lt_dlloader_remove ("myloader") != 0) perror (lt_dlerror ()); }
¥í¡¼¥À¥â¥¸¥å¡¼¥ëÁ´ÂΤò·«¤êÊÖ¤·¡¤¤½¤ì¤Ï¡¤place¤¬NULL
¤Î¾ì¹ç
¤ÏºÇ½é¤Î¥í¡¼¥À¤òÊÖ¤·¡¤½çÈ֤˼¡¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ç¹Ô¤¤¤Þ¤¹¡¥¥Ï¥ó¥É¥ë¤Ï¡¤
lt_dlloader_add
ÍѤǤ¹¡¥
{ /* Make myloader be the first one. */ if (lt_dlloader_add (lt_dlloader_next (NULL), myloader) != 0) return ERROR; }
loader_name¼±Ê̻Ҥ˰ìÃפ¹¤ëºÇ½é¤Î¥í¡¼¥À¤òÊÖ¤·¡¤¼±Ê̻Ҥ¬¸«¤Ä¤«¤é
¤Ê¤¤¾ì¹ç¤ÏNULL
¤òÊÖ¤·¤Þ¤¹¡¥
libltdl¼«¿È¤Ç»ÈÍѲÄǽ¤Ê¼±Ê̻Ҥϡ¤¥Û¥¹¥È¥¢¡¼¥¥Æ¥¯¥Á¥ã¤¬¥µ¥Ý¡¼¥È¤·¤Æ¤¤ ¤ë¾ì¹ç¤Ïdlopen10¡¤dld¡¤¤½¤·¤Ædlpreload¤Ç¤¹¡¥
{ /* Add a user loader as the next module loader to be tried if the standard dlopen loader were to fail when lt_dlopening. */ if (lt_dlloader_add (lt_dlloader_find ("dlopen"), myloader) != 0) return ERROR; }
lt_dlloader_next
¤ält_dlloader_find
¤Ç¼èÆÀ¤µ¤ì¤ë¡¤
PLACE¤Î¼±ÊÌ̾¤òÊÖ¤·¤Þ¤¹¡¥¤³¤Î´Ø¿ô¤¬¼ºÇÔ¤¹¤ë¾ì¹ç¡¤NULL
¤òÊÖ
¤·¡¤lt_dlerror
¤Ç²ó¼ý¤¹¤ë¤¿¤á¤Î¥¨¥é¡¼¤òÀßÄꤷ¤Þ¤¹¡¥
lt_dlloader_next
¤ält_dlloader_find
¤Ç¼èÆÀ¤µ¤ì¤ë¡¤
PLACE¤Î¥¢¥É¥ì¥¹¤òÊÖ¤·¤Þ¤¹¡¥¤³¤Î´Ø¿ô¤¬¼ºÇÔ¤¹¤ë¾ì¹ç¡¤NULL
¤ò
ÊÖ¤·¡¤lt_dlerror
¤Ç²ó¼ý¤¹¤ë¤¿¤á¤Î¥¨¥é¡¼¤òÀßÄꤷ¤Þ¤¹¡¥
¤³¤Î´Ø¿ô¤Ç¡¤ÆÈ¼«¤Î¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òlt_dlerror
¤ËÁȤ߹þ¤à¤³¤È¤¬
²Äǽ¤È¤Ê¤ê¤Þ¤¹¡¥lt_dlerror
¤ÇÊÖ¤¹¤¿¤á¤ÎŬÀڤʿÇÃÇ¥á¥Ã¥»¡¼¥¸¤ËÅÏ
¤¹¤â¤Î¤È¡¤lt_dlseterror
¤Ç»ÈÍѤµ¤ì¤ë¥¨¥é¡¼¼±Ê̻Ҥ¬ÊÖ¤µ¤ì¤Þ¤¹¡¥
¼±Ê̻Ҥγä¤êÅö¤Æ¤¬¼ºÇÔ¤·¤¿¾ì¹ç¡¤¤³¤Î´Ø¿ô¤Ï-1¤òÊÖ¤·¤Þ¤¹¡¥
int myerror = lt_dladderror ("Doh!"); if (myerror < 0) perror (lt_dlerror ());
ÆÈ¼«¤Î¥â¥¸¥å¡¼¥ë¥í¡¼¥À¤ò½ñ¤¯¤È¤¡¤lt_dlerror
¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò
Ä̤¸¤ÆÅÁȤµ¤ì¤ë¤è¤¦¤Ë¥¨¥é¡¼¤òȯÀ¸¤µ¤»¤ë¤¿¤á¤Ë¡¤¤³¤Î´Ø¿ô¤ò»ÈÍѤ¹¤Ù¤¤Ç
¤¹¡¥libltdl¤Ç»ÈÍѤµ¤ì¤ëɸ½à¥¨¥é¡¼¤ÎÁ´¤Æ¤Ï¡¤ltdl.h¤ÇÀë¸À¤µ¤ì¤Æ¤¤
¤Æ¡¤¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¡¤lt_dladderror
¤òÍѤ¤¤ÆÆÈ¼«¤Ë½ñ¤²Ã¤¨¤ë¤³¤È¤¬
²Äǽ¤Ç¤¹¡¥
if (lt_dlseterror (LTDL_ERROR_NO_MEMORY) != 0) perror (lt_dlerror ());
¤³¤ì¤Ï¡¤¥â¥¸¥å¡¼¥ë¤ò¥í¡¼¥É¤·¤Æ¤¤¤ë
API ¤Ë°Í¸¤·¤Þ¤¹ – Î㤨¤Ð¡¤shl_load
¤ÈLoadLibrary
¤Ç
¤¹
Next: Distributing libltdl, Previous: User defined module data, Up: Using libltdl [Contents][Index]