Home :: International :: Manuals :: Howto :: FAQ :: Man Pages :: Email Login

 
 

 

DLOPEN

Section: Linux Programmer's Manual (3)
Updated: 16 May 1995
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 dladdr(void *address, Dl_info *dlip);
int dlclose (void *handle);

ÆÃ¼ì¤Ê¥·¥ó¥Ü¥ë: _init, _fini.  

ÀâÌÀ

dlopen ¤Ï null ½ªÃ¼Ê¸»úÎó filename ¤Ç»ØÄꤵ¤ì¤¿Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ò¥À¥¤¥Ê¥ß¥Ã¥¯¥é¥¤¥Ö¥é¥ê¤È¤·¤Æ¥í¡¼¥É¤·¡¢ ¤½¤Î¥À¥¤¥Ê¥ß¥Ã¥¯¥é¥¤¥Ö¥é¥ê¤Ø ¤ÎÈ󯩲á (opaque) ¤Ê¡Ö¥Ï¥ó¥É¥ë¡×¤òÊÖ¤¹¡£ filename ¤¬ÀäÂХѥ¹ ("/" ¤Ç»Ï¤Þ¤ë¥Ñ¥¹) ¤Ç¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¥Õ¥¡¥¤¥ë ¤Ï°Ê²¼¤Î¾ì½ê¤«¤é¸¡º÷¤µ¤ì¤ë¡£

¥æ¡¼¥¶¡¼¤Î LD_LIBRARY ´Ä¶­ÊÑ¿ô¤Ç»ØÄꤵ¤ì¤¿¡¢¥³¥í¥ó¶èÀÚ¤ê¤Î¥Ç¥£ ¥ì¥¯¥È¥ê¥ê¥¹¥È¡£

/etc/ld.so.cache Ãæ¤Ë¤¢¤ë¥é¥¤¥Ö¥é¥ê¤Î¥ê¥¹¥È¡£

/usr/lib¡¢ ¼¡¤¤¤Ç /lib¡£

filename ¤¬ NULL ¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢ ÊÖ¤µ¤ì¤ë¥Ï¥ó¥É¥ë¤Ï¥á¥¤¥ó¥×¥í¥°¥é¥à¤Î¤â¤Î¤Ë¤Ê¤ë¡£

¥ª¡¼¥×¥ó¤µ¤ì¤¿¥é¥¤¥Ö¥é¥êÃæ¤Ç¤Î³°Éô»²¾È¤Ï¡¢ ¤½¤Î¥é¥¤¥Ö¥é¥ê¤Î°Í¸¥ê¥¹¥È¤Ë¤¢¤ë¥é¥¤¥Ö¥é¥ê¤«¡¢¤¹¤Ç¤Ë RTLD_GLOBAL ¥Õ¥é¥°¤È¶¦¤Ë¥ª¡¼¥×¥ó¤µ¤ì¤Æ¤¤¤ë¥é¥¤¥Ö¥é¥ê¤òÍѤ¤¤Æ²ò·è¤µ¤ì¤ë¡£ ¼Â¹Ô¥Õ¥¡¥¤¥ë¤¬ "-rdynamic" ¥Õ¥é¥°¤È¤È¤â¤Ë¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢ ¼Â¹Ô¥Õ¥¡¥¤¥ëÃæ¤Î¥°¥í¡¼¥Ð¥ë¥·¥ó¥Ü¥ë¤â¡¢ ¥À¥¤¥Ê¥ß¥Ã¥¯¤Ë¥í¡¼¥É¤µ¤ì¤ë¥é¥¤¥Ö¥é¥ê¤Ø¤Î»²¾È²ò·è¤ËÍѤ¤¤é¤ì¤ë¡£

flag ¤Ï°Ê²¼¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤: RTLD_LAZY ¤Ï¥À¥¤¥Ê¥ß¥Ã¥¯¥é¥¤¥Ö¥é¥ê¤Î¥³¡¼¥É¤¬¼Â¹Ô¤µ¤ì¤ëºÝ¤Ë ̤ÄêµÁ¥·¥ó¥Ü¥ë¤ò½ç¼¡²ò·è¤·¤Æ¤¤¤¯¤³¤È¤ò¼¨¤·¡¢ RTLD_NOW ¤Ï dlopen ¤Î½èÍý¤ÎºÇ¸å¤Ç¤¹¤Ù¤Æ¤Î̤ÄêµÁ¥·¥ó¥Ü¥ë¤ò²ò·è¤·¡¢¤³¤ì¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¤Ë¤Ï dlopen ¤¬¼ºÇԤȤʤ뤳¤È¤ò¼¨¤¹¡£¤µ¤é¤Ë RTLD_GLOBAL ¤ò flag ¤Ë OR ±é»»¤µ¤»¤ë¤³¤È¤â¤Ç¤­¤ë¡£¤³¤Î¾ì¹ç¤Ë¤Ï¡¢¥é¥¤¥Ö¥é¥ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë ³°Éô¥·¥ó¥Ü¥ë¤¬¡¢°ú¤­Â³¤¤¤Æ¥í¡¼¥É¤µ¤ì¤ë¾¤Î¥é¥¤¥Ö¥é¥ê¤Ç¤âÍ­¸ú¤Ë¤Ê¤ë¡£

¥é¥¤¥Ö¥é¥ê¤¬ _init ¤È¤¤¤¦Ì¾Á°¤Î¥ë¡¼¥Á¥ó¤ò¥¨¥¯¥¹¥Ý¡¼¥È¤·¤Æ¤¤¤ì¤Ð¡¢ dlopen ¤¬½ªÎ»¤¹¤ëÁ°¤Ë¤½ ¤Î¥³¡¼¥É¤¬¼Â¹Ô¤µ¤ì¤ë¡£Æ±¤¸¥é¥¤¥Ö¥é¥ê¤¬ dlopen() ¤Ë¤è¤Ã¤ÆÆóÅÙ¥í¡¼¥É¤µ¤ì¤¿¾ì¹ç¤Ë¤Ï¡¢Æ±¤¸¥Õ¥¡¥¤¥ë¥Ï¥ó¥É¥ë¤¬ÊÖ¤µ¤ì¤ë¡£ dl ¥é¥¤¥Ö¥é¥ê¤Ï¥À¥¤¥Ê¥ß¥Ã¥¯¥Õ¥¡¥¤¥ë¥Ï¥ó¥É¥ë¤Î¥ê¥ó¥¯¿ô¤òÊÝ»ý¤·¤Æ¤¤¤ë¡£ ¤·¤¿¤¬¤Ã¤Æ¥À¥¤¥Ê¥ß¥Ã¥¯¥é¥¤¥Ö¥é¥ê¤Ï dlclose ¤¬ dlopen ¤ÈƱ¤¸²ó¿ô¤À¤±¸Æ¤Ó½Ð¤µ¤ì¤Ê¤±¤ì¤Ð¥¢¥ó¥í¡¼¥É¤µ¤ì¤Ê¤¤¡£

dlopen ¤Ï¡¢²¿¤é¤«¤ÎÍýͳ¤Ç¼ºÇÔ¤¹¤ë¤È NULL ¤òÊÖ¤¹¡£ dl ¥ë¡¼¥Á¥ó (dlopen, dlsym, dlclose) ¤Î¤¤¤º¤ì¤«¤Ç ºÇ¤â¶á¤¤²áµî¤ËÀ¸¤¸¤¿¥¨¥é¡¼¤Ï¡¢ dlerror() ¤Ë¤è¤Ã¤Æ¿Í´Ö¤Ë²ÄÆÉ¤Ê·Á¤Çɽ¼¨¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡£ dlerror ¤Ï½é´ü²½¤µ¤ì¤¿»þÅÀ¡¢¤¢¤ë¤¤¤ÏºÇ¸å¤Ë¸Æ¤Ó½Ð¤µ¤ì¤¿»þÅÀ¤«¤é¥¨¥é¡¼¤¬µ¯¤³¤Ã¤Æ ¤¤¤Ê¤±¤ì¤Ð NULL ¤òÊÖ¤¹¡£ ( dlerror() ¤ò 2 ²ó³¤±¤Æ¸Æ¤Ó½Ð¤¹¤È¡¢ 2 ÅÙÌܤΥ³¡¼¥ë¤Ç¤Ïɬ¤º NULL ¤¬Ê֤롣)

dlsym ¤Ï dlopen ¤Ë¤è¤Ã¤ÆÊÖ¤µ¤ì¤¿¥À¥¤¥Ê¥ß¥Ã¥¯¥é¥¤¥Ö¥é¥ê¤Î¡Ö¥Ï¥ó¥É¥ë¡×¤È¡¢ ¥Ì¥ëʸ»ú¤Ç½ªÃ¼¤µ¤ì¤¿Ê¸»úÎó¤Î¥·¥ó¥Ü¥ë̾¤ò°ú¤­¿ô¤Ë¼è¤ê¡¢ ¤½¤Î¥·¥ó¥Ü¥ë¤¬¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥¢¥É¥ì¥¹¤òÊÖ¤¹¡£ ¥·¥ó¥Ü¥ë¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢ dlsym ¤Ï NULL ¤òÊÖ¤¹¡£¤·¤«¤· dlsym ¤Î¥¨¥é¡¼¤òÄ´¤Ù¤ë¤Ë¤Ï¡¢ dlerror ¤Î·ë²Ì¤òÊÑ¿ô¤ËÊݸ¤·¡¢ ¤½¤ì¤¬ NULL ¤Ç¤Ê¤¤¤«¤É¤¦¤«¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤Î¤¬Àµ¤·¤¤¤ä¤êÊý¤Ç¤¢¤ë¡£ ¥·¥ó¥Ü¥ë¤ÎÃͤ¬¼ÂºÝ¤Ë NULL ¤Ç¤¢¤ë¾ì¹ç¤â¤¢¤êÆÀ¤ë¤«¤é¤Ç¤¢¤ë¡£¤Þ¤¿ dlerror ¤Î·ë²Ì¤òÊÑ¿ô¤ËÊݸ¤·¤Æ¤ª¤¯¤³¤È¤âɬÍפʤ³¤È¤Ç¤¢¤ë¡£¤Ê¤¼¤Ê¤é¤â¤¦°ìÅÙ dlerror ¤ò¸Æ¤Ó½Ð¤¹¤È¡¢ÊÖ¤êÃÍ¤Ï NULL ¤È¤Ê¤Ã¤Æ¤·¤Þ¤¦¤«¤é¤Ç¤¢¤ë¡£

dladdr ¤Ï¡¢ address ¤Ç»ØÄꤵ¤ì¤¿¥á¥â¥ê°ÌÃÖ¤ò½êÍ­¤·¤Æ¤¤¤ë¶¦Í­¥é¥¤¥Ö¥é¥ê¤Ë´Ø¤¹¤ë¾ðÊó¤òÊÖ¤¹¡£ dladdr ¤ÏÀ®¸ù¤¹¤ë¤È¥¼¥í¤ò¡¢¼ºÇÔ¤¹¤ë¤ÈÈó¥¼¥í¤ÎÃͤòÊÖ¤¹¡£

dlclose ¤Ï¥À¥¤¥Ê¥ß¥Ã¥¯¥é¥¤¥Ö¥é¥ê¤Î¥Ï¥ó¥É¥ë handle ¤Î»²¾È¥«¥¦¥ó¥È¤ò 1 ¸º¤é¤¹¡£»²¾È¥«¥¦¥ó¥È¤¬ 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)  {
        fputs(error, stderr);
        exit(1);
    }

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

¼Õ¼­

dlopen ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Îɸ½à¤Ï Solaris ¤ò¤â¤È¤Ë¤·¤Æ¤¤¤ë¡£ Linux ¤Î dlopen ¤Î¼ÂÁõ¤Ï¡¢Åö½é Eric Youngdale ¤Ë¤è¤Ã¤Æ¤Ê¤µ¤ì¤¿¡£ ¤³¤Î¤È¤­ Mitch D'Souza, David Engel, Hongjiu Lu, Andreas Schwab ¤é¤Î ½õÎϤ¬¤¢¤Ã¤¿¡£ ¤³¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤Ï Adam Richter ¤¬½ñ¤¤¤¿¡£  

´ØÏ¢¹àÌÜ

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


 

Index

̾Á°
½ñ¼°
ÀâÌÀ
Îã
¼Õ¼­
´ØÏ¢¹àÌÜ

 
 
 
 
Google
  Web Linuxinfor   
 

Home :: Copyright :: Privacy :: Credits :: Get a free Linuxinfor Email Account

Document on this page is part of "Linuxinfor Man Pages in HTML Format: man3". See Index Page for more info about Authorship and Copyright.

1999-2008 Linuxinfor.com. No rights reserved.