  α׷ ̺귯 Ͽ

  David A. Wheeler
   0.60, 2000 4 27
   : Ȳ  (jeenee@soback.kornet.net <mailto:jeenee@soback.kor
  net.net>)
  2000 5

   Ͽ  α׷Ӱ  ȯ濡 α׷
  ̺귯  ϰ Ҽ ִ ٷ  ̺귯
   ̺귯 ,  ̺귯  (DL) ̺귯 ִ.
  ______________________________________________________________________

  

  1. 
  2.  ̺귯
  3.  ̺귯
  4. (DL) ̺귯
  5. ΰ 
  6.  
  7. ٸ    ҽ
  8. ۱ǰ ̼
  9. ּ

  ______________________________________________________________________

  1.  

   Ͽ  α׷Ӱ    GNU  ̿Ͽ 
   α׷ ̺귯 ϰ ̿Ҽ ִ ٷ. α׷
   귯 ܼϰ  ߿  α׷  ڵ忡 ־
  ִ  ϵ ڵ(׸ ) ִ ̸,  ̸ ؼ
  α׷  ȭɼ ,  , 
  . α׷   ̺귯 , , (DL) ̺귯
   · 뺰ȴ.   α׷ Ǳ ̸
  α׷ ġǴ    ̺  ٷ ̸, 
   α׷ ۽ÿ Ǿ   α   Ǵ 
  ̺귯, ׸   α׷    
      ̺귯 ٷ ̴.  ̺귯
  ٸ    ̺귯 ̶      .(
  ̺귯̰  ̺귯̰    ̺귯  
  )   ̺귯 ٸ  װ α׷ӿ ؼ
  ̿ Ǵ Ŀ ִ ̴.  å ٸ 忡 װ  
      ̴.

   å   κ    Ǵ ELF    
  α׷ ̺귯 ٷ ̴. GNU gcc   ELFܿ  ٸ
    ̺귯 ٷ ִµ  κ   
  ̹ ̵  a.out  ٷ ִ,   ̰ å
     ̴.

     ũ ̺귯(DLL)    Ͽ ̺
   Īϱ⵵ ϰ,   ̰    ̺귯 
   DLL̶ Īϱ⵵ ϰ , δ      
  DLL̶  ⵵ ϳ ̰   ߿ Ⱑ ƴϴ. ̹
     ǹ̸  ϰǰ  DLL ٷ ̴.

     ýۿ õɼ  ִ  α׷ Ϸ  Ѵٸ LINUX
  Tool ٷ ϴ  ٴ GNU Libtool   
  ٶ.  GNU Libtool  ̺귯 ( ġ)
  ⼺  ϰǰ ̽ ̽ ؼ ִ 
  ̺귯  ũ Ʈ̴.   GNU Libtool Tool߿
  ֻ Ǿ   ʵ   Ͽ  Ǿִ.
  DL  ̺귯  ̽İ  ̽   ؼ 
  ̽ļ  ġ     GNU Libtool  "Libltdl"  ԵǾ
  ִ. ٸ δ glib ̺귯 (glibc ȥ) 
     ̽ļ Ҽ ִ.  װ Ϸ Ѵٸ
     [10]developer.gnome.org/doc/API/glib/glib-dynamic-
  loading-of-modules.html <http://developer.gnome.org/doc/API/glib/glib-
  dynamic-loading-of-modules.html>   ٶ. ٽ  ѹ 
  ϰǵ  ̺귯 뿡    ɵ  
     ̸  ڵ带 ̰ų  ̶
  ̹  Ұ̴.

   Ͽ  ּҴ [11]www.dwheeler.com/program-library
  <http://www.dwheeler.com/program-library> ̸
  LDP([12]http://www.linuxdoc.org <http://www.linuxdoc.org>)
  ȴ. ۱ڴ  David  A.  Wheeler̸ GPL ̼ .

  2.   ̺귯

   ̺귯   Ʈ ȭ ̴. 
    ̺귯 .a ̾ .    Ʈ 
  ar(archiver) α׷ ؼ ȴ.  ̺귯 
  ̺귯      ó ׷ 
  Ǿ  ʴ´.  ׷  Ǿ  ְ 
   ߰  ϴ.   ̺귯 Ͼ
  α׷ ũɼ ֱ    ʿ ð ɼ
  ִ.   ǻ  ð ̷ Ͽ   ð
   ó  ׷ ߿   ɼ  ̴. 
  ̺귯 ڵ ҽڵ   α׷ӵ Ͽ
  ũϿ ϵ Ҷ   ̵ȴ.  (̶ ̺귯
    Ǹڴ  ̺귯 ̿ϰ  ϴ
  α׷ӵ鿡  Ѱ ƴϴ.) ̷л Ͽ ũǴ
   ELF ̺귯  ڵ 1-5%  Ǿϳ 
  ־ ٸ    Ͽ ̷    ʴ°
  .

   ̺귯 ϰų    ̺귯  ΰ
  Ʈ  ߰    Ѵ.

  ar rcs my_library.a file1.o file2.o    file1.o
  file2.o Ʈ   mylibrary.a ߰ ų 
     Ѵ.  ̺귯      ̻
   ar(1)  ٶ.

   ̺귯  ٸ ϱ⸦  ̴. ̸
      α׷ ϱ  ϰ  ũ 
  κп    ԽŰ ȴ. ࿡ gcc(1) Ͽ 
  ٸ -l    Ͽ    ̺귯 ϸ
  ȴ. (info:gcc       ). Ŀ
  ld(1) ٷ Ͽ(-l,ɴ  -L ɼ) ǳ ld(1) ̽
   ϹǷ gcc(1)        ̴.

  3.   ̺귯

   ̺귯 α׷ ۵   α׷ ؼ Ǵ
   ̺귯 Ѵ.   ̺귯 ٸ ٸ Ŀ
      α׷ ڵ  ο  ̺귯
    . 翡 ־,  Ǵ ٹ Ʒ
   ɵ  ϹǷ  ź̸ , õǰ Ѵ.

  * ̺귯 ϸ鼭   ̺귯    
  ̵    ̺귯  ϴ α׷ Ҽ
  ִ.

  * Ư α׷  ̺귯 Ǵ  ̺귯
  ƯԼ ̵(ġ) ϴ.

  *     ̺귯  ̿Ͽ α׷ ߿
   .

      
         ̺귯 ̷ ɵ ϱ ؼ  ڰ
        ݵ   ̿  ʿ  ̵ ִ.
           ̺귯 ´ ̸  Ư  "soname"
        "real name" Ҽ  ־ , ( ̵ 
        ȣۿ ϴ° ˾ƾ Ѵ) ,  ̺귯 
        ýۻ  ġؾ ϴ° ˾ƾ Ѵ.

      ̺귯 ̸
          ̺귯 "soname"̶  Ҹ Ư ̸
         ִ.  "soname" ξ "lib", ̺귯 ̸,
        ".so" ,   ħǥ ̽  Ǵ 
        ѹ  ȴ. ( ܷ    C̺귯
        "lib" ۵ ʴ´)   "soname" 
        귯  丮 պκп . 
        ýۿ     "soname" ̶ ̺귯
         ̸("real name")   ɺ ũ( ڵ带 ִ
         ƴ)  ̴.

          ̺귯  ̺귯 ڵ尡 Ǿ ִ
           "real name"  .  ϸ
        "soname" ħǥ ̳  ѹ, ħǥ ׸ 
        ѹ   ̴.  ѹ û ̴. ̳ ѹ
         ѹ Ȯ   ̺귯  ġ Ǿ ִ
        ˰ ν ý  Ҽ ִ.  ȣ ̺
         ϱ ȭÿ  ȣ  
          . ̷ ν ̺귯 ȭ 
        .

        ΰ Ϸ ̺귯 䱸  ϴ ̸
        ϳ   Ѵ.( ̸ "linker name"̶  ̴.)
        ⿡    Ե ʴ "soname" شȴ.
         ̺귯 ϴ ٽ ̷ ̸  кϴ
        ̴.  α׷ ʿ  ̺귯 
        ǥҶ  ̺귯  "soname" Ѵ. ݴ ࿡
           ̺귯   ڼ   
         ϸ ־ Ѵ.  ο    ̺귯
        ġҶ    丮 Ѱ ġ ڿ
        ldconfig α׷ Ͽ Ѵ. ldconfig 丮
          ϵ     ϸ ɺ  ũν
        soname ϸ ÿ ĳ  /etc/ld.so.cache
        Ѵ.

        ldconfig linker name  ʴ´.  ̰ 
        ̺귯 ġ ÿ  ϴµ, ϰ   ֱ
        soname̳ real name ɺ ũ  ȴ. κ 
        ̺귯 ϰ ڵ ũ  ϱ⸦
        Ұ̹Ƿ soname ɺ ũϱ⸦ Ѵ. H. J. Lu 
        ldconfig  ڵ linker name  ʴİ
             ֱ  ̺귯 ũŰ
          ̸    ̺귯 ϰų
         װ  ũϷ     ldconfig  
        ̺귯  ũϰ    ʴ ̸ ׷
        ġڴ  ̺귯  ũɰ ؾ ϴ° ̶
        ߴ.

        ̻ ⸦    ldconfig
        /usr/lib/libreadline.so.3.0  real name ɺ ũ
          /usr/lib/libreadline.so.3     
        soname ̸  /usr/lib/libreadline.so.3  ɺ ũ
        link nameν  /usr/lib/libreadline.so   ̴.

      ýۻ ġ
         ̺귯  ý  Ưġ ؾѴ. 
        ҽ  Ʈ GNU ǥ     
        ڼ  info  [13]info:standards#Directory_Variables
        κ 캸 ٶ. GNU ǥ   ҽڵ ÿ  
        ̺귯 /usr/local/lib  ġϱ 
        Ѵ(/usr/local/bin ɵ ). GNUǥ   ̷
        Ʈ  ϰų ġƾ ȣϴ   
        ʵ ϰ ִ.  Ͻý  ǥ(FHS:File
        system Hierarchy Standard)    ÿ  ġ
         ξ ϴ    ϰ ִ.( www.pathname.com/fhs
        <http://www.pathname.com/fhs>  ϱ  ٶ).  FHS
        κ  ̺귯 /usr/lib ġ   Ѵ, ׷
        ý ۽ ʿ ̺귯 /lib , ý
        ̺귯 /usr/local/lib ġǾ Ѵ.

          ǥ  Ǵ     ׷  ʴ.
        GNU ǥ ҽڵ ڸ  Ʈ  ϴ
        ̰, FHS ҽ  (ý Ʈ ҽڵ带
           ý Ű    ؼ ġŰ)
         Ʈ ϴ ̴.  ̰   ȿ
        ̴, ,  ٿε   ֽ(  
        ִ) ҽڵ ڵ  丮 /usr/local
        ġɰ̸   ڵ尡   Ϻ Ű Ŵ
        ̿Ͽ ýۿ  ġ  Ʈ(̺귯) ġϰ
         ǥ  丮 ġҼ ִ   . ̺귯
        ؼ  ȣⰡ α׷ ̺귯  ȣϴ
        쿡 ݵ  α׷ usr/local/libexec(
        /usr/libexec ) ξ ϶. Ѱ ȥ 
         ̺귯 ã   /usr/local 丮
         Ųٴ ε,  Ʒ    /etc/so.confκ
        ϱ  ٶ. ׿ܿ Ǵٸ ϳ  ǥ  ̺ 
        丮 ִµ  X-  ý ϴ /usr/X11R6/lib
         ̴.  /lib/security 丮 PAM⿡ ʿ
        ϶.   丮   ̺귯ν ȴ.(
        ޺κп ǵɰ)

     ̺귯  Ǵ°
          ý ԵǴ GNU glibc- ý ELF
           α׷ ۽ÿ ڵ  α׷  δ
        ϰ Ų.   ýۿ  δ /lib/ld-
        linux.so.X(X  ѹ)̶ Ҹ  α׷
        Ǵ   ̺귯 ʴ ãƼ  Ų.

        ŽǾ 丮  /etc/ld.so.conf  ִ.
        ޿   Ϲ /usr/local/lib
        /etc/ld.so.confϿ    ڰ ϱ  ̰
          װ ƴѰ  Ѵ.    /usr/local/lib
        /etc/ld.so.conf ÷ϴ   α׷  Ű
          ִ ۾̴.

         ̺귯 Ư Լ ġŰ  ״
        Ϸ Ҷ ġų ̺귯(.oϵ)
        /etc/ld.so.preload Ͽ  ϸ Ǵµ ̷ ε
        ̺귯 ǥ  Լ 켱  ȴ. ̷
        ε ϵ     ġ Ǵµ  
          Ե ʴ´.

         α׷ ۽ø   丮  Žϴ 
         ſ  ȿ̱    δ ĳ
        ȴ.  ldconfig  ׷  /etc/ld.so.conf о
          ʿ  ũ 丮κ   ɺ ũ
        Ѵ.(׷  ̸    Ģ   Ѵ) 
         /etc/ld.so.cache      ϸ   
         α׷   ̿ϴ ̴. ̷ ؼ
        ̺귯 ׼   ӵ   Ǵ ̴.  
           ϴ  ٴ DLL ߰  Ǵ  ŵ  ,   Ǵ
        DLL 丮    ɶ ݵ ldconfig Ǿ
        Ѵٴ ̸, ׷ Ű Ŵ ̺귯 ġ , 
          Ǵ   ̴. ׷ α׷  ۽
         δ δ /etc/ld.so.cache  Ͽ ʿ
        ̺귯 ϴ ̴.

     ȯ 
          ȯ溯  ̷ α׷  ۽
          Ҽ     ġϵ ϴ
        ȯ溯鵵 ִ.     ,  ̺귯
         üϿ Ҽ ִ.    ȯ溯
        LD_LIBRARY_PATH ݷ иǾ  ִ ǥ 
        ̺귯¿ ռ   ŽǾ  ̺귯
        丮 ̴. ̷ ϸ  ο ̺귯 ϰų
        ǥ ̺귯    Ư 뵵  
        Ұ̴.  ȯ溯 LD_PRELOAD  /etc/ld.so. preloadó
        ǥ Լ鿡 ̵ Լ ִ  Ʈ 
        Ʈ Ÿ.  ̷ ɵ δ /lib/ld-linux.so 
        Ѵ.

         ϴ ٸ   ȯ溯  ִ; ̸
        LD_ Ǵ RTLD_ Ѵ. ̷  κ 
         ̳ Ư  ؼ Ǿ . ̵
        κ  ȭ  ʾ   ڼ ˷ ҽڵ带
        о  ּ 浵 ̴.  ̷ ũ
        ̺귯   ڿ  ϴ  Ư 
        ġ  ʴ´ٸ setuid/setgid  α׷ ־
           ̴.  ׷ GNUδ   ࿡ α׷
        setuid  Ǵ setgid 쿡 ̷ ȯ溯(Ǵ ̿
          ٸ )  ǰų ƴϸ Ҽִ  
        ѵȴ.  δ  α׷ setuid Ǵ setgid
        ϱ α׷  credential  üũѴ;  uid
        euid(effective user ID) ٸų  gid egid(effective group
        ID) ٸ 쿡 δ  α׷ setuid/setgid(Ǵ
        ӹ)̶  ϰ   ũ  
        ϰ ȴ. GNU glibc̺귯 ҽ 带 о
        ̷     ̸ Ư   elf/rtld.c, sysdeps/
        generic/dl-sysdep.c   ٶ. ̰ ϴ  ٴ ࿡
         uid, gid euid, egid ϰ α׷  ȣϸ
        ̷ ȯ溯    ĥ ִٴ ̴. ٸ
        н  ý۵鿡  ̷ Ȳ ٸ  ٷ⵵
           ؼ setuid/setgid  α׷  ȯ溯
        ؼ ߸  ޾Ƽ ʵǴ ̴.

      ̺귯 
         ̺귯    .   gcc
        fPIC÷("position inde- pendent code" ̺귯 
          ʼ) Ͽ Ʈ   Ѵ.   
         ·  ̺귯 Ѵ.

        gcc -shared  -WI, -soname,   your_soname\
         -o   library_name file_list library_list

        (a.o, b.o) ϴ ϳ  
     ̺귯  ϴ   Ʒ . Ͻÿ 
     ̺귯 ʿ  ƴ  ǰǴ  
     (-gɼ) (- wallɼ)   ϶, ׸
     -cɼ Ʈ   Ǹ и -fPIC ɼ  ǰ
     ִ.

     gcc -fPIC -g -c -Wall a.c
     gcc -fPIC -g -c -Wall b.c
     gcc -shared -Wl, -soname, libmystuff.so.1 \
      -o libmystuff.so.1.0.1 a.o b.o -lc

     ̶ ǻ   Ʒ .

     *     ̺귯  ϴ    ̸
     -fomit, -frame, -pointer   Ϸ  ɼ ¥ ʿ
     ܿ    .    ̺귯 
     ̷  ϸ Ŵ   ȴ.

     * -fpic ƴ -fPIC Ͽ ڵ Ѿ Ѵ.(-fpic 
        ū ġȭ ʿҰ  ġ  ڵ带
      .)

      ̺귯 ġ  
         ࿡  ϳ  ̺귯 ٸ 
         ġ   ̴.     
        ̺귯 ǥ   ϳ(  /usr/lib)
        ϰ  ldconfig(8) Ű  .

        ࿡ (/usr/lib 丮   ϰų ؼ)
        ó Ҽ   찡 ִٸ ȯ溯 Ͽ Ҽ
        ִ.  򰡿   ̺귯 ؾѴ.  
        ʿ  real  name  ɺ ũν  soname
        (Ǵ     ʴ   
        Ե  soname ɺ ũ )ϴ ε  ̸ 
               ldconfig ϴ ̴.

        ldconfig -n directory_with_shared_library

          ǥ ̺귯  ռ Ž ̺귯
        丮   LD_LIBRARY_PATH  Ѵ. ࿡
        bash     my_program Եǰ Ҽ ִ.

        LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH my_program

         Ư Լ ̵ Ϸ ̵  Ʈ
           ڿ LD_PRELOAD ؼ Ҽ ִ.  , 
        Ͽ ִ Լ  Լ ̵Ѵ.

        Ϲ ̺귯  ϴµ ־  Ư 
        .  API  ȭѴٸ ̺귯 ڴ  soname
         ̴.   soname 鼭  ŵ Ź
        ̺귯 ϰ  ̺귯 Ϸ, 
        ̺귯 򰡿 ϰ  װ ̸ (̸׸
        ̸.orig)   ̸  ̺귯  
        ȣϿ ϵ 缳ϴ  wrapũƮ ۼϿ
           ϰ Ҽִ. ʻ 
        ̺귯   丮     
        ̺귯   Ư 丮 ġų ִ. wrap
        ũƮ  Ƹ Ʒ  ̴.

        #!/bin/sh
          export LD_LIBRARY_PATH=/usr/local/my_lib:$LD_LIBRARY_PATH
          exec /usr/bin/my_program.orig $*

      α׷ ϴ  ̺귯   ldd(1) Ἥ 
       . ׷,   ls ϴ  ̺귯
          ˼ִ

     ldd /bin/ls
      α׷ ϰ ִ ̺귯 soname ϰ Ե
      丮 ϰ̴.     ׻
     ϰε   Ʒ .

     * /lib/ld-linux.so.N(N 1̻  2).  ̺귯  ٸ
      ̺  Ѵ.

     * libc.so.N(N 6Ǵ ̻).  ̰ C ̺귯̴.  ٸ
     α׷ 鿡(   ̺귯
     ϱؼ) C ̺귯     ִ. ׷ 
     α׷   ̺귯  Ե ̴.

     : ldd ŷҼ  α׷ Ͽ ʵȴ. ̴
     ldd  Ŵ 󿡵  ޵ ̴. ldd   α׷
     ȣν  Ǳ  ġ  ڵ  ü
     ֱ ̴.

     ȣȯ ̺귯
        ο  ̺귯  ̺귯 ڵ
         ȣȯ   ʴ´ٸ soname  ʿ䰡 ִ.
        ڵ忡 ȣȯǴ  쿡   װ  
        ⺻̴.

        1. Լ ൿ Ǿ   Լ(԰)  ̻
             .

        2. ܷ   (:ɼ  
           ̺귯    κп ÷ϴ  ̷
           ۱ ̺귯 ο Ҵ  ִ )

        3. ܷԼ ŵǾ .

        4. ܷԼ ̽ Ǿ .

   ̷ ε  ذٸ    ̺귯
  忡  ȣȯ ̴. ٸ    ڸ 
  α׷   ̽(ABI) ȣȯ ̷  
  ʴ´ٸ   ̴.     ο Լ ߰ϵ
  Լ ʱ Ҽ   ̴.  
  α׷ ̺귯  κп   ߰ϰų, Ǵ (
  α׷  ƴ)̺귯 ̷  Ҵϰų, Ǵ 
  Ư   ɼȭϴ(Ǵ ̺귯   
  äִ) ̷  濡    ȮҶ 
  ̺귯  ̷ ߰ Ҽִ ̴. ڵ
  迭 ϰ ÿ ׷  Ȯ Ƹ Ҽ  ӿ
  ϶.

  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 <http://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() ϵǱ     ǵ ɺ  ذǴ,
        ׷    и ϴ  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 * Ÿ Ϳ ϸ
        Ź ø ĳƮ  ؾ ϹǷ(׸, α׷
        Ϸ   ٸ  鿡   ۿ 
        ̹Ƿ) Ҽ ִٸ ̷  ٶ.

        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 ׻  ϴ  ƴ϶ Ѵ.

  5.  ΰ 

  nm 

  nm ־ ̺귯 ɺ Ѵ. װ  
   ̺귯 ο Ѵ. ־ ̺귯 ǵ ɺ
   ׸ Ÿ ˷ش.    ̺귯  
  ȿϰ  Ǿ ٸ(-lsɼ ) ҽڵ 𿡼 ɺ
  ǵǾ°(̸ γѹ) ˷ش.

  ɺŸٿ ؼ   ʿϴ. Ÿ   ҹڴ
    Ÿ 빮ڴ (ܺ) Ÿ. 
  ɺŸ  T(ڵκп  ),  D(ʱȭ Ÿ κ),
  B(ʱȭ ʵ  ), U(:ɺ ̺귯 ǳ
   ̺귯  ؼ ǵ ), W(ٸ ̺귯  ɺ
  ϸ     ġ(override)) ִ.

  Լ ̸ ˰  Ȯ   ̺귯 ǵǾִ
   ٸ nm  -oɼ( θ ϸ տ  )
  ϰ  ÿ grep Ἥ   ̺귯  ̸  ãƺ
  ٶ. Bourne shell /lib, /usr/lib  ̺귯 /usr/lib,
  /usr/local/lib   丮 "cos" ã  Ʒ 
  ̴.

  ______________________________________________________________________
  nm -o /lib/* /usr/lib/* /usr/lib/*/*
     /usr/local/lib/* 2> /dev/null | grep 'cos$'
  ______________________________________________________________________

   ̻ ڼ  [17]info:binutils#nm ϶ 
  ̺귯 ũ~PlƮϼ ִ.

  GNU δ  ̺귯  ̳ʸ ̿ܿ Ư ũƮ
  ۼ ؽƮϷε ϵ ϰ  ʿ䰡 ִ. ̰
    ٸ ̺귯 ϴµ ϴ.   
  ý  ϳ  /usr/lib/libc.so  Ʒ ִ.

  /*  ̺귯  ϸ    Լ 
  ̺귯̹  װ ʷ ϴ GNU ld script.  */
  GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )     ld
  Ŀ   texinfo   .  Ϲ   info:ld#Options,
  info:ld#Commands, ׸   info:ld#Option Commands 
  ãƺ

  GNU Libtool

  پ ýۿ ̽İ  α׷ ̶  GNU Libtool
  Ͽ ̺귯  ġ   . GNU  Libtool
    ̺귯   ũƮ̴. Libtool  ̺귯 
  ⼺  ϰǰ ̽İ ̽ ؼ   ̴.
  Libtool  Ʈ  ,    ̺귯 ũ,  
  ̳ʸ ũ  , ̺귯 ġ,  ̳ʸ ġ
   ̽    Ѵ. ׾ȿ  libltdl̶ 
  α׷   ̽ļ wrapper  Եȴ.    
  [19]www.gnu.org/software/libtool/manual.html
  <http://www.gnu.org/software/libtool/manual.html>  ãƺ
  ٶ.

  6.   

  Ʒ ʹ (,     ̺귯)   
  ̺  ̴. libhello.c libhello.h   ϴ 
  ̺귯̸, demo_use.c libhello.c ȣϴ 
  α׷̴.   ̰     ̺귯
  Ǵ°   ִ ũƮ (script_static, script_shared)
  ּ  Բ ,       귯     
  ̺귯  Ǵ   ִ  demo_ dyanmic.c
  script_dynamic ִ.

  File libhello.c /* libhello.c - ̺귯 Ǵ  */ #include
  <stdio.h> void hello(void) printf("Hello, library world.");

  ______________________________________________________________________
  File libhello.h
  /* libhello.h -   */

  void hello(void);
  ______________________________________________________________________

  File demo_use.c /* demo_use.c -- ٷ helloƾ ϴ  */
  #include "libhello.h" int main(void) { hello(); return 0; }

  ______________________________________________________________________
  File script_static
  #!/bin/sh
  #  ̺귯 
  #  ̺귯 Ʈ  libhello-static.o.
  # libhello-static̶ ̸ ϴ   ̺귯
  #   ̺귯   ϱ Ѱ ̹
  #  -static̶ ̸ Ʈ ̳  ̺귯
  #  ʿ .
  gcc -Wall -g -c -o libhello-static.o libhello.c
  #  ̺귯 .
  ar rcs libhello-static.a libhello-static.o
  # ⼭ libhello-static.a ߿ ϱ
  #  򰡿    ̴.
  #   ϱ ؼ 츮
  #  丮 ̺귯 α Ѵ.
  # demo_use α׷ 
  gcc -Wall -g -c demo_use.c -o demo_use.o
  # demo_use α׷ ; -L. ɼ "."  α׷
  #  ÿ ˻ǰ Ѵ.    libhello-static.a
  # ִ õ Ʈ  demo_use_static Եȴ.
  gcc -g -o demo_use_static demo_use.o -L. -lhello-static
  # α׷ 
  ./demo_use_static

  ______________________________________________________________________

  ______________________________________________________________________
  File script_shared
  #!/bin/sh
  #  ̺귯 
  #  ̺귯 Ʈ  libhello.o .
  gcc -fPIC -Wall -g -c libhello.c
  #  ̺귯 .
  # -lc Ͽ C ̺귯 ũѴ. ֳϸ
  # libhello C ̺귯 Ǳ ̴.
  gcc -g -shared -Wl,-soname,libhello.so.0 \
     -o libhello.so.0.0 libhello.o -lc
  # ⼭ libhello.so.0.0  丮 ̸׸
  # /usr/local/lib Ͽ ȴ.
  #  ldconfig ̿ ɺ ũ .
  # soname ¾.  Ʒ  ص ϴ.
  # ln -sf libhello.so.0.0 libhello.so.0
  # ⼭ ׳ ldconfig ϵ Ѵ.
  /sbin/ldconfig -n .
  # linker name Ѵ.
  #  ϰ Ϸ ̹ ϴ linker name
  # ִ Ȯغ  ׷ٸ ׳ ־ 
  # ƴ  üũؾѴ.
  ln -sf libhello.so.0 libhello.so
  # demo_use α׷  Ѵ.
  gcc -Wall -g -c demo_use.c -o demo_use.o
  # demo_use α׷ .
  # -L.  "."  α׷ ÿ ˻ǵ
  # Ѵ. "."  α׷ ÿ ˻Ǵ 
  # ƴԿ ϶.
  gcc -g -o demo_use demo_use.o -L. -lhello
  # α׷ . LD_LIBRARY_PATH 
  # Ͽ  ̺귯  ִ°
  # α׷ ˷ ־Ѵ.
  LD_LIBRARY_PATH="." ./demo_use
  ______________________________________________________________________

  File demo_dynamic.c /* demo_dynamic.c --  "hello" routine 
    */

  /* dlfcn.h   ̺귯 ƾ ʿ */ #include
  <dlfcn.h> #include <stdio.h> /* "libhello.h" include ʿ䰡 
  ϶.  ׷ ׿ Ͽ   ݵ ؾѴ; ,
  dlsym()      Ÿ  и 
  Ѵ. */ /* "simple_demo_function" Ÿ Ű ϰ 
  Լ Ÿ Ѵ. */ typedef void (*simple_demo_function)(void);

  int main(void) const char *error; void *module; simple_demo_function
  demo_function; /*  ̺귯  */ module =
  dlopen("libhello.so", RTLD_LAZY); if (!module) fprintf(stderr,
  "Couldn't open libhello.so: %s", dlerror()); exit(1);

  /* ɺ  */ dlerror(); demo_function = dlsym(module, "hello");
  if ((error = dlerror())) fprintf(stderr, "Couldn't find hello: %s",
  error); exit(1);

  /* DL ̺귯 Լ ȣѴ. */ (*demo_function)(); /* 
   ģ  Ȯ Ŭ¡Ѵ. */ dlclose(module); return 0;

  ______________________________________________________________________

  File script_dynamic
  #!/bin/sh
  #  ̺귯 
  # libhello.so friends ̹
  # Ǿ Ѵ. ( dynamic  ).
  # demo_dynamic α׷ Ʈ Ϸ .
  gcc -Wall -g -c demo_dynamic.c
  # demo_use α׷ .
  #  α׷ ϴ Ư ̺귯 α׷
  # ۵ǰ ڰ Ǳ   ʱ  
  # ̺귯 ã  ˻ؾ ϴ ˸ ʿ䰡
  #  ϶.
  # ׷  ̺귯 ϴ ̺귯
  # ϱ ؼ -ldlɼ ݵ ʿϴ.
  gcc -g -o demo_dynamic demo_dynamic.o -ldl
  # α׷ . LD_LIBRARY_PATH  ̿Ͽ
  # α׷   ̺귯 
  # ִ ˷ ־ Ѵ.
  .
  LD_LIBRARY_PATH="." ./demo_dynamic
  ______________________________________________________________________

  7.  ٸ    ҽ

  ̺귯  Ư  ҽ    ִ;

  o  ``The GCC HOWTO'' -Daniel Barlow. Ư   HOWTO  
     귯  ʿ Ϸ ɼǰ  ̺귯 
     ϴ° ؼ ߳ ǰ ִ.   ⼭ ٷ 
      ٷ   ̸    ٷ   
     ⿡ Ұǰ  ִ  ̴.  HOWTO   Linux
     Documentation Project  20] www.linuxdoc.org
     <http://www.linuxdoc.org>  ãƺ  ִ.

  o  Tool  Interface Standards  (TIS) committee(̴   ȸ
      Portable Formats Specification Version 1.1  
     Chapter()̴.)   ``Executable and Linkable Format (ELF)''.
     ̰  ELF ˿  (GNU      )ڼ
       Ѵ. [21]
     tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz
     <ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz> 
      ȴ.  MIT  ٿ    ̴.
     gunzip,  tar Ǭڿ ``hps''   ɰε ù°ٰ
     Ǹ ְ  μⰡ Ʈ ũƮ  
     ̴.

  o  ``ELF: From the Programmer's Perspective'' - Hongjui Lu. 
        GNU gcc-specific ELF    ϸ
       ִ 
     [22]tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz
     <ftp://tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz>̴.

  8.  ۱ǰ ̼

  ۱(C) David A.  Wheeler   GNU General  Public License
  (GPL) Ѵ. ƹ 밡  Ҽ    ׿
   Ͽ Ե ؽƮ α׷   ̿Ҽ ִ.

   α׷  Ʈ̴; Free Software Foundation ؼ
   ǵǴ GNU General Public License ǰϿ  Ǵ  Ҽ
  ִ.   2Ǵ ̻ ̴.    װ ϱ
  ٶ Ǵ    ٴ Ϳ ϶.
  Ư̳     Ͻ    ٴ Ϳ
  ϱ ٶ ̿ ؼ  GNU General Public License 
  ڼ  ٶ.

  GNU General Public License   α׷ ̹   ٵ 
  ׷ ϴٸ Free  Software Foundation,  Inc., 59  Temple Place,
  Suite 330, Boston, MA 02111-1307  USA ϶.

    ٸ Ʈ ̷ Ҽ  ٸ,

  o  ̷ Ʈ  Ʈ ŵǸ ڵ ŵɼ ־ ϸ,

  o   Ʈ ּ(  23]www.dwheeler.com/program-library
     <http://www.dwheeler.com/program-library>) и  ؾ ϸ
     ̿  ؽƮ ũ Ǿ ϸ,

  o  (David A. Wheeler) ڷν  ٱ ־ Ѵ.

       ׸    ׸Ʈ ؼ  ʰ
     ش.    ߸ ̷   1 ģ 
      ʱ Ѵ.  Ʈ ũν ڴ
     ̷ ֽ     ִ.  ſ   ʿ
     ؼ Ϲ ͳݿ  δ  ʴ Ʈ鿡
     ߻Ǵ 鿡 ſ ΰϴ.    ̷ ̶
      ٸ  Ʈ ãƼ   Ŀ Ʈ(sneaknet
     update)϶.

   ̼ ؼ   Ҽ     
    Ű̶    ٰ   .
      ü    ۱ ִ  ƴϴ.
    ۹ ϴ, ۱ ҽǷ Ͽ  Ҽ ִ
  ׷  ۾  ϴ.  Ǿ     ¥
  и ˷ Ѵٴ  ڼ ۱ǹ Ģ 캸 ٶ. 
        (David A. Wheeler) ˷
  սŰ   ̴.

  9.  ּ

  1.  file://localhost/export/sunsite/users/gferg/howto/00Program-
     Library-HOWTO.  html#AEN12

  2.  file://localhost/export/sunsite/users/gferg/howto/00Program-
     Library-HOWTO.  html#AEN25

  3.  file://localhost/export/sunsite/users/gferg/howto/00Program-
     Library-HOWTO.  html#AEN33

  4.  file://localhost/export/sunsite/users/gferg/howto/00Program-
     Library-HOWTO.  html#AEN126

  5.  file://localhost/export/sunsite/users/gferg/howto/00Program-
     Library-HOWTO.  html#AEN168

  6.  file://localhost/export/sunsite/users/gferg/howto/00Program-
     Library-HOWTO.  html#AEN189

  7.  file://localhost/export/sunsite/users/gferg/howto/00Program-
     Library-HOWTO.  html#AEN220

  8.  file://localhost/export/sunsite/users/gferg/howto/00Program-
     Library-HOWTO.  html#AEN233

  9. http://www.gnu.org/software/libtool/libtool.html
     <http://www.gnu.org/software/libtool/libtool.html>

  10.

     developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.ht
     ml <http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-
     of-modules.ht ml>

  11.
     www.dwheeler.com/program-library <http://www.dwheeler.com/program-
     library>

  12.
     www.linuxdoc.org/ <http://www.linuxdoc.org/>

  13.
     info:standards#Directory_Variables

  14.
     www.pathname.com/fhs <http://www.pathname.com/fhs>

  15.

     http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-
     modules.ht ml <http://developer.gnome.org/doc/API/glib/glib-
     dynamic-loading-of-modules.ht ml>

  16.
     www.gnu.org/software/libtool/libtool.html
     <http://www.gnu.org/software/libtool/libtool.html>

  17.
     info:binutils#nm

  18.
     www.gnu.org/software/libtool/libtool.html <
     http://www.gnu.org/software/libtool/libtool.html>

  19.
     www.gnu.org/software/libtool/manual.html
     <http://www.gnu.org/software/libtool/manual.html>
  20.
     www.linuxdoc.org/ <http://www.linuxdoc.org/>

  21.
     tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz
     <ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz>

  22.
     tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz
     <ftp://tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz>

  23.
     www.dwheeler.com/program-library <http://www.dwheeler.com/program-
     library>

