´ÙÀ½ ÀÌÀü Â÷·Ê

4. µ¿Àû(DL) ¶óÀ̺귯¸®

µ¿Àû ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÇ ½ÃÀ۽ð¡ ¾Æ´Ñ ´Ù¸¥¶§¿¡ ÀûÀçµÇ´Â ¶óÀ̺귯¸® ¸¦ ¸»ÇÑ´Ù. Ç÷¯±×ÀεîÀÇ ¸ðµâÀº ±×°ÍÀÇ ÇÊ¿ä½Ã±îÁö ÀûÀ縦 ±â´Ù¸®´Â °ÍÀÌ Çã ¿ëµÇ¹Ç·Î À̵éÀÇ ±¸Çö¿¡ ƯÈ÷ À¯¿ëÇÏ´Ù. ¿¹¸¦µé¸é PAM(Pluggable Authenti- cation Module:ÀûÀç°¡´É ÀÎÁõ¸ðµâ)µîÀÇ ½Ã½ºÅÛ¿¡¼­´Â °ü¸®ÀÚ°¡ ÀÎÁõÀ» ±¸¼º¶Ç ´Â À籸¼ºÇϴµ¥ µ¿Àû ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ´Ù. ¶ÇÇÑ µ¿Àû ¶óÀ̺귯¸®´Â ¼ö½Ã·Î ¾ð¾îÄڵ带 ±â°è¾î·Î ÄÄÆÄÀÏÇÏ°í, ÄÄÆÄÀÏµÈ ¸ðµâµéÀ» È¿À²ÀûÀ¸·Î ¸ØÃã¾øÀÌ »ç ¿ëÄÚÀúÇÏ´Â ÀÎÅÍÇÁ¸®Å͸¦ ±¸ÇöÇϴµ¥µµ À¯¿ëÇÏ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀº Àú½ºÆ® ÀΟ ÀÓ ÄÄÆÄÀÏ·¯(JIT)³ª ¸ÖƼ À¯Àú´øÀü(MUD:multi user dungeon)ÀÇ °³¹ß¿¡µµ À¯ ¿ëÇÏ´Ù.

¸®´ª½º¿¡¼­´Â µ¿Àû ¶óÀ̺귯¸®´Â Æ÷¸Ë¸¸ÀÇ °üÁ¡¿¡¼­ º»´Ù¸é Ưº°ÇÑ °ÍÀÌ ¾Æ ´Ï´Ù. Áï, ±×°ÍÀº À§¿¡¼­ ³íÀÇÇÑ Ç¥ÁØÀûÀÎ ¿ÀºêÁ§Æ® ÆÄÀÏÀ̳ª Ç¥ÁØÀûÀÎ °øÀ¯ ¶óÀ̺귯¸®·Î½á ¸¸µé¾îÁø´Ù. °¡Àå Áß¿äÇÑ Â÷ÀÌÁ¡Àº ±×°ÍÀÌ ÇÁ·Î±×·¥ÀÇ ¸µÅ©½Ã ³ª ½ÃÀ۽ÿ¡ ÀÚµ¿À¸·Î ÀûÀçµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó´Â °ÍÀÌ´Ù. ±× ´ë½ÅÀ¸·Î ¶óÀ̺귯 ¸®¸¦ ¿­°í ½Éº¼À» »ìÇÇ¸ç ¿¡·¯¸¦ Á¦¾îÇÏ°í ´Ý´ÂµîÀÇ API°¡ Á¦°øµÈ´Ù. CÀÇ »ç ¿ëÀÚ´Â ÀÌ·¯ÇÑ API¸¦ »ç¿ëÇϱâ À§Çؼ­ <dlfcn.h>¸¦ includeÇÏ¿©¾ß ÇÑ´Ù. ¸®´ª½º¿¡¼­ »ç¿ëµÇ´Â ÀÎÅÍÆäÀ̽º¸¦ ³ª´Â "dlopen() API"¶ó°í ºÎ¸£¸ç ¼Ö¶ó¸® ½ºÀÇ ±×°Í°ú Çٽɿ¡ À־´Â µ¿ÀÏÇÏ´Ù. ±×·¯³ª ÀÌ·¯ÇÑ µ¿ÀÏÇÑ ¹æ½ÄÀÇ ÀÎÅÍÆä À̽º°¡ ¸ðµç Ç÷§Æû¿¡¼­ °°Àº °ÍÀº ¾Æ´Ï´Ù. HP-UX´Â shl_load()¶ó´Â ´Ù¸¥ ¸Þ Ä¿´ÏÁòÀ» »ç¿ëÇϸç À©µµ¿ìÁî¿¡¼­´Â DLLÀ» ¿ÏÀüÈ÷ ´Ù¸¥ ÀÎÅÍÆäÀ̽º·Î ´Ù·é ´Ù. À̽ļº¿¡ ¸ñÇ¥¸¦ µÐ´Ù¸é Ç÷§Æû°£ÀÇ ÀÌÁú¼ºÀ» ¼û±â°ÔÇØÁÖ´Â ¸î°³ÀÇ wrapping ¶óÀ̺귯¸®ÀÇ »ç¿ëÀ» °í·ÁÇؾßÇÑ´Ù. ÇÑ°¡Áö ¹æ¹ýÀ¸·Î glib ¶óÀ̺귯 ¸®ÀÇ µ¿Àû ¸ðµâÀûÀç±â´ÉÀÌ ÀÖ´Ù. ÀÌ°ÍÀº ÀÌ·¯ÇÑ ÇÔ¼öµéÀÇ À̽ļº ±¸ÇöÀ» À§ÇØ Ç÷§ÆûÀÇ ÇϺο¡ ÀÖ´Â µ¿ÀûÀûÀç·çƾÀ» »ç¿ëÇÑ´Ù. ÀÌ¿¡°üÇÑ ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº [15] developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html ¿¡¼­ ¹è¿ï¼ö ÀÖ´Ù. ¿©±â ¹®¼­¿¡¼­ Àß ¼³¸íµÇ¾î ÀÖÀ¸¹Ç·Î ´õ ÀÌ»ó ÀÇ ¼³¸íÀº ÇÏÁö ¾Ê°Ú´Ù. ´Ù¸¥ ¹æ¹ýÀº [16]GNU libtoolÁß¿¡ ÇϳªÀÎ libltdlÀ» ¾²´Â °ÍÀÌ´Ù. ÀÌ°ÍÀÇ ´Ù¾çÇÑ ±â´ÉÀ» ¾²±âÀ§Çؼ­´Â ¾Æ¸¶µµ COBRA Object Broker(ORB)¸¦ º¸±æ ¹Ù¶õ´Ù. ¸®´ª½º¿Í ¼Ö¶ó¸®½º¿¡¼­ Á¦°øÇÏ´Â ±â´É¿¡ ¿©ÀüÈ÷ °ü½ÉÀÌ ÀÖ´Ù¸é °è¼Ó ÀоîÁÖ±æ ¹Ù¶õ´Ù.

dlopen()

dlopen(3) ÇÔ¼ö´Â ¶óÀ̺귯¸®¸¦ ¿­¾î¼­ »ç¿ëÁغñ¸¦ ÇÑ´Ù. C¿¡¼­ ÇÔ¼öÀÇ ¿ø ÇüÀº ¾Æ·¡¿Í °°´Ù.

void *dlopen(const char *filename, int flag);

¸¸¾à¿¡ ÆÄÀÏÀÇ À̸§ÀÌ /(Áï, Àý´ë°æ·Î)·Î ½ÃÀÛÇÑ´Ù¸é dlopen()Àº ¶óÀ̺귯 ¸®¸¦ Ž»öÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù. ±×·¸Áö ¾Ê´Ù¸é dlopen()Àº ´ÙÀ½°ú °°Àº ¼ø¼­·Î ¶ó À̺귯¸®¸¦ Ž»öÇÑ´Ù.

  1. ÄÝ·ÐÀ¸·Î ºÐ¸®µÈ »ç¿ëÀÚÀÇ LD_LIBRARY ȯ°æº¯¼öÀÇ °¢ µð·ºÅ丮 ¸ñ·Ï.
  2. /etc/ld.so.cache¿¡ ¸í¼¼µÈ ¶óÀ̺귯¸®µé
  3. /lib, ±×´ÙÀ½Àº /usr/lib
dlopen()¿¡¼­ Ç÷¡±×ÀÇ °ªÀº µ¿Àû ¶óÀ̺귯¸®·Î ºÎÅÍÀÇ ÄÚµå ¼öÇà½Ã¿¡ ¹ÌÁ¤ÀÇ µÈ ½Éº¼°ªÀ» ÇØ°áÇÔÀ» ¶æÇÏ´Â RTLD_LAZY, dlopen()ÀÌ ¸®ÅϵDZâÀü ¸ðµç ¹Ì Á¤ÀÇµÈ ½Éº¼ÀÇ °ªÀÌ ÇØ°áµÇ´Â, ±×·¸Áö ¾ÊÀ¸¸é ½ÇÆи¦ ¶æÇÏ´Â RTLD_NOW ÁßÀÇ Çϳª°¡ µÇ¾î¾ß ÇÑ´Ù. ¶óÀ̺귯¸®³»¿¡¼­ Á¤ÀÇµÈ ¿Ü·¡½Éº¼ÀÌ ¼øÂ÷ÀûÀ¸·Î È£ÃâµÇ´Â ¶óÀ̺귯¸®µé¿¡ ÀÇÇؼ­ À¯È¿ÇØÁüÀ» ¶æÇÏ´Â RTLD_ GLOBAL¶ÇÇÑ »ç¿ëµÇ°Å³ª ¿É¼ÇÀÌ µÉ ¼ö ÀÖ´Ù. µð¹ö±ë ÁßÀ̶ó¸é RTLD_LAZY´Â ¹ÌÇØ°áµÈ ½Éº¼ÂüÁ¶¿¡ ÀÇÇÑ ¿¹Ãø ºÒ°¡´ÉÀÇ ¿¡·¯¸¦ ÀÏÀ¸Å³¼ö ÀÖÀ¸¹Ç·Î RTLD_NOW¸¦ »ç¿ëÇÏ±æ ¿øÇÒ °ÍÀÌ´Ù. RTLD_NOW´Â ¶óÀ̺귯¸®¸¦ ¿©´Âµ¥ ¾à°£ ´À¸®´Ù. ÀÌ°ÍÀÌ ¹®Á¦°¡ µÈ´Ù¸é RTLD_LAZY·Î ³ªÁß¿¡ ÀüȯÇϸéµÈ´Ù.

¸¸¾à ¶óÀ̺귯¸®µéÀÌ ¼­·Î ÀÇÁ¸ÇÒ °æ¿ì(¿¹¸¦ µé¸é X°¡ Y¸¦ ÀÇÁ¸ÇÑ´Ù¸é), ÀÇ Á¸ÀÌ µÇ¾îÁÖ´Â ¶óÀ̺귯¸®(ÀÌ ¿¹¿¡¼­´Â Y)¸¦ ¸ÕÀú ·ÎµåÇÏ¿©¾ß ÇÑ´Ù. dlopen()ÀÇ ¸®ÅÏ°ªÀº (ÀûÀçµÇ´Â µ¿Àû ¶óÀ̺귯¸®ÀÇ ÀÏÁ¾ÀÇ ÆÄÀÏ) ÇÚµé(handle) ÀÌ´Ù. ±×°ÍÀº ´Ù¸¥ µ¿Àû ¶óÀ̺귯¸® ·çƾ¿¡¼­ »ç¿ëµÇ¾îÁú ¾î¶°ÇÑ °ªÀ̶ó °í·Á µÉ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀûÀç½Ãµµ°¡ ½ÇÆÐÇϸé dlopen()Àº NULLÀ» ¸®ÅÏÇÒ °ÍÀ̸ç Á¡°ËÇØ º¸±æ ¹Ù¶õ´Ù. °°Àº ¶óÀ̺귯¸®°¡ µÎ¹ø ÀÌ»ó dlopen()¿¡ ÀÇÇؼ­ ·ÎµåµÈ ´Ù¸é °°Àº ÆÄÀÏ ÇÚµéÀÌ ¸®ÅϵȴÙ.

¸¸¾à ¶óÀ̺귯¸®¿¡¼­ _init·Î ¸í¸íµÈ ·çƾÀ» ¿ÜºÎ È£Ãâ ÇÑ´Ù¸é ±× Äڵ尡 dlopen()ÀÇ ¸®ÅÏÀü¿¡ ¼öÇàµÈ´Ù. ÀÌ·¯ÇÑ »ç½ÇÀ» ÀÌ¿ëÇØ ´ç½ÅÀÇ ¶óÀ̺귯¸®¿¡¼­ ÃʱâÈ­ ·çƾÀ» ±¸ÇöÇÏ¸é µÉ °ÍÀÌ´Ù.

dlerror()

¿¡·¯´Â dlerror()À» È£ÃâÇÔÀ¸·Î½á º¸°íµÇ´Âµ¥, ÀÌ ÇÔ¼ö´Â °¡Àå ÃÖ±ÙÀÇ dlopen(), dlsym(), ¶Ç´Â dlclose()·Î ÀÎÇØ ¹ß»ýÇÑ ¿¡·¯¸¦ ±â¼úÇÏ´Â ½ºÆ®¸µ À» ¸®ÅÏÇÑ´Ù. ÇÑ°¡Áö Ưº°ÇÑ Á¡Àº dlerror()¸¦ È£ÃâÇÏ°í ³­µÚ¿¡´Â ±× ´ÙÀ½ºÎ ÅÍ´Â ¶Ç´Ù¸¥ ¿¡·¯°¡ ¹ß»ýÇϱâ Àü±îÁö dlerror()´Â NULLÀ» ¸®ÅÏÇÑ´Ù´Â °ÍÀÌ ´Ù.

dlsym()

µ¿Àû ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ°í »ç¿ëÇÏÁö ¸øÇÑ´Ù¸é ¾Æ¹«·± Àǹ̵µ ¾øÀ» °ÍÀÌ´Ù. dlsym(3)Àº ¶óÀ̺귯¸® »ç¿ëÀÇ °¡Àå ÁÖµÈ ·çƾÀ̸ç ÀÌ ÇÔ¼ö´Â ¿ÀÇÂµÈ ¶óÀÌºê ·¯¸®¿¡¼­ ½Éº¼°ªÀ» Á¶»çÇÑ´Ù. ÀÌÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾîÀÖ´Ù.

void *dlsym(void *handle, char *symbol);

handleÀº dlopen()¿¡ ÀÇÇØ ¸®ÅϵǴ °ªÀ̸ç symbolÀº NIL-·Î ³¡³ª´Â ¹®ÀÚ¿­ ÀÌ´Ù. dlsym()ÀÇ °á°ú°ªÀ» void * ŸÀÙÀÇ Æ÷ÀÎÅÍ¿¡ ÀúÀåÇÏ¸é ¸Å¹ø »ç¿ë½Ã¸¶´Ù ij½ºÆ® ¿¬»êÀ» ¼öÇàÇØ¾ß ÇϹǷÎ(±×¸®°í, ÇÁ·Î±×·¥À» À¯ÁöÇÏ·Á´Â ¸¹Àº ´Ù¸¥ »ç ¶÷µé¿¡°Ô ÀûÀº Á¤º¸¹Û¿¡ ÁÖÁö¸øÇÒ °ÍÀ̹ǷÎ) ÇÇÇÒ¼ö ÀÖ´Ù¸é ÀÌ·¸°Ô ÇÏÁö¸»±æ ¹Ù¶õ´Ù.

dlsym()Àº ½Éº¼ÀÌ ¹ß°ßµÇÁö ¾ÊÀº°æ¿ì¿¡ NULL°ªÀ» ¸®ÅÏÇϰԵȴÙ. ¸¸¾à¿¡ ¾î ¶² ½Éº¼ÀÌ °áÄÚ Á¦·Î³ª NULL°ªÀ» °¡ÁöÁö ¾ÊÀ» °ÍÀ» ´ç½ÅÀÌ ¾Ë°í ÀÖ´Ù¸é ¾Æ ¹«·± ¹®Á¦µµ ¾øÀ¸³ª ¸¸¾à ±×·¸Áö ¾Ê´Ù¸é ÀáÀçÀûÀÎ ¸ðÈ£¼ºÀÌ Á¸ÀçÇÏ°Ô µÈ´Ù, Áï ¸¸¾à¿¡ NULL°ªÀ» °¡Áö°Ô µÈ °æ¿ì ±×°ÍÀÌ ±×·± ½Éº¼ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù´Â °Í ÀÎÁö ¾Æ´Ï¸é ½ÇÁ¦·Î ±× ½Éº¼ÀÇ °ªÀÌ NULLÀÎÁö ÇÏ´Â °ÍÀÌ´Ù. Ç¥ÁØÀûÀÎ ÇØ°á Ã¥Àº dlerror()À» È£Ãâ(Á¸ÀçÇÒ¼ö ÀÖ´Â ¸ðµç ¿¡·¯ÀÇ °¡´É¼ºÀ» ÇؼÒÇϴ°ÍÀÓ) ÇÏ°í ±×´ÙÀ½À¸·Î ½Éº¼°ªÀ» ¾Ë±âÀ§ÇØ dlsym()À» È£ÃâÇÑ µÚ dlerror()À» Çѹø ´õ È£ÃâÇÏ¿© ¿¡·¯°¡ ¹ß»ýÇß´ÂÁö¸¦ Á¡°ËÇÏ´Â °ÍÀÌ´Ù. ÀÌ ºÎºÐÀÇ Äڵ带 ¹ßÃéÇÑ ´Ù¸é ¾Æ·¡¿Í °°À» °ÍÀÌ´Ù.

dlerror();
 /* ¿¡·¯ÄÚµåÀÇ ÃʱâÈ­ */
s = (actual_type) dlsym(handle, symbol_being_searched_for); 
 if ((err = dlerror()) != NULL) 
  /* ½Éº¼°ªÀ» ãÁö ¸øÇÒ¶§ */
  else 
  /* ½Éº¼°ªÀ» ã¾ÒÀ» ¶§ ±× °ªÀÌ s¿¡ ÀÖÀ½ */
dlclose()

dlclose()´Â dlopen()ÀÇ ¿ªÀ¸·Î½á µ¿Àû ¶óÀ̺귯¸®¸¦ ´Ý´Âµ¥ »ç¿ëµÈ´Ù. µ¿Àû ¶ó À̺귯¸®´Â µ¿Àû ÆÄÀÏÇڵ鿡 °üÇÑ ¸µÅ©¼öÈ¿¸¦ °è¼Ó À¯ÁöÇÏ°í ÀÖÀ¸¹Ç·Î Àû¾î µµ dlopen()ÀÌ È£ÃâµÈ Ƚ¼ö¸¸Å­ÀÇ dlclose()ÀÇ ¼öÇàÀÌ ¾ø±â Àü¿¡´Â ½ÇÁ¦ÀûÀ¸·Î ¸Þ¸ð¸®¿¡¼­ »èÁ¦µÇÁö ¾Ê´Â´Ù. ±×·¡¼­ °°Àº ÇÁ·Î±×·¥ÀÌ °°Àº ¶óÀ̺귯¸®¸¦ ¿© ·¯¹ø È£ÃâÇÏ´Â °ÍÀº ¾Æ¹«·± ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù.

µ¿Àû ¶óÀ̺귯¸®ÀÇ ¿¹ dlopen()ÀÇ ¸Å´º¾ó ÆäÀÌÁö¿¡ ³ª¿À´Â µ¿Àû¶óÀ̺귯¸®ÀÇ ¿¹°¡ ¾Æ·¡¿¡ ÀÖ´Ù. ¿¹ ¿¡¼­´Â ¼öÇжóÀ̺귯¸®°¡ ·ÎµåµÇ°í 2.0ÀÇ cosine°ªÀÌ Ãâ·ÂµÇ¸ç ¸Å¼ø°£¸¶´Ù ¿¡ ·¯¸¦ °Ë»ç(±Ç°íµÊ)ÇÑ´Ù.


    #include <stdio.h>
    #include <dlfcn.h>
    int main(int argc, char **argv) 
        void *handle;
        double (*cosine)(double);
        char *error;
        handle = dlopen ("/lib/libm.so", RTLD_LAZY);
        if (!handle) 
            fputs (dlerror(), stderr);
            exit(1);
        

        cosine = dlsym(handle, "cos");
        if ((error = dlerror()) != NULL)  
            fputs(error, stderr);
            exit(1);
        

        printf ("%f", (*cosine)(2.0));
        dlclose(handle);
    

¸¸¾à À§ÀÇ ÇÁ·Î±×·¥ÀÇ À̸§ÀÌ foo.c ¶ó¸é ´ÙÀ½ÀÇ ¸í·ÉÀ» ½á¼­ ½ÇÇàÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ´Ù.

gcc -Wl,export-dynamic -o foo foo.c -ldl -WI, export-dynamic ¿É¼ÇÀº ½ÇÁúÀûÀ¸·Î ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï³ª ¶§¶§·Î À¯¿ëÇÔ À» ¾Ë°ÔµÉ °ÍÀÌ´Ù. ±×°ÍÀº ld¿¡ Á¤ÀǵǾî Àִµ¥ ELFÆÄÀÏÀÇ »ý¼º½Ã¿¡ ÀÌ¿É¼Ç Àº ¸ðµç ½Éº¼À» ´ÙÀ̳ª¹Í ½Éº¼Å×ÀÌºí¿¡ ºÎ°¡ÇÑ´Ù. Åë»óÀûÀ¸·Î ´ÙÀ̳ª¹Í ½Éº¼Å× À̺íÀº µ¿Àû ¿ÀºêÁ§Æ®¿¡¼­ »ç¿ëµÇ´Â ½Éº¼¸¸À» °¡Áö°í ÀÖ´Ù. ÀÌ ¿É¼ÇÀº dlopen()ÀÇ ¾î¶² ¿ëµµ¿¡¼­ ÇÊ¿äÇÏ´Ù. -WI, export-dynamic º¸´Ù -rdynamicÀ» ¾²¶ó°í ¸»ÇÒ¼öµµ ÀÖ°ÚÁö¸¸ ELF¹®¼­¿¡ ÀÇÇϸé -rdynamicÀº ºñ ¸®´ª½º ½Ã½º ÅÛÀÇ gcc¿¡¼­´Â Ç×»ó Á¦´ë·Î µ¿ÀÛÇÏ´Â °ÍÀº ¾Æ´Ï¶ó°í ÇÑ´Ù.


´ÙÀ½ ÀÌÀü Â÷·Ê