DLOPEN

Section: ¸®´ª½º ÇÁ·Î±×·¡¸Ó ¸Å´º¾ó (3)
Updated: 1995³â 5¿ù 16ÀÏ
Index
Return to Main Contents
 

À̸§

dlclose, dlerror, dlopen, dlsym - µ¿Àû ¸µÅ© ·Î´õ¿¡ ´ëÇÑ ÇÁ·Î±×·¡¹Ö ÀÎÅÍÆäÀ̽º.  

»ç¿ë¹ý

#include <dlfcn.h>

void *dlopen (const char *filename, int flag);
const char *dlerror(void);
void *dlsym(void *handle, char *symbol);
int dlclose (void *handle);

Ư¼ö ±âÈ£: _init, _fini.  

¼³¸í

dlopenÀº null·Î ³¡³ª´Â ¹®ÀÚ¿­ÀÎ ÆÄÀÏ À̸§ filenameÀ¸·ÎºÎÅÍ µ¿Àû ¶óÀ̺귯¸®¸¦ Àоî¿Â´Ù. µ¿Àû ¶óÀ̺귯¸®¸¦ À§ÇØ Á¤ÇØÁöÁö ¾ÊÀº "handle"À» ¸®ÅÏÇÑ´Ù. ¸¸¾à filename ÀÌ »ó´ë°æ·Î ("/" ·Î ½ÃÀÛÇÏÁö ¾Ê´Â) ¶ó¸é, ´ÙÀ½ À§Ä¡¿¡¼­ È­ÀÏÀ» ã´Â´Ù:

»ç¿ëÀÚÀÇ 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¶ó´Â ·çƾ¿¡ Àü´ÞµÉ °æ¿ì, ¶óÀ̺귯¸®ÀÇ ÀûÀç°¡ Ãë¼ÒµÇ±â ¹Ù·Î Àü¿¡ ÀÌ ·çƾÀÌ È£ÃâµÉ °ÍÀÌ´Ù.  

¿¹Á¦

math ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ°í, ÄÚ»çÀÎ 2.0À» Ãâ·ÂÇÑ´Ù:
#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);
}
 

°¨»ç

dlopen ÀÎÅÍÆäÀ̽º Ç¥ÁØÀº ¼Ö¶ó¸®½º¿¡¼­ ºÎÅÍ ½ÃÀ۵Ǿú´Ù. ¸®´ª½ºÀÇ dlopen¿¡ ´ëÇÑ ±¸ÇöÀº Mitch D'Souza, David Engel, Hongjiu Lu, Andreas Schwab¿Í ±×¿Ü ´Ù¼öÀÇ µµ¿òÀ» ¹Þ¾Æ Eric YoungdaleÀÌ ÇÏ¿´´Ù. ÀÌ ¸Å´º¾ó ÆäÀÌÁö´Â Adam Richter°¡ ÀÛ¼ºÇÏ¿´´Ù.  

°ü·Ã Ç׸ñ

ld(1), ld.so(8), ldconfig(8), ldd(1), ld.so.info.  

¿ªÀÚ

Á¤µ¿Çö <dhjung@serome.co.kr>, 2000³â 4¿ù 22ÀÏ


 

Index

À̸§
»ç¿ë¹ý
¼³¸í
¿¹Á¦
°¨»ç
°ü·Ã Ç׸ñ
¿ªÀÚ

This document was created by man2html, using the manual pages.
Time: 08:07:01 GMT, March 25, 2004