α׷ ̺귯 Ͽ

 - David A. Wheeler
     0.60, 2000 4 27

-  : Ȳ  (jeenee@soback.kornet.net)
    2000 5 

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

  
1. 
2.  ̺귯
3.  ̺귯
4.  ̺귯(Dynamically Loaded Library - DL Library)
5. ΰ 
6.    
7. ٸ    ҽ
8. ۱  ̼



  Ͽ  α׷Ӱ    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]http://developer.gnome.org/doc/API 
/glib/glib-dynamic-loading-of-modules.html   ٶ. ٽ  ѹ 
ϰǵ  ̺귯 뿡    ɵ   
  ̸  ڵ带 ̰ų  ̶ ̹ 
 Ұ̴.  

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

 ̺귯

  ̺귯   Ʈ ȭ ̴.   
 ̺귯 .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)      
 ̴.

 ̺귯

  ̺귯 α׷ ۵   α׷ ؼ Ǵ 
̺귯 Ѵ.   ̺귯 ٸ ٸ Ŀ 
   α׷ ڵ  ο  ̺귯  
. 翡 ־,  Ǵ ٹ Ʒ  ɵ 
ϹǷ  ź̸ , õǰ Ѵ. 
 * ̺귯 ϸ鼭   ̺귯     ̵ 
   ̺귯  ϴ α׷ Ҽ ִ.
 * Ư α׷  ̺귯 Ǵ  ̺귯 ƯԼ 
̵(ġ) ϴ.
 *     ̺귯  ̿Ͽ α׷ ߿ 
.

 

  ̺귯 ̷ ɵ ϱ ؼ  ڰ ݵ 
 ̿  ʿ  ̵ ִ.    ̺귯 
´ ̸  Ư  "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 ϱ  ٶ).  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) ȣȯ ̷   ʴ´ٸ   ̴.  
  ο Լ ߰ϵ Լ ʱ Ҽ 
 ̴.    α׷ ̺귯  κп 
 ߰ϰų, Ǵ ( α׷  ƴ)̺귯 ̷  
Ҵϰų, Ǵ  Ư   ɼȭϴ(Ǵ ̺귯   
 äִ) ̷  濡    ȮҶ  
̺귯  ̷ ߰ Ҽִ ̴. ڵ  迭 
ϰ ÿ ׷  Ȯ Ƹ Ҽ  ӿ ϶.

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

ΰ 

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 ϶

  ̺귯 ũƮϼ ִ.

 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]http://www.gnu.org/software/ 
libtool/manual.html ãƺ ٶ. 

  

 Ʒ ʹ (,     ̺귯)    ̺
 ̴. 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
     _______________________________________________________________
   
ٸ    ҽ

 ̺귯  Ư  ҽ    ִ;
 
 * ``The GCC HOWTO'' -Daniel Barlow. Ư   HOWTO  
귯  ʿ Ϸ ɼǰ  ̺귯  ϴ° 
ؼ ߳ ǰ ִ.   ⼭ ٷ   ٷ  
̸    ٷ    ⿡ Ұǰ  ִ 
̴.  HOWTO   Linux Documentation Project  [20] http://www 
.linuxdoc.org  ãƺ  ִ. 
 * Tool  Interface Standards  (TIS) committee(̴   ȸ    
Portable Formats Specification Version 1.1    Chapter()̴.)  
``Executable and Linkable Format (ELF)''. ̰  ELF ˿  (GNU 
     )ڼ    Ѵ. [21]ftp://tsx-11. 
mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz   ȴ.  MIT
 ٿ    ̴. gunzip,  tar Ǭڿ ``hps'' 
  ɰε ù°ٰ Ǹ ְ  μⰡ Ʈ 
ũƮ   ̴.
 * ``ELF: From the Programmer's Perspective'' - Hongjui Lu.  
  GNU gcc-specific ELF    ϸ   ִ 
 [22]ftp://tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz̴.
     _______________________________________________________________

۱ǰ ̼

 ۱(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 ϶.
  
   ٸ Ʈ ̷ Ҽ  ٸ,    
   
 * ̷ Ʈ  Ʈ ŵǸ ڵ ŵɼ ־ ϸ,
 *  Ʈ ּ(  [23]http://www.dwheeler.com/program-library) и
 ؾ ϸ ̿  ؽƮ ũ Ǿ ϸ,
 * (David A. Wheeler) ڷν  ٱ ־ Ѵ.

   ׸    ׸Ʈ ؼ  ʰ  ش. 
  ߸ ̷   1 ģ    ʱ 
Ѵ.  Ʈ ũν ڴ ̷ ֽ     
ִ.  ſ   ʿ ؼ Ϲ ͳݿ  δ
 ʴ Ʈ鿡 ߻Ǵ 鿡 ſ ΰϴ.    ̷ 
̶  ٸ  Ʈ ãƼ   Ŀ Ʈ(sneaknet 
update)϶.
   
  ̼ ؼ   Ҽ      
 Ű̶    ٰ   .  
  ü    ۱ ִ  ƴϴ.   ۹ 
ϴ, ۱ ҽǷ Ͽ  Ҽ ִ ׷  ۾ 
ϴ.  Ǿ     ¥ и ˷ Ѵٴ  ڼ  
۱ǹ Ģ 캸 ٶ.       
(David A. Wheeler) ˷ սŰ   ̴.
  
ּ

   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
  10. 
http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.ht
ml
  11. http://www.dwheeler.com/program-library
  12. http://www.linuxdoc.org/
  13. info:standards#Directory_Variables
  14. http://www.pathname.com/fhs
  15. 
http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.ht
ml
  16. http://www.gnu.org/software/libtool/libtool.html
  17. info:binutils#nm
  18. http://www.gnu.org/software/libtool/libtool.html
  19. http://www.gnu.org/software/libtool/manual.html
  20. http://www.linuxdoc.org/
  21. ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz
  22. ftp://tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz
  23. http://www.dwheeler.com/program-library

