void *dlopen (const char *filename, int flag);
const char *dlerror(void);
void *dlsym(void *handle, char *symbol);
int dlclose (void *handle);
»ç¿ëÀÚÀÇ LD_LIBRARY_PATH ȯ°æº¯¼ö¿¡ ÄÝ·Ð(:)À¸·Î ±¸ºÐµÇ¾î ÀÖ´Â µð·ºÅ丮 ¸®½ºÆ®
/etc/ld.so.cache¿¡ ÀúÀåµÈ ¶óÀ̺귯¸® ¸®½ºÆ®
/lib°¡ µÚµû¸£´Â, /usr/lib.
¸¸¾à filenameÀÌ NULL Æ÷ÀÎÅÍÀ̸é, ¹ÝȯµÈ ÇÚµéÀº ¸ÞÀÎ ÇÁ·Î±×·¥¿¡ ÇØ´çÇÏ´Â °ÍÀÌ´Ù.
¶óÀ̺귯¸®¿¡ ÀÖ´Â ¿ÜºÎ ÂüÁ¶´Â ÀÌ ¶óÀ̺귯¸®ÀÇ ÀÇÁ¸°ü°è ¸ñ·Ï¿¡ ÀÖ´Â ¶óÀ̺귯¸®¿Í Àü¿¡ RTLD_GLOBAL Ç÷¡±×·Î ¿¸° ´Ù¸¥ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â °ÍÀ¸·Î ÇØ°áµÈ´Ù. ¸¸¾à ½ÇÇà ÆÄÀÏÀÌ "-rdynamic" Ç÷¡±×·Î ¿¬°áµÇ¾ú´Ù¸é, ½ÇÇà ÆÄÀÏ¿¡ ÀÖ´Â Àü¿ª ½Éº¼Àº µ¿ÀûÀ¸·Î žÀçµÈ ¶óÀ̺귯¸®ÀÇ ÂüÁ¶¸¦ ÇØ°áÇÑ´Ù.
flag´Â ¹Ýµå½Ã RTLD_LAZY - µ¿Àû ¶óÀ̺귯¸®ÀÇ Äڵ尡 ½ÇÇàµÇ¾î Á¤ÀǵÇÁö ¾ÊÀº ½Éº¼À» ÇØ°áÇÏ´Â °ÍÀ» ÀÇ¹Ì - ¶Ç´Â RTLD_NOW - dlopen ÀÌ ¹ÝȯµÇ±â Àü¿¡ Á¤ÀÇÇÏÁö ¾ÊÀº ¸ðµç ½Éº¼À» ÇØ°áÇÏ´Â °ÍÀ» ÀÇ¹Ì - À̾î¾ß¸¸ ÇÑ´Ù. ±×¸®°í ÀÌ °úÁ¤ÀÌ ¼öÇàµÇÁö ¾ÊÀ¸¸é ½ÇÆÐÇÒ °ÍÀÌ´Ù. Ãß°¡ÀûÀ¸·Î, RTLD_GLOBALÀº ¶óÀ̺귯¸®¾È¿¡ Á¤ÀÇµÈ ¿ÜºÎ ½Éº¼ÀÌ µÚÀÌÀº ¶óÀ̺귯¸®°¡ žÀçµÇ´Â °ÍÀÌ °¡´ÉÇÏ°Ô ÇÒ °æ¿ì¿¡ flag¿Í OR µÉ ¼ö ÀÖ´Ù.
¸¸¾à ¶óÀ̺귯¸®°¡ _initÀ̶ó´Â ·çƾ¿¡ Àü´ÞµÉ °æ¿ì, ¶óÀ̺귯¸®¿¡ ÀÖ´Â ÄÚµå´Â dlopenÀÌ ¹ÝȯµÇ±â Àü¿¡ ¼öÇàµÉ °ÍÀÌ´Ù. ¸¸¾à °°Àº À̸§ÀÇ ¶óÀ̺귯¸®°¡ dlopen()À¸·Î µÎ ¹ø ÀûÀçµÈ´Ù¸é °°Àº ÆÄÀÏ ÇÚµéÀ» ¸®ÅÏÇÑ´Ù. dl ¶óÀ̺귯¸®´Â µ¿Àû ÆÄÀÏ ÇÚµéÀÇ ¸µÅ© ¼ö¸¦ °ü¸®ÇÑ´Ù. ±×·¡¼ µ¿Àû ¶óÀ̺귯¸®°¡ dlopen¿¡ ÀÇÇØ ¼º°øÀûÀ¸·Î È£ÃâµÈ ¸¸Å dlcloseÀ» È£ÃâÇÒ ¶§±îÁö ÇÒ´çÇÑ °ÍÀ» ÇØÁ¦ÇÏÁö ¾Ê´Â´Ù.
¸¸¾à dlopenÀÌ ¾î¶² ÀÌÀ¯¿¡¼¶óµµ ½ÇÆи¦ ÇÑ´Ù¸é NULLÀ» ¹ÝȯÇÑ´Ù. dl ·çƾ (dlopen, dlsym, dlclose) ¿¡ ÀÇÇØ ¹ß»ýÇÑ °¡Àå ÃÖ±ÙÀÇ ¿¡·¯¸¦ º¸±â À§Çؼ´Â dlerror()À» È£ÃâÇØ¾ß ÇÑ´Ù. dlerrorÀº ÃʱâÈ ÀÌÈÄ ¶Ç´Â ÀÌ ÇÔ¼ö°¡ ¸¶Áö¸·À¸·Î È£Ãâ (¿¬¼ÓÀûÀ¸·Î ÀÌ ÇÔ¼ö°¡ µÎ¹ø È£ÃâµÇ¸é µÎ¹ø° È£ÃâÀÇ ¹Ýȯ°ªÀº Ç×»ó NULLÀÌ´Ù.) µÈ ÈÄ ¾Æ¹«·± ¿¡·¯°¡ ¹ß»ýÇÏÁö ¾Ê¾Ò´Ù¸é NULLÀ» ¹ÝȯÇÑ´Ù.
dlsymÀº dlopen¿¡¼ ¸®ÅÏµÈ µ¿Àû ¶óÀ̺귯¸®ÀÇ ÇÚµé°ú null·Î ³¡³ª´Â symbol À̸§À» ÃëÇÏ°í ÀÌ ½Éº¼ÀÇ ÀûÀçµÈ ÁÖ¼Ò¸¦ ¹ÝȯÇÑ´Ù. ¸¸¾à ½Éº¼À» ãÁö ¸øÇϸé, NULLÀ» ¹ÝȯÇÑ´Ù; ±×·¯³ª dlsym¿¡ ÀÇÇØ ¹ß»ýÇÑ ¿¡·¯¸¦ Á¤È®È÷ ¾Ë¾Æº¸´Â ¹æ¹ýÀº dlerror¿¡ ÀÇÇÑ °á°ú°ªÀÌ NULLÀÌ ¾Æ´Ñ °æ¿ì ±× °ªÀ» °Ë»çÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô ÇÏ´Â ÀÌÀ¯´Â ½Éº¼ÀÇ °ªÀÌ ½ÇÁ¦·Î NULLÀÌ µÇ´Â °æ¿ì°¡ Àֱ⠶§¹®ÀÌ´Ù. ±×¸®°í dlerrorÀÌ ´Ù½Ã È£ÃâµÉ ¶§¿¡´Â NULLÀ» ¹ÝȯÇϱ⠶§¹®¿¡, ÇÊ¿äÇÏ´Ù¸é dlerrorÀÇ °á°ú°ª¸¦ ÀúÀåÇؾ߸¸ ÇÑ´Ù.
dlcloseÀº µ¿Àû ¶óÀ̺귯¸® ÇÚµéÀÎ handle¿¡ ´ëÇÑ ÂüÁ¶°è¼ö¸¦ Çϳª °¨¼Ò½ÃŲ´Ù. ¸¸¾à ÂüÁ¶°è¼ö°¡ 0ÀÌ µÇ°í ´Ù¸¥ ¾î¶² ÀûÀçµÈ ¶óÀ̺귯¸®µéÀÌ ÀûÀ縦 Ãë¼ÒÇÏ°íÀÚ ÇÏ´Â µ¿Àû ¶óÀ̺귯¸®¿¡ ÀÖ´Â ½Éº¼À» »ç¿ëÇÏÁö ¾ÊÀ¸¸é, µ¿Àû ¶óÀ̺귯¸®´Â ÀûÀç°¡ Ãë¼ÒµÈ´Ù. ¸¸¾à µ¿Àû ¶óÀ̺귯¸®°¡ _fini¶ó´Â ·çƾ¿¡ Àü´ÞµÉ °æ¿ì, ¶óÀ̺귯¸®ÀÇ ÀûÀç°¡ Ãë¼ÒµÇ±â ¹Ù·Î Àü¿¡ ÀÌ ·çƾÀÌ È£ÃâµÉ °ÍÀÌ´Ù.
#include <dlfcn.h> int main(int argc, char **argv) { void *handle = dlopen ("/lib/libm.so", RTLD_LAZY); double (*cosine)(double) = dlsym(handle, "cos"); printf ("%f\n", (*cosine)(2.0)); dlclose(handle); }
¸¸¾à ÇÁ·Î±×·¥ À̸§ÀÌ "foo.c"¶ó¸é ´ÙÀ½°ú °°Àº ¸í·É¾î·Î ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù:
gcc -rdynamic -o foo foo.c -ldl
°°Àº ¹æ¹ýÀ¸·Î ÇÏÀÚ. ±×·¯³ª ¸Å´Ü°è¸¶´Ù ¿¡·¯ üũ¸¦ ÇÏÀÚ:
#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) { fprintf (stderr, "%s, error); exit(1); } printf ("%f\n", (*cosine)(2.0)); dlclose(handle); }