µ¿Àû ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÇ ½ÃÀ۽ð¡ ¾Æ´Ñ ´Ù¸¥¶§¿¡ ÀûÀçµÇ´Â ¶óÀ̺귯¸® ¸¦ ¸»ÇÑ´Ù. Ç÷¯±×ÀεîÀÇ ¸ðµâÀº ±×°ÍÀÇ ÇÊ¿ä½Ã±îÁö ÀûÀ縦 ±â´Ù¸®´Â °ÍÀÌ Çã ¿ëµÇ¹Ç·Î À̵éÀÇ ±¸Çö¿¡ ƯÈ÷ À¯¿ëÇÏ´Ù. ¿¹¸¦µé¸é 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(3) ÇÔ¼ö´Â ¶óÀ̺귯¸®¸¦ ¿¾î¼ »ç¿ëÁغñ¸¦ ÇÑ´Ù. C¿¡¼ ÇÔ¼öÀÇ ¿ø ÇüÀº ¾Æ·¡¿Í °°´Ù.
void *dlopen(const char *filename, int flag);
¸¸¾à¿¡ ÆÄÀÏÀÇ À̸§ÀÌ /(Áï, Àý´ë°æ·Î)·Î ½ÃÀÛÇÑ´Ù¸é dlopen()Àº ¶óÀ̺귯 ¸®¸¦ Ž»öÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù. ±×·¸Áö ¾Ê´Ù¸é dlopen()Àº ´ÙÀ½°ú °°Àº ¼ø¼·Î ¶ó À̺귯¸®¸¦ Ž»öÇÑ´Ù.
¸¸¾à ¶óÀ̺귯¸®µéÀÌ ¼·Î ÀÇÁ¸ÇÒ °æ¿ì(¿¹¸¦ µé¸é X°¡ Y¸¦ ÀÇÁ¸ÇÑ´Ù¸é), ÀÇ Á¸ÀÌ µÇ¾îÁÖ´Â ¶óÀ̺귯¸®(ÀÌ ¿¹¿¡¼´Â Y)¸¦ ¸ÕÀú ·ÎµåÇÏ¿©¾ß ÇÑ´Ù. dlopen()ÀÇ ¸®ÅÏ°ªÀº (ÀûÀçµÇ´Â µ¿Àû ¶óÀ̺귯¸®ÀÇ ÀÏÁ¾ÀÇ ÆÄÀÏ) ÇÚµé(handle) ÀÌ´Ù. ±×°ÍÀº ´Ù¸¥ µ¿Àû ¶óÀ̺귯¸® ·çƾ¿¡¼ »ç¿ëµÇ¾îÁú ¾î¶°ÇÑ °ªÀ̶ó °í·Á µÉ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀûÀç½Ãµµ°¡ ½ÇÆÐÇϸé dlopen()Àº NULLÀ» ¸®ÅÏÇÒ °ÍÀ̸ç Á¡°ËÇØ º¸±æ ¹Ù¶õ´Ù. °°Àº ¶óÀ̺귯¸®°¡ µÎ¹ø ÀÌ»ó dlopen()¿¡ ÀÇÇؼ ·ÎµåµÈ ´Ù¸é °°Àº ÆÄÀÏ ÇÚµéÀÌ ¸®ÅϵȴÙ.
¸¸¾à ¶óÀ̺귯¸®¿¡¼ _init·Î ¸í¸íµÈ ·çƾÀ» ¿ÜºÎ È£Ãâ ÇÑ´Ù¸é ±× Äڵ尡 dlopen()ÀÇ ¸®ÅÏÀü¿¡ ¼öÇàµÈ´Ù. ÀÌ·¯ÇÑ »ç½ÇÀ» ÀÌ¿ëÇØ ´ç½ÅÀÇ ¶óÀ̺귯¸®¿¡¼ ÃʱâÈ ·çƾÀ» ±¸ÇöÇÏ¸é µÉ °ÍÀÌ´Ù.
¿¡·¯´Â dlerror()À» È£ÃâÇÔÀ¸·Î½á º¸°íµÇ´Âµ¥, ÀÌ ÇÔ¼ö´Â °¡Àå ÃÖ±ÙÀÇ dlopen(), dlsym(), ¶Ç´Â dlclose()·Î ÀÎÇØ ¹ß»ýÇÑ ¿¡·¯¸¦ ±â¼úÇÏ´Â ½ºÆ®¸µ À» ¸®ÅÏÇÑ´Ù. ÇÑ°¡Áö Ưº°ÇÑ Á¡Àº dlerror()¸¦ È£ÃâÇÏ°í ³µÚ¿¡´Â ±× ´ÙÀ½ºÎ ÅÍ´Â ¶Ç´Ù¸¥ ¿¡·¯°¡ ¹ß»ýÇϱâ Àü±îÁö dlerror()´Â NULLÀ» ¸®ÅÏÇÑ´Ù´Â °ÍÀÌ ´Ù.
µ¿Àû ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ°í »ç¿ëÇÏÁö ¸øÇÑ´Ù¸é ¾Æ¹«·± Àǹ̵µ ¾øÀ» °ÍÀÌ´Ù. 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()´Â 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¿¡¼´Â Ç×»ó Á¦´ë·Î µ¿ÀÛÇÏ´Â °ÍÀº ¾Æ´Ï¶ó°í ÇÑ´Ù.