Program Library HOWTO

David A. Wheeler

{ / MF

        takahiko@hakubi.co.jp
      

version 0.75, 31 October 2000

Revision History                                                       
Revision 0.75-J1                           4 Dec 2000                  

vO}p̂ HOWTO ł́ALinux ŃvOCu쐬Ag
p@_܂Bɂ́AÓICuALCuAI
[h郉CuA܂܂܂B



Table of Contents
1. ͂߂
2. ÓICu
3. LCu
   
    3.1. 񑩂
       
        3.1.1. LCu
        3.1.2. t@CVXezu
       
    3.2. Cu͂ǂ̂悤Ɏg邩
    3.3. ϐ
    3.4. LCu̍쐬
    3.5. LCũCXg[Ǝgp
    3.6. ݊Cu
   
4. IɃ[h (Dynamically Loaded; DL) Cu
   
    4.1. dlopen()
    4.2. dlerror()
    4.3. dlsym()
    4.4. dlclose()
    4.5. DL Cu̗
   
5. G^
   
    5.1. nm R}h
    5.2. ʂȊ֐ _init  _fini
    5.3. LCu̓XNvgł
    5.4. GNU libtool
    5.5. ɒ[ɏȎs\t@C
   
6. ɑ̗
   
    6.1. t@C libhello.c
    6.2. t@C libhello.h
    6.3. t@C demo_use.c
    6.4. t@C script_static
    6.5. t@C script_shared
    6.6. t@C demo_dynamic.c
    6.7. t@C script_dynamic
   
7. ̑̏
8. 쌠ƃCZX

1. ͂߂

vO}̂߂̂ HOWTO ́AGNU c[ZbggpĂ Linux
ŃvOCu쐬Agp@_܂B ``vO
Cu'' Ƃ́APɁAƂŃvOɑgݍ܂邱ƂɂȂRpC
ς݂̃R[h (yуf[^) ܂ރt@ĈƂłBvOCu
́AvOA胂W[A葬ăRpCłA
ȒPɍXVł̂ɂ܂BvOCúAO̃^Cv\
\ÓICuALCuAIɃ[h (dynamically
loaded; DL) Cu\\ɕނ邱Ƃł܂B

́̕AŏɁAÓICu\\vOsOɂ̎
s\vOɑgݍ܂郉Cu\\ɂĘ_܂Bꂩ
ALCu\\vOsɃ[hA̃vO
ԂŋL郉Cu\\ɂĘ_܂BŌɁAIɃ[h
 (dynamically loaded; DL) Cu\\vOs̔Cӂ̎_
Ń[hĎgp邱Ƃ\ȃCu\\ɂĘ_܂B DL 
CúAۂɂ͈قȂ郉Cu`Ƃ킯ł͂܂ (ÓI
CuLCu DL CuƂĎgp邱Ƃ\ł)
B̑ɁAvO} DL Cuǂ̂悤Ɏgp邩Ƃ
_ɂāAႢ܂BHOWTO ́Aɑ̗ẮA
̑̏񌹂ւ̎QƂẮAďI܂B

 HOWTO ͎s\t@CƃCû߂ Executable and
Linking Format (ELF) `\\̂قƂǑSĂ Linux fBXgr
[VŎgpĂ`\\ɂĂ̂ݘ_܂B GNU gcc c[Z
bǵAۂɂ ELF ȊÕCu`Ƃł܂BɁA
Ƃǂ Linux fBXgr[Vł́A a.out `Ȃg
p邱Ƃ\łBȂǍ`͂̑̕ΏۊOł
B

LCuw dynamically linked libraries (DLL) Ƃp
gl邱ƁA DLL Ƃp DL CuƂĎgpC
ӂ̃CuӖ邽߂Ɏgl邱ƁA܂Aǂ炩̏
CuӖ邽߂ DLL Ƃpgl邱ƁAɂ
ӂق悢łB̈ӖグɂĂA HOWTO 
Linux ł̂SĂ DLL ɂăJo[܂B

̃VXeɈڐAAvP[V쐬ĂȂ΁ACu
\zCXg[̂ɁALinux c[𒼐ڎgp 
GNU libtool <http://www.gnu.org/software/libtool/libtool.html> gp
邱Ƃlق悢܂BGNU libtool ́ALCu
gp̕G (Ⴆ΁A쐬CXg[Ȃ) ѐ
|[^uȃC^[tF[XŉBAėpIȃCuT|[gXN
vgłBLinux ł́AGNU libtool ͂ HOWTO ɋLqĂc[
ƊK̏ɍ\zĂ܂BIɃ[h郉Cuւ̃|[^
uȃC^[tF[XpɁAlXȃ|[^reBbp[gp邱
ł܂BGNU libtool ́A ``libltdl'' ƌĂ΂邻̎̃bp[
ł܂B̑IƂẮA̂@œI[fBOT
|[g glib Cu (glibc ƍȂł) gp邱
Ƃł܂Bglib ɂẮA http://developer.gnome.org/doc/API/glib
/glib-dynamic-loading-of-modules.html łɒm邱Ƃł܂Bēx
qׂ܂ALinux ł́A̋@\́A HOWTO ɋLqĂ\
gp邱ƂɂĎĂ܂BȂۂ Linux 
ŃR[hJA̓fobOĂȂ΁A炭Ȃ̂
A HOWTO ̏~邱Ƃł傤B

 HOWTO ̈ꎟzzꏊ http://www.dwheeler.com/program-library 
ALinux Documentation Project (http://www.linuxdoc.org) Ɋ񑡂
Ă܂B쌠 David A. Wheeler ɂ (Copyright (C) 2000)A
General Public License (GPL) ŃCZXĂ܂BȂɂ
Ă͍Ō̏͂ǂłB



2. ÓICu

ÓICúAʏ̃IuWFNgt@C̒PȂŴłBKI
ɁAÓICu ``.a'' Ƃgq܂B̏Ŵ́Aar
(archiver) vOgpč쐬܂BÓICu͈ȑOقǂ
͎gȂȂĂ܂ÁALCûقDĂ邱
Ƃɂ܂ (Ƃŏqׂ܂)Bł܂AÓICu͎X쐬
\\͂߂͗jIȗRő݂Ă̂ł\\Â
ȒPłB

[ÚAR[hăRpCKvȂÓICuvO
ɃN邱ƂłAăRpCɂ鎞Ԃߖł܂B\\
̂荂ȃRpĈƂl΁AăRpCԂ͏dvł
ȂȂĂĂ܂\\̂߂ɂ̗Rt͈ȑOقǗL͂ł͂
BÓICúÅJ҂ACuփN邱Ƃv
O}ɋ͂Cu\[XR[h͓n͂ȂAƂ
ɂ΂Ζɗ܂ (̓Cux_[ɂƂĂ͍Dsł
ÃCugƂĂvO}ɂƂĂ͖炩ɍDs
Ƃ͌܂)B_Iɂ́As\t@CɃNÓI ELF 
CũR[h͎኱ (1-5%) 삷͂łAۂɂ́A
ႲႵv̂߁A̒ʂɂȂ邱Ƃ͋Ĥ悤łB

ÓICu쐬A͊ɑ݂ÓICuɂɃI
uWFNgt@Cǉɂ́Â悤ȃR}hgpĂ
\\

ar rcs my_library.a file1.o file2.o                                    

̃R}hł́AÓICu my_library.a ɃIuWFNgt@C
file1.o  file2.o tĂ܂B܂ my_library.a ݂Ă
΁A쐬܂BÓICu쐬ɊւĂɏ𓾂ɂ́Aar
(1) QƂĂB

xÓICu쐬Ă܂ƁAgȂ邱Ƃł傤B
s\vO쐬ƂɃRpCƃN̈ꕔƂČ
эނƂŁALCugpł܂Bs\t@C쐬
̂ gcc(1) gĂȂ΁ACuw肷̂ -l IvV
gpł܂BڂɂĂ info:gcc QƂĂB
-l  -L IvVgāAJ ld(1) 𒼐ڎgp邱Ƃł܂
BȂAld(1) ̃C^[tF[X gcc(1) ύX₷
̂ŁAقƂǂ̏ꍇ gcc(1) gق悢łB



3. LCu

LCúAvONƂɃ[h郉Cuł
BLCuK؂ɃCXg[ƁǍɋNSĂ
vÓAIɂ̐VLCugƂɂȂ܂B
ۂɂ́Aȏɂ͂邩ɏ_ŐĂ܂BƂ̂́A Linux 
Av[`͎̂Ƃ\ɂ邩ł\\

 E CuXVȂÃCǔÂČ݊̂Ȃ
    o[WgƂvOAˑRƂăT|[gł
   
 E ʂȃvOsƂÃCuA̓Cu
    ̓̊֐łI[o[Chł
   
 E ɑ݂Ă郉CugpăvOĂԂɂA
    ̑SĂȂƂł
   


3.1. 񑩂

̖]܂ׂĂLCuT|[g邽߂ɂ́A
̊KƎwjɏ]Ȃ΂Ȃ܂BCu̖OA ``soname''
 ``real name'' ̈Ⴂɂ (yт炪ǂ̂悤ɑݍp邩
) Kv܂B܂A炪t@CVXêǂ
ꏊɒuׂł邩ɂĂAKv܂B



3.1.1. LCu

SĂ̋LCúA``soname'' ƌĂ΂ʂȖOĂ܂B
soname  ``lib'' ƂvtBbNXACu̖OA``.so'' Ƃ
AsIhƁAC^[tF[XύXƂɂ͕K₳
o[Wԍɑ܂ (ʂȗOƂāAŒ჌x C C
u ``lib'' ł͎n܂܂) BSɋLqꂽ soname ́Ã
Cug܂܂fBNgvtBbNXƂĊ܂ł܂B
ۂ̃VXeł́ASɋLqꂽ soname ́ALCu ``real
name'' ւ̒PȂV{bNNɂȂĂ܂B

SĂ̋LCúA``real name'' \\ۂ̃CuR[h܂
t@C\\Ă܂Breal name ́A soname ɁAsIhA}C
i[ԍAsIhA[XԍÂłBŌ̃s
Ihƃ[Xԍ͂ȂĂ܂܂B}Ci[ԍƃ[Xԍ
Aǂ̃o[W̃CuCXg[Ă邩𐳊mɎA
Ǘ̏ƂȂ܂B̔ԍ́A\\̂悤ɂΕ
Płɂ炸\\hLg̒ŃCu
ɗpĂԍƓł͂ȂȂAƂƂɒӂĂ
B

āACuvɃRpCgp閼OƂ̂܂
(``linker name'' ƌĂڂƎv܂) B́APɁA؂̃o[W
菜 soname łB

LCuǗ錮ƂȂ̂́A̖O̎głBKv
ƂȂ鋤LCüꗗ\ɍ쐬Ƃɂ́AvÓAK
vƂȂ soname XgAbv݂̂Ƃ܂BtɁALCu
쐬Ƃɂ́A(ڍׂȃo[W) ̃t@CŃ
Cu쐬݂̂Ƃ܂BVo[W̃CuCXg
[Ƃɂ́AAO̓ʂȃfBNĝ̈ɂCX
g[Aꂩ ldconfig(8) vOs܂Bldconfig ́A
ɑ݂t@C𒲂ׁAreal name ւ̃V{bNNƂāA
soname 쐬܂BlɂāALbVt@C /etc/ld.so.cache 
ݒ肵܂ (ɐ܂)B

ldconfig  linker name ݒ肵܂BT^Iɂ́A̐ݒ̓Cu
CXg[ɂȂA``ŐV'' soname ͍ŐV realname
ւ̒PȂV{bNNƂāAlinker name 쐬܂BقƂ
ǂ̏ꍇɂāACuXVANɂIɎgp
Ǝvł傤Asoname ւ̃V{bNNƂ linker
name ĂƂ߂܂B́AȂ ldconfig ͎I
linker name ݒ肵Ȃ̂AH. J. Lu ɐq˂܂Bނ̐́A{
Iɂ́AuCu̍ŐVo[WgăR[hsƎv
邩m܂񂪁Ał͂ȂA(炭݊̂Ȃ) ÂCu
ɃNJ]łƂƂ肤̂łvAƂ̂
B̂߁Aldconfig ́AȂǂ̃CuɃvON
̂ƂƂɂẮẢȂ܂Bł̂ŁA
JCuɎĝXV邽߂ɂ́ACXg[V{
bNN𖾊mɕύXȂ΂ȂȂ̂łB

Ⴆ΁A/usr/lib/libreadline.so.3 ͊SɋLqꂽ soname łA
ldconfig  /usr/lib/libreadline.so.3.0 Ƃ悤ȉ炩 real name
ɑ΂V{bNNƂĐݒ肷̂łB /usr/lib/
libreadline.so Ƃ linker name ׂ݂ŁÁA /usr/lib/
libreadline.so.3 QƂV{bNNɂȂ邱Ƃł傤B



3.1.2. t@CVXezu

LCu̓t@CVXêǂɔzuȂ΂Ȃ܂B
قƂǂ̃I[v\[X\tgEFÁAGNU Kɏ]X܂\
\ڍׂ info:standards#Directory_Variables ɂ info t@ChL
gĂB GNU ḰA\[XR[hzzƂAftH
gł͑SẴCu /usr/local/lib ɃCXg[邱Ƃ𐄏
Ă܂ (SẴR}h /usr/local/bin ɓׂƂ߂Ă܂)
B܂ÃftHgI[o[ChACXg[[`
Ăяo肷邽߂̊K͂qׂĂ܂B

t@CVXeKwK (Filesystem Hierarchy Starndard; FHS) ́AfB
Xgr[VɂĉǂɃCXg[ׂ_Ă
܂ (http://www.pathname.com/fhs Ă) B FHS ɏ]΁Aق
ǂ̃Cu /usr/lib ɃCXg[ׂłANɕKv
Ƃ郉Cu /lib ɁAăVXëꕔɂȂĂ͂ȂC
u /usr/local/lib ɃCXg[ׂłB

ۂɂ́A̕Ԃɖ͂܂BGNU ḰA\[XR[
hJ҂̂߂̃ftHg𐄏Ă̂łA FHS ́AfBX
gr[^ (ʏAVXepbP[WǗVXeʂă\[XR[h
̃ftHgIIɃI[o[ChlX) ̂߂̃ftHg𐄏
Ă̂łBۂɂ͂܂@\Ă܂BȂ_E[h
 ``ŐV'' (炭oO炯!) \[XR[h́AIɎ
g ``[J'' fBNg (/usr/local/) ɃCXg[܂B
ăR[hnĂApbP[WǗc[́AfBXgr[V
p̕WIȈʒuɃR[hzu邽߂ɃftHgPɃI[o[
Chł܂BȂ̃CuACuoRłĂяo邱
Ƃ̂ȂvOĂяoĂ̂Ȃ΁ÃvO /usr/
local/libexec (fBXgr[Vł /usr/libexec ɂȂ܂)
ɔzuׂłBԂ𕡎GɂĂ邱ƂāÁA Red
Hat hVXeftHgł /usr/local/lib Cu
ΏۂɊ܂߂ĂȂƂƂłB /etc/ld.so.conf Ɋւ鉺L̋c_
ĂB̕WIȃCuP[VƂẮAX Window
System p /usr/X11R6/lib ܂܂܂B /lib/security  PAM W[
pɎg܂A͒ʏ DL Cu (ƂŐ܂)
Ƃă[hAƂƂɒӂĂB



3.2. Cu͂ǂ̂悤Ɏg邩

GNU glibc x[X̃VXe\\SĂ Linux VXe܂݂܂\\ł́A
ELF oCist@CNƁAIɃvO[_[
hAs܂B Linux VXeł́Ã[_ /lib/
ld-linux.so.X (X ɂ̓o[Wԍ܂) ƂOłB̃[
_́AvOɂĎgp邻̑̑SĂ̋LCuT
oA[h܂B

ΏۂƂȂfBNg̃XǵA/etc/ld.so.conf t@Cɏ
Ă܂BRed Hat hĂfBXgr[V̑́A
 /etc/ld.so.conf t@C /usr/local/lib ܂߂Ă܂B͂
oOƍlĂA܂A/usr/local/lib  /etc/ld.so.conf ɒǉ
邱Ƃ́A Red Hat hĂVXeő̃vO𑖂
邽߂ɕKvƂAʂ ``C'' ƎvĂ܂B

Ců̊֐I[o[ChŁAc͂̂܂
ɂĂȂ΁AI[o[Ch郉Cu (.o t@C) ̖O
 /etc/ld.so.preload ɓ邱Ƃł܂B ``să[h
'' CúAWZbgɐs܂B̐să[ht@
ĆAT^Iɂً͋}p̃pb`ƂĎg܂BfBXgr[V
́AʏAzzۂɂ̂悤ȃt@C܂ނƂ͂Ȃł傤B

vONɂSẴfBNĝ́AƂĂ
IȂ̂ŁAۂɂ̓LbVzug܂B ldconfig(8) vO
ftHg /etc/ld.so.conf t@Cǂݍ݁AK؂ȃV{bN
N𓮓INfBNgɐݒ肵܂ (̂߁AW̊Kɉ
ƂɂȂ܂) BꂩALbV /etc/ld.so.cache \\Ƃő
vOɎg܂\\ɏ݂܂B́ACuւ̃ANZ
Xɑ܂BÖٓIɌ邱Ƃ́ADLL ǉꂽƂ͕K
ÁADLL 폜ꂽA DLL fBNg̃ZbgωƂ
ɂ́Aldconfig sȂ΂ȂȂAƂƂłBldconfig 
śACuCXg[ɃpbP[WǗc[ɂĂȂ
Xebv̈ł邱ƂłBȍ~ANɂ́AI[
_͎ۂ /etc/ld.so.cache t@CgAKvƂ郉Cu[
h܂B



3.3. ϐ

lXȊϐ̏菇𐧌ł܂BȀ菇I[o
[CĥɎgϐ݂܂BႦ΁A̓ȎsA
ꎞIɑ̃Cuőւ邱Ƃł܂B Linux ł́Aϐ
LD_LIBRARY_PATH ́AWIȃfBNgQɐ旧ăCu
ׂfBNgQARŋ؂ĕׂ̂łB́AV
CufobOĂƂAʂȖړÎ߂ɔWIȃC
ugpĂƂɕ֗łBϐ LD_PRELOAD ́AWZbg
I[o[ChIuWFNgt@C֐ƋɁA傤 /etc/
ld.so.preload łȂĂ悤ɁA񋓂܂B̋@\́A/
lib/ld-linux.so [_ɂĂ܂B LD_LIBRARY_PATH ͑
Unix CNȃVXeŋ@\܂ASẴVXeœ킯ł͂
Ƃɒӂ܂傤BႦ΁AHP-UX ł@\pł܂A
 SHLIB_PATH ƂĂłAAIX ł LIBPATH ʂĂƂƂɂȂ
܂B܂ALD_LIBRARY_PATH ͊JeXgɂ͕֗ł͂܂Aʏ
gp̂߂ɃCXg[ɏCׂł͂܂B̗R̐
ɂẮA http://www.visi.com/~barr/ldpath.html  ``Ȃ
LD_LIBRARY_PATH ͂Ȃ̂'' QƂĂB

ۂɂ́A[fBO菇𐧌䂷ϐ͂قɂ񑶍
܂B̖ÓALD_  RTLD_ ł͂܂܂B̂قƂǂ
A[_̒჌xȃfobOAꉻꂽPCpreB
邽߂̂̂łBقƂǂ́A\ɃhLgĂ܂B
ɂĒmKvȂ΁AwKƂ悢@́A\[XR[
hǂނƂłB

ʂȑΏȂȂȂ΁AIɃN郉Cuɑ΂鐧
[UɔF߂ƂƂ́Asetuid/setgid vOɂƂĂ͔ߎS
̂ɂȂł傤B̂߁AGNU [_ł́AvO setuid 
 setgid ĂꍇA̕ϐ (yїގ̕ϐ) ͖
ÁA炪ł邱Ƃ͑啝ɐ܂B[_́AvO
̐MC (credential) 𒲂ׂ邱ƂɂāÃvO setuid
 setgid Ă邩ǂmF܂B uid  euid 
Ȃ邩A gid  egid قȂȂA[_͂̃vO
setuid/setgid Ă (͂̂悤ȃvOsꂽ)
Ɛ肵ANRg[\͂啝ɐ܂B GNU
glibc Cũ\[XR[hǂ߂΁AɂČ邱Ƃł
傤BɁAelf/rtld.c t@C sysdeps/generic/dl-sysdep.c t@C
ĂB́Auid  gid  euid  egid ɓĂv
OĂׂ΂̕ϐSɋ@\AƂƂӖĂ
B̑ Unix CNȃVXéȀ󋵂قȂ@ň܂
AR\\setuid/setgid vO͊ϐQɂĉߓxɉe
󂯂ׂł͂ȂƂR\\ɂ܂B



3.4. LCu̍쐬

LCu̍쐬͊ȒPłB܂͂߂ɁAgcc  -fPIC tO (
́ALCuɕKvƂ ``ʒuƗR[h (position independent
code)'' ̐\ɂ܂) gāALCuɑgݍ܂邱
ƂɂȂIuWFNgt@C쐬܂BꂩǍ`gċ
LCu쐬Ă\\

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

̃IuWFNgt@C (a.o  b.o) 쐬A痼܂ދL
Cu쐬ɋ܂BRpCAfobO
(-g) ܂݁AxbZ[W𐶐 (-Wall) ƂƁ\\͋
LCuɕKvƂ͂܂񂪐܂\\ɂ͒ӂĂ
BRpC (-c g) IuWFNgt@C𐶐AāA
v -fPIC IvV͂Ɗ܂ނƂɂȂ܂B

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                                 

ӂׂƂ܂\\

 E ꂽCu strip ȂłB܂{ɕKvłȂ
    RpCIvV -fomit-frame-pointer gȂł
    BꂽCu͋@\ł傤A̍Ƃ́Afob
    KقƂǎgɂȂȂĂ܂܂B
   
 E R[h𐶐ɂ́A-fpic ł͂ȂA-fPIC gĂ (O
    ͋@\ȂƂ܂BƂ̂́A򂪑K͂Ȕzu]K
    vƂꍇA-fpic ͊SȈʒuƗR[h𐶐ȂȂ
    ł)B
   


3.5. LCũCXg[Ǝgp

xLCu쐬Ă܂ƁACXg[Ȃ邱
ł傤BȒPȕ@́AWIȃfBNg (Ⴆ /usr/lib Ȃ) 
ɁÃCuRs[Aldconfig(8) s邱ƂłB

ꂪłȂȂ (Ⴆ΁AȂ /usr/lib ύX錠
ĂȂȂ)AԂ𐧌䂷邽߂Ɋϐgp邱Ƃł܂
B܂͂߂ɁAǂɋLCu쐬Kvł傤B
ꂩAKvȃV{bNNA soname  real name ւ̃V{
bNN (lɁAo[Wԍ܂w肵Ȃ[Û߂
Ao[Wԍ̂Ȃ soname A܂A``.so'' ŏI soname 
V{bNN) ݒ肷Kvł傤BƂȒPȕ@
ÃR}hCs邱Ƃł\\

 ldconfig -n directory_with_shared_libraries                           

ꂩALD_LIBRARY_PATH \\̏ꏊɋLCǔ
ΏۂƂȂfBNg̃XgRŋ؂́\\ݒ肵܂
Bbash głA̕@ my_program sł܂B

LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH  my_program                         

̑Iꂽ֐I[o[ChȂ΁AI[o[Ch
IuWFNgt@C쐬 LD_PRELOAD ݒ肷邾ŉ\ł
B̃IuWFNgt@C̊֐́AΏۂƂȂĂ֐I[o
[Ch܂B

íASzKvȂCuXVł܂B API ̕ύX
Ȃ΁ACu쐬҂ soname ύXł傤BȂ
A soname ̂܂܂̃Cuɑ΂XVɂāAv
OfĂ܂悤ȂAÂCuǂɃRs[A
̃vO̖OύX邱Ƃɂ (ÂO ``.orig'' t
Ȃ) AIɌÂCuo[WgƂł܂Bgp
郉CuĐݒ肵AۂɎs (OύXꂽ) vO
Ăяo߂̏ ``bp['' XNvg쐬ĂBԍt
̊ḰAfBNgɕ̃o[W݂邱Ƃ\
Ă܂A]݂ȂAÂCuƎ̓ʂȏꏊɒu
Ƃł܂Bbp[XNvǵÂ悤Ȃ̂ɂȂł傤\\

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

ldd(1) g΁AvOɂĎgpĂ鋤LCũ
Xg𒲂ׂ邱Ƃł܂BႦ΁Â悤Ƀ^Cv΁A ls ɂ
ĎgpĂ鋤LCumF邱Ƃł܂\\

  ldd /bin/ls                                                          

ʓIɂ́AvÖˑ soname ̃XgAÕfB
NgƋɓ܂Bۂɂ͑SĂ̏ꍇɂāAȂƂ
ˑvf邱ƂɂȂł傤\\

 E /lib/ld-linux.so.N (N ́A1 ȏBĂ͏ȂƂ 2) B
    ́ȂSẴCu[h邽߂̃CułB
   
 E libc.so.N (N ́A6 ȏ) B C CułB̌
    łAC CugpX܂ (ȂƂ玩g
    ̃Cu邽߂) B̂߁AقƂǂ̃vO͏
    ȂƂ̃Cu͊܂ł܂B
   
Ӂ\\MpłȂvOɑ΂ ldd sĂ͂܂B
ɂẮA ldd(1) ̃}jAŖmɏqׂĂ܂B ldd ́AY
vO𒼐ڌĂяoƂŋ@\Ă܂BMpłȂvO
\ĂȂR[hsĂ܂Ƃ肦܂B



3.6. ݊Cu

Vo[W̃CuÂ̂ƃoCi݊łƂ́A
soname ύXKv܂BC ɂẮACuoCi݊
ł͂ȂȂĂ܂l̊{IȗR܂B

 1. ̎dlɓKȂ悤Ɋ֐̓삪ύXĂ܂
   
 2. GNX|[gf[^ڂύXĂ܂ (O\\\̂
    Cuł̂݃AP[gꍇɌA\̖̂ɔCӂ̍
    ڂǉ͖̂Ȃ)
   
 3. GNX|[gĂ֐폜Ă܂
   
 4. GNX|[gĂ֐̃C^[tF[XύXĂ܂
   
̗RłȂ΁ACuoCi݊ɕۂƂ
܂Bʂ̌ƁA̕ύX΁AApplication Binary
Interface (ABI) ݊ۂƂłAƂƂłBႦ΁AV
֐ǉǂÂ֐폜͂Ȃ܂B\
̖̂ɂ̂݃ACeǉACuɂ̍\̂AP[g
邱Ƃ (AvP[Vɂ͋Ȃ)A̒ǉ̃ACe
IvVɂ (̓Cu𖞂悤ɂ)A
ǂ̑ȂĐύXAÂvOɑ΂ĉe^Ȃ
ƂmFłꍇɂ̂݁AACeǉ邱Ƃł܂BCt
ĂB[U\̂zŎgĂȂ΁A̍\̂
gł܂B

C++ (сARpCςݑg݃ev[g^̓RpCς݂
fBXpb`郁\bhT|[g邻̑̌) ł́A󋵂͂
GɂȂ܂BL̖_SĂKpAɑ̖肪
܂BŔA̏񂪃RpCꂽR[h ``BꂽԂ
'' ĂƂƂɂ̂łÂƂA C++ ʓI
ǂ̂悤ɎĂ邩mȂlɂ͂悭Ȃ悤Ȉˑ
NĂ܂̂łBmɌ΁A ``V'' ł
܂BPɁARpCς݂ C++ ̃R[hAȂ邱
ɂȂ邩Ȃ@ł̖NƂƂȂ̂łB
̂̂́AoCi݊ێ邽߂ C++ łĂ͂Ȃڂ̃
Xg (炭sSł) łA Troll Tech eNjJ FAQ <http://
www.trolltech.com/developer/faq/tech.html#bincomp> ɂ񍐂Ă
̂łB

 1. o֐Ď̂ǉ (ÂoCi̎Ă
    ôSł͂Ȃꍇ)BƂ̂́ARpC SuperClass::
    virtualFunction() ďoRpCɕ]邩ł (N
    ł͂܂)B
   
 2. zo֐ǉ܂͍폜BƂ̂́A̍Ƃ͑STuN
    X̉z֐e[ũTCYƔzuύX邾낤łB
   
 3. CCo֐oRŃANZXꂤf[^õ^Cv
    XA܂͂ړ肷B
   
 4. NXKwύXBA[t (󒍁FʃNXȂN
    X) ̐VKǉB
   
 5. private f[^oǉ܂͍폜BƂ̂́A̍Ƃ͑S
    TuNX̃TCYƔzuύX邾낤łB
   
 6. public  protected o֐CC֐łȂꍇɁA
    폜B
   
 7. public  protected o֐CCB
   
 8. CC֐ȂĂƂύXBAÂo[W
    삵ĂꍇB
   
 9. |[^uȃvÕo֐̃ANZX (Ȃ킿A public,
    protected ܂ private) ύXBƂ̂́AANZX֐
    ɉł܂RpC݂邩łB
   
C++ CůJ҂́A̒炵XgɂāAoCi
ȂƂɂȂĂ܂܂̍XVƈȏ̂ƂɍlȂ
΂Ȃ܂BKɂāAUnix CNȃVXe (Linux ܂݂܂) 
͈̃Cũ̕o[W𓯎Ƀ[h邱Ƃł̂
AfBXNXy[XƂɂ͂Ȃ܂A[U͌ÂCuK
vƂ ``Â'' vǑs邱Ƃ\ł͂܂B



4. IɃ[h (Dynamically Loaded; DL) Cu

IɃ[h (dynamically loaded; DL) CúAvO
NȊÔƂɃ[h郉CułB̓vOC⃂W
[̂ɓɖɗ܂BƂ̂́AvOCKvɂȂ
܂ŁA[ĥ҂Ƃł邩łBႦ΁A Pluggable
Authentication Modules (PAM) VXéAǗ҂F؂̐ݒĐݒ
Ȃ悤ɂ邽߁A DL CugpĂ܂B܂AŜ~
߂邱ƂȂAグړIŁA̎XŃR[h}VR[hɃR
pCÃRpĈ̂gpƂC^v^
̂ɂɗ܂B̕@́AWXgC^CRpCA}`
[U_W (multi-user dungeon; MUD) ̎ɂɗ܂B

Linux ł́Aۂ̂ƂADL Cu͌`Ƃ_ɂĂ͓ʂł
܂B́AWIȃIuWFNgt@CA͍܂łɏq
ׂ悤ȕWIȋLCuƂč\zĂ܂BȈႢ́A
CuAvÕNNɎIɂ̓[hȂA
_łB̑ACuI[vAV{AG
[ACuAƂ API ݂͑܂B API g
߂ɂ́A C [U̓wb_t@C <dlfcn.h> CN[hKv
܂B

Linux ɂĎgpC^[tF[X͖{I Solaris ̂̂Ɠ
ŁA ``dlopen()'' API ƌĂڂƂĂ̂łBȂA
̓C^[tF[X͑SẴvbgtH[ŃT|[gĂ
ł͂܂BHP-UX  shl_load() ƂقȂ@\p܂A
Windows vbgtH[͊SɈقȂC^[tF[X DLL gp
BȂ̍ŏIڕWL͂ȃ|[^reBȂ΁A炭Avbgt
H[Ԃ̍BbsOCu̎gplق悢ł
B̃Av[`́AW[̓I[fBOT|[g glib
CułB́AvbgtH[œyƂȂĂ铮I[fB
Op[`gA̋@\ւ̃|[^uȃC^[tF[X
܂Bglib ɂẮA http://developer.gnome.org/doc/API/glib/
glib-dynamic-loading-of-modules.html QƂĂB glib ̃C^
[tF[X͂̃hLg̒ŏ\ɐĂ̂ŁAł͂
ȏ͏qׂ܂B̃Av[`́Alibltdl gƂłB
́A GNU libtool <http://www.gnu.org/software/libtool/libtool.html>
̈ꕔłBƑ̋@\]ނȂ΁A CORBA Object Request Broker
(ORB) 𒲂ׂĂ݂̂悢ł傤B Linux  Solaris ŃT|[g
C^[tF[X𒼐ڎgƂɈˑRƂċȂ΁Aǂݐi
łB



4.1. dlopen()

dlopen(3) ֐́ACuI[vAgp邽߂̏܂B
C ł́Ãvg^Cv͎̂悤ɂȂ܂\\

  void * dlopen(const char *filename, int flag);                       

t@C ``/'' ł͂܂Ȃ (܂΃pXȂ) A dlopen()
̓Cu܂BłȂȂ΁Adlopen() ͎̏ŃC
u܂\\

 1. [U LD_LIBRARY_PATH ϐ̃Rŋ؂ꂽfBNg
    Xg
   
 2. /etc/ld.so.cache Ɏw肳ꂽCuXg
   
 3. /usr/lib,  /lib
   
dlopen() ł́Aflag ̒ĺARTLD_LAZY \\``ICũR[h
sƂɁA`V{'' ƂӖł\\A
ARTLD_NOW \\``dlopen() ^[OɑSĂ̖`V{
AꂪłȂ悤ȂΎs'' ƂӖł\\Âǂ炩
łȂ΂܂BRTLD_GLOBAL ́A flag ̂ǂ炩̒lƔCӂɘ_
âŁAăCu[h邱Ƃɂ胉Cu
Œ`ĂOV{𓾂AƂƂӖĂ܂Bf
obÓA炭 RTLD_NOW gȂł傤BRTLD_LAZY g
ƁAȂQƂƂɕsȃG[܂B
RTLD_NOW gƁACũI[vɂ͎኱Ԃ悤ɂ
܂ (Â̂̌Xs[h͑Ȃ܂) B̂Ƃ[
UC^[tF[X̖ɂȂ悤łAƂ RTLD_LAZY ɂ邱
Ƃł܂B

Cu݂ɈˑĂ悤Ȃ (Ⴆ΁AX  Y ɈˑĂ
) AˑĂقɃ[hĂ (̗Ō΁AY 
Ƀ[hAꂩ X [h܂) B

dlopen() ̖߂ĺA DL Cu[`Ŏgp ``nh
'' \\͉̎̂B؂̂ƍlĂ\\łB[h̎
݂ȂꍇAdlopen()  NULL Ԃ܂̂ŁA̒l`FbN
Kv܂BCu dlopen() œȏネ[hƁA
t@CnhԂ܂B

Cu _init ƂÕ[`GNX|[gĂ΁A
̃R[h dlopen() ߂OɎs܂BȂ̃CułA
[`邽߂ɂgƂł܂Bڍׂ Section
5.2 QƂĂB



4.2. dlerror()

dlerror() Ăׂ΁AG[񍐂ł܂Bdlerror() ́A dlopen(),
dlsym()  dlclose() ̍Ō̌ďoɂG[ɂċLqĂ
镶Ԃ܂BςĂ̂́Adlerror() ĂяoƁAȍ~
 dlerror() ̌ďóAق̃G[܂ NULL ԂƂ_
łB



4.3. dlsym()

DL CugȂ΁A[hĂӖ܂B DL 
Cug߂̎ƂȂ郋[`́Adlsym(3) łB́A^
 (I[vς݂) CuɂV{̒l̂łB
̊֐͎̂悤ɒ`܂\\

 void * dlsym(void *handle, char *symbol);                             

handle  dlopen ŕԂꂽlŁAsymbol ̓kŏI[ꂽ
B\Ȃ΁Adlsym() ̌ʂ void* |C^Ɋi[Ȃł
BƂ̂́A𗘗p邽тɃLXgȂ΂ȂȂ邩
ł (vOeiX悤ƂĂlɁA菭Ȃ
^ȂƂɂȂ܂) B

dlsym() ́AV{Ȃ NULL ƂʂԂ܂BV
{ NULL ̓[ƂlƂ邱Ƃ͂肦ȂƕĂ
Aō\܂BAłȂꍇ͐ݓIɞBc܂B
 NULL 󂯎ꍇÁAȃV{݂͑ȂƂ
ƂӖ̂ł傤A͂̃V{̒l NULL ł邱
Ӗ̂ł傤? WIȉ𓚂́Adlerror() ͂߂ɌĂ (
Ă邩ȂG[NA邽߂ł)AꂩV{
v邽߂ dlsym() ĂсAG[Ă邩ǂ𒲂ׂ邽
ɍēx dlerror() ĂяoƂłBR[h̒fЂ͎̂悤ɂȂł
\\

 dlerror(); /* G[NA */                                   
 s = (actual_type) dlsym(handle, symbol_being_searched_for);           
 if ((err = dlerror()) != NULL) {                                      
  /* nhG[BV{Ȃ */                   
 } else {                                                              
  /* V{B̒l s Ɋi[Ă */              
 }                                                                     



4.4. dlclose()

dlopen() ̋t dlclose() ŁA DL CuN[Y܂B dl
Cu͓Iȃt@Cnhւ̃NǗĂ̂ŁA
ICuɑ΂āAdlopen 񐔂Ɠ dlclose Ă
ȂAYCu͎ۂɂ̓ォ폜܂B̂
߁AvOCu񃍁[hĂAɂ͂Ȃ܂
BCůĂꍇ́A(݂Ȃ) _fini
֐Ă΂܂Bڍׂ Section 5.2 QƂĂB



4.5. DL Cu̗

dlopen(3)  man y[W̗ɍڂ܂B̗́AwCu
[hA2.0 ̃RTCo͂A܂ASẴXebvŃG[`
FbNĂ܂ (Ă܂) \\

     #include                                                          
    #include                                                           
                                                                       
    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);                                               
    }                                                                  

̃vO "foo.c" ƂÕt@CƂƁÃR}h
vO쐬邱Ƃł܂B

    gcc -Wl,export-dynamic -o foo foo.c -ldl                           

``-Wl,export-dynamic'' IvV͎ۂɂ͕Kv܂񂪁AXɗ
Ƃ܂Bld(1) Ŏ̂悤ɖLĂ܂\\``ELF t@C
쐬ĂƂÃIvVASẴV{𓮓IV{e[
uɉ܂BʏAIV{e[u͓IIuWFNgɂĎg
V{܂ł܂B̃IvV dlopen ̎gp̂
ɕKvƂȂ܂'' Linux VXeōƂĂȂ΁A
``-Wl,export-dynamic'' ̂ ``-rdynamic'' g邯ǂAELF
hLgɂ΁A Linux VXe gcc ł ``-rdynamic'' t
O͕K@\ȂAƂƂɂ͒ӂĂĂB



5. G^

5.1. nm R}h

nm(1) R}h́A^ꂽCũV{̃Xg񍐂܂
BÓICuALCûǂɑ΂Ă@\܂B nm(1) 
^ꂽCuŒ`ĂV{AV{̒lAV{
̃^Cv\܂B܂ÃCuɏ񂪑݂Ȃ (-l
IvVĂ) AV{\[XR[ĥǂ (t@C
ƍsԍ) `Ă邩ƂƂł܂B

V{^CvɂĂ͂KvłB^Cv͈ꕶŕ\
܂B͂̃V{[Jł邱ƂӖA啶͂
V{O[o (O) ł邱ƂӖ܂BT^IȃV{
^Cv͎̂̂܂݂܂\\ T (R[hZNV̕ʂ̒`) D (
ꂽf[^ZNV) B (ĂȂf[^ZNV) U
(`BV{̓CuɂĎgĂ邪ACuł͒
`ĂȂ) W (weak. ̃CũV{`Ă
ꍇA̒`I[o[Ch)

֐̖O͊oĂ邯ǂAꂪǂ̃CuŒ`Ă邩
mɂ͎voȂꍇACu邽߁Anm  ``-o'' Iv
V (eC̃t@C̑Oɒu܂)  grep 𑱂ĎgƂ
ł܂B Bourne VFł΁A/lib, /usr/lib, /usr/lib ̒̃Tu
fBNgA /usr/local/lib ̑SCuΏۂɂ
``cos'' ɂ́Â悤ɂ܂\\

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

nm ɊւƑ̏́A info:binutils#nm Ƀ[JɃCXg[
Ă nm  ``info'' hLgœ܂B



5.2. ʂȊ֐ _init  _fini

̓ʂȊ֐ _init  _fini ́AW[̏ƏIx
܂BCuŊ֐ ``_init'' GNX|[gĂ
ÃCũI[v dlopen() Ă΂邽сÅ֐Ă
o܂B C ̃vOł́A_init ƂO̊֐`邱Ƃ
Ӗ܂BɑΉ _fini ƌĂ΂֐݂ÁANC
AgCủ dlclose() ĂԂтɁAĂяo܂ (
ĉ܂) B̊֐ C vg^Cv͎̂悤ɂȂĂ
B

  void _init(void);                                                    
  void _fini(void);                                                    

Gcc Ńt@C ``.o'' t@CւƃRpCƂ́AYꂸ
``-nostartfiles'' IvVtĂB̃IvV́AC R
pC .so t@Cɑ΂ăVXeX^[gAbvCuN
Ȃ悤ɂ܂B̃IvVtȂƁA``multiple-definition''
(d`) G[ɂȂĂ܂܂B _init  _fini Ɋւc_
邱ƂĂĂꂽƁAт̍쐬`ĂꂽƂɑ΂
A Jim Mischel  Tim Gentry Ɋӂ܂B



5.3. LCu̓XNvgł

ʏ̃Cu`̑ɁAȃXNvggĂeLX
gt@CLCuƂ GNU [_F߂邱Ƃ́Aڂɒl
B́ÃCuԐړIɌ̂ɖ𗧂܂BႦ΁A
̎̃VXe /usr/lib/libc.so XeBO
͎̂悤ɂȂ܂B

/* GNU ld XNvg                                                   
   LCugA̊֐͐ÓICuɂ        
   ݂ȂB̂߁AԖڂɎ݂B */                           
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )                     

Ɋւڂ́Ald JXNvg (ld R}h) 
Ă texinfo hLgQƂĂBʓIȏ́Ainfo:
ld#Options  info:ld#Commands ɂA悭gR}h info:ld#
Option Commands ŐĂ܂B



5.4. GNU libtool

̃VXeɈڐAAvP[V쐬ĂȂ΁ACu
\zCXg[̂ɁA GNU libtool <http://www.gnu.org/
software/libtool/libtool.html> gp邱Ƃlق悢
܂B GNU libtool ́AėpIȃCuT|[gXNvgłB
Libtool ́ALCugp̕Gѐ̂|[^uȃC^
[tF[XŉB܂BLibtool ́AIuWFNg쐬ACũN
(ÓIыL) As\t@C̃NAs\t@C̃fobO
ACũCXg[As\t@C̃CXg[Aɂă|
[^uȃC^[tF[X񋟂܂B܂AvO𓮓IɃ[h
邽߂̃|[^reBbp[ł libltdl ܂ł܂Bڍ
ȏ́A http://www.gnu.org/software/libtool/manual.html QƂĂ
B



5.5. ɒ[ɏȎs\t@C

u{ɏ Linux p ELF s\t@C쐬ɊւQ`
[gAv <http://www.muppetlabs.com/~breadbox/software/tiny/
teensy.html> ƂA悢QlƂȂł傤B́A{ɏ
s\vO쐬@ɂĘ_Ă܂BɌ΁A
ʓIȊł́ÃgbN̂قƂǂ͎gׂł͂܂񂪁A
́AELF ۂɂǂ̂悤ɋ@\邩ĂƂ_ɂ
Aɂ߂ėLvłB



6. ɑ̗

LɁASO̃Av[` (ÓIALAѓIɃ[h郉Cu
) ̗ɋ܂Bt@C libhello.c ͕}ȃCuŁA
wb_t@CƂ libhello.h ܂Bt@C demo_use.c ́A
̃Cu̕}ȌďołBÓICu⓮ICuƂē
YCug@߁ARgt̃XNvg
(script_static  script_dynamic) Ƃɑ܂B
demo_dynamic.c  script_dynamic Ƃɑ܂B͋LCu
𓮓IɃ[h郉CuƂĎg@܂B



6.1. t@C libhello.c

/* libhello.c - Cugp̎ */                                
                                                                       
#include                                                               
                                                                       
void hello(void) {                                                     
  printf("Hello, library world.\n");                                   
}                                                                      



6.2. t@C libhello.h

/* libhello.h - Cugp̎ */                                
                                                                       
                                                                       
void hello(void);                                                      



6.3. t@C demo_use.c

/* demo_use.c -- "hello" [`𒼐ڎgp */                 
                                                                       
#include "libhello.h"                                                  
                                                                       
int main(void) {                                                       
 hello();                                                              
 return 0;                                                             
}                                                                      



6.4. t@C script_static

#!/bin/sh                                                              
# ÓICu̎                                                 
                                                                       
# ÓICũIuWFNg libhello-static.o 쐬܂B        
# ÓICuƓICu̗𖾊mɋʂ邽߁A             
# libhello-static ƂOgpĂ܂BAȂ         
# IuWFNgt@CÓICu̖O "-static" g        
# Kv͂܂B                                                   
                                                                       
gcc -Wall -g -c -o libhello-static.o libhello.c                        
                                                                       
# ÓICu쐬܂B                                         
                                                                       
ar rcs libhello-static.a libhello-static.o                             
                                                                       
# ŁAlibhello-static.a g߂ɂǂ̏ꏊ         
# PɃRs[邱Ƃł܂BfړIȂ̂ŁACu         
# JgfBNgɂƂǂ߂Ă܂B                           
                                                                       
# demo_use vORpC܂B                              
                                                                       
gcc -Wall -g -c demo_use.c -o demo_use.o                               
                                                                       
# demo_use vO쐬܂B-L. ɂAvO쐬      
# "." 邱ƂɂȂ܂B̃R}h́Alibhello-static.a    
# ̊֌WIuWFNg demo_use_static ɑgݍނƂ      
# ɒӂĂB                                                 
                                                                       
gcc -g -o demo_use_static demo_use.o -L. -lhello-static                
                                                                       
# vOs܂B                                             
                                                                       
./demo_use_static                                                      



6.5. t@C script_shared

#!/bin/sh                                                               
# LCu̎                                                  
                                                                        
# LCũIuWFNgt@C libhello.o 쐬܂B        
                                                                        
gcc -fPIC -Wall -g -c libhello.c                                        
                                                                        
# LCu쐬܂B                                          
# libhello  C CuɈˑĂ̂ŁAC Cu            
# N邽߂ -lc IvVg܂B                         
                                                                        
gcc -g -shared -Wl,-soname,libhello.so.0 \                              
    -o libhello.so.0.0 libhello.o -lc                                   
                                                                        
# ŁAlibhello.so.0.0 ǂ̃fBNgA/usr/local/lib        
# ȂǁAɒPɃRs[ł܂B                                          
                                                                        
# V{bNNC邽߁Aldconfig ĂяoKv܂B 
                                                                        
# soname ݒ肵܂BPɁA                                           
#                                                                       
#   ln -sf libhello.so.0.0 libhello.so.0                                
#                                                                       
# s邾ł悢łAldconfig ɂĂ炢܂傤B       
                                                                        
/sbin/ldconfig -n .                                                     
                                                                        
# linker name ݒ肵܂B                                            
# ꂽݒȂȂA linker name ݂邩     
# mFA݂΁AcĂׂۂ𒲂ׂ܂B        
                                                                        
ln -sf libhello.so.0 libhello.so                                        
                                                                        
# demo_use vORpC܂B                               
                                                                        
gcc -Wall -g -c demo_use.c -o demo_use.o                                
                                                                        
# demo_use vO쐬܂B-L. ɂAvO쐬       
# "." 邱ƂɂȂ܂B́AvOs "."        
# 邱ƂӖ 'Ȃ' ƂƂɒӂĂB        
                                                                        
gcc -g -o demo_use demo_use.o -L. -lhello                               
                                                                        
# vOs܂BLD_LIBRARY_PATH gāAǂɋL          
# Cu݂邩vOɋKv邱Ƃɒ          
# ӂĂB                                                      
                                                                        
LD_LIBRARY_PATH="." ./demo_use                                          



6.6. t@C demo_dynamic.c

/* demo_dynamic.c -- I[fBO "hello" [`gp̎ */  
                                                                       
                                                                       
/* IɃCu[h郋[`p dlfcn.h Kv */          
#include                                                               
                                                                       
#include                                                               
                                                                       
/* "libhello.h" CN[hKvȂƂ                     
   ӂĂBȂA֘Â                      
   w肷Kv͂܂Bdlsym() 瓾悤Ƃ                    
   lێ^Cvw肷Kv܂B*/                  
                                                                       
/* "simple_demo_function" ^Cv́AƂ炸A                     
   lԂȂ֐Ă܂B */                             
                                                                       
typedef void (*simple_demo_function)(void);                            
                                                                       
                                                                       
int main(void) {                                                       
 const char *error;                                                    
 void *module;                                                         
 simple_demo_function demo_function;                                   
                                                                       
 /* IɃ[h郉Cu[h */                        
 module = dlopen("libhello.so", RTLD_LAZY);                            
 if (!module) {                                                        
   fprintf(stderr, "Couldn't open libhello.so: %s\n",                  
           dlerror());                                                 
   exit(1);                                                            
 }                                                                     
                                                                       
 /* V{𓾂 */                                                  
 dlerror();                                                            
 demo_function = dlsym(module, "hello");                               
 if ((error = dlerror())) {                                            
   fprintf(stderr, "Couldn't find hello: %s\n", error);                
   exit(1);                                                            
 }                                                                     
                                                                       
 /* DL Ců֐Ăяo */                                 
 (*demo_function)();                                                   
                                                                       
 /* SĂÎŁAꂢɕЕt */                      
 dlclose(module);                                                      
 return 0;                                                             
}                                                                      



6.7. t@C script_dynamic

#!/bin/sh                                                              
# IɃ[h郉Cu̎                                   
                                                                       
# libhello.so Ƃ̒Ԃɍ쐬Ă̂Ƃ܂               
# (LCu̗Ă)B                                 
                                                                       
# demo_dynamic vOt@CIuWFNgt@C              
# RpC܂B                                                   
                                                                       
gcc -Wall -g -c demo_dynamic.c                                         
                                                                       
# demo_use vO쐬܂B                                    
# ̃vOgpB̓ʂȃCúAvO         
# N܂Ń[hȂ̂ŁADL CuǂɒTɂ          
# ΂悢KvȂƂɒڂĂB         
# ADL Cu[h郉Cu܂߂邽߁A-ldl          
# IvV 'Kv' ƂȂ܂B                                     
                                                                       
gcc -g -o demo_dynamic demo_dynamic.o -ldl                             
                                                                       
# vOs܂BLD_LIBRARY_PATH gAIɃ[h         
# 郉Cuǂœ邩Kv܂B           
                                                                       
LD_LIBRARY_PATH="." ./demo_dynamic                                     



7. ̑̏

L̂̂́ACuɊւēɖɗ܂ł܂B

 E Daniel Barlow ɂ ``The GCC HOWTO''. ɂ HOWTO ́ACu
    쐬p̃IvVƁAǂ̂悤ɃCuɖ₢킹邩
    Ę_Ă܂Bł͎グĂȂĂ܂A
    t̂Ƃ܂B HOWTO ́A http://www.linuxdoc.org 
    Linux Documentation Project ł܂ (󒍁F``The GCC
    HOWTO'' ̓{ http://www.linux.or.jp/JF/JFdocs/
    GCC-HOWTO.html ł)B
   
 E The Tool Interface Standards (TIS) ψɂ ``Executable and
    Linkable Format (ELF)'' (ۂɂ͂́Aψɂ the
    Portable Formats Specification Version 1.1 ̈̏͂ł). 
    ́AELF ` (Linux  GNU gcc ɓ̂ł͂܂) yсA
    ̌`Ɋւʂ̏ڍ׏񋟂̂łB ftp://
    tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz Ă
    B MIT t@C擾ȂÃtH[}bgʓIł͂Ȃ
    ƂɒӂĂB gunzip  untar sƁA``hps'' t@
    Cł܂Bt@C̍ŏƍŌ̍s폜A``ps'' t@C
    OύX΁Aʂ̃t@C󎚉\ Postscript t@
    C𓾂܂B
   
 E Hongjui Lu ɂ ``ELF: From the Programmer's Perspective''. 
    ́AELF Ɋւ Linux  GNU gcc ɓ񋟂܂B ftp:
    //tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz Ŏ擾ł܂B
   
 E (҂ɂǉ) 앐rɂ ``Linux C Library (libc) ɂ
    ''. Linux C Library (libc) ̊TvɂāA̖ƗjȂǂ
    Pɂ܂Ƃ߂̂łB http://www.linux.or.jp/JF/JFdocs/
    libc-intro.html ŎQƂł܂B
   


8. 쌠ƃCZX

̒̕쌠 David A. Wheeler ɂ (Copyright (C) 2000)A GNU
ʌLgp (GPL) ɂی삳܂B㉿ȂōĔzzĂ\
B̌ ``vO'' Ɖ߂ȀĂB

   
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of the
    License, or (at your option) any later version.
   
    {vO̓t[E\tgEFAłBȂ́AFree Software
    Foundation \ GNU ʌLgṕuo[W 2v
    ȍ~̊eo[W̒炢ꂩIÃo[W
    ߂ɏ]Ė{vOĔЕz܂͕ύX邱Ƃł܂B
   
    This program is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.
   
    {vO͗LpƂ͎v܂AЕzɂẮAsꐫyѓ
    ړIKɂĂ̈Öق̕ۏ؂܂߂āAȂۏ؂sȂ܂
    BڍׂɂĂ GNU ʌLgpǂ݂B
   
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
    USA
   
    Ȃ́A{vOƈꏏ GNU ʌLgp̎ʂ󂯎
    Ă͂łBłȂꍇ́AFree Software Foundation, Inc.,
    59 Temple Place, Suite 330, Boston, MA 0211-1307, USA ֎莆
    ĂB
   
̏́ÃEFuTCg~[O邱Ƃ
łA

 E Ȃ̃~[TCg}X^[TCgŐVIɎ擾
    悤ɂA
   
 E }X^[TCgւ̃nCp[NƋɃ}X^[TCg̃P[V 
    http://www.dwheeler.com/program-library 𖾎A
   
 E ҂ƂāA (David A. Wheeler) Ɏӎ肢܂B
   
͂߂̓́AɁAߋ̃oOɂČJԂb𕷂邱
Ƃh܂BPɂȂK؂Ƀ~[OĂȂƂ
̂߂ɁA͈NOɒoOɊւb𕷂͂܂B}X
^[TCgփN𒣂邱ƂɂA[U͂Ȃ̃TCgŐV̂
ł邩ǂmFł܂BɌZLeBvA
߂ɃC^[lbg֒ʏɐڑ郊XN邱ƂłȂTCg
ɑ΂āA͕qłB̂ƂȂ̏󋵂ɂĂ͂܂Ȃ΁A
ȂƂÃ|Cgւ̐ڑ݂A܂Ȃ̊ւ̃Xj[
J[lbgEAbvf[g (󒍁FXj[J[lbg (sneakernet) \\ FD
^т邱ƂɂLlbg[N) ݂Ȃǂ
B

̃CZXɂ΁AȂ̓hLgύXĂ\܂񂪁A
Ȃ̂ł͂Ȃ̂Ȃ̂̂łƎ咣 (܂
pł) AύXꂽo[Wł邩̂悤Ȃӂ邱Ƃ
ł܂B앨̕ύX́A앨Ŝ̒쌠Ȃɏn̂
͂܂B́A쌠@̗płƂ ``public domain'' 
앨ł͂܂BCZXڍׂɌĂBɁA ``You must
cause the modified files to carry prominent notices stating that you
changed the files and the date of any change.'' \\``t@CύX
|Ƃ̕ύXƂAύXt@Cɖmɕ\邱'' Ƃ
Ƃɂ͒ӂĂBCZXǂ̂悤ȂƂĂ邩ɂ
Ď₪ꍇ́AɘAĂBĂ̏ꍇɂ́A
Ȃ̕ύX݂̂Ȃ̕ύXƋɃ}X^[Rs[֓悤A
Ȃ̕ύX𓝍 (݂ David A. Wheeler) ֑̂悢ł傤B

