Program Library HOWTO

David A. Wheeler

      dwheeler(a)dwheeler.com
    

MF - {

      takahiko(a)hakubi.co.jp
    

{F2004 N 9  17  (F2003 N 4  28 Ao[W
1.20)

 HOWTO ̓vO}łALinux ɂvOCu
쐬@Ǝgp@̂łBuÓICu (static library)
vAuLCu (shared library)vAuICu (dynamically
loaded library)vΏۂƂ܂B (󒍁F̖󕶂ł́Audynamically
loaded libraryv̂ƂuICuvƌĂԂƂɂ܂B̒
́Ashared library ̂ƂwēICuƕ\܂
AƂ͈قȂ܂̂ŒӂĂB)

 

Table of Contents
1. ͂߂
2. ÓICu
3. LCu
   
    3.1. 񑩂
    3.2. Cu͂ǂ̂悤Ɏg邩
    3.3. ϐ
    3.4. LCu̍쐬
    3.5. LCũCXg[Ǝgp
    3.6. ݊̂ȂCu
   
4. ICu
   
    4.1. dlopen()
    4.2. dlerror()
    4.3. dlsym()
    4.4. dlclose()
    4.5. ICu̗
   
5. G^
   
    5.1. nm R}h
    5.2. CũRXgN^֐уfXgN^֐
    5.3. LCu̓XNvgł
    5.4. V{̃o[Wtƃo[WXNvg
    5.5. GNU libtool
    5.6. Xy[Xߖ񂷂邽߂ɃV{폜
    5.7. ɒ[ɏȎs\t@C
    5.8. C++ vs. C
    5.9. C++ ̍
    5.10. Linux Standard Base (LSB)
    5.11. CuQ𓝍đ傫ȋLCu
   
6. 
   
    6.1. libhello.c t@C
    6.2. libhello.h t@C
    6.3. demo_use.c t@C
    6.4. script_static t@C
    6.5. script_shared t@C
    6.6. demo_dynamic.c t@C
    6.7. script_dynamic t@C
   
7. ̑̏
8. 쌠ƃCZX
9. {ɂ
   
    9.1. {󗚗
    9.2. ӎ
   
1. ͂߂

 HOWTO ̓vO}łAGNU c[Zbg𗘗pāALinux 
ŃvOCu쐬@Aт̎gp@
łBuvOCuvƂ́Â̂vOɑgݍނ߂
RpCς݃R[h (уf[^) ܂ށAPȂt@ĈƂłB
vOCúAvOA胂W[A葬
RpCłAȒPɍXVł̂ɂ܂BvOCu
͎O̃^CvAȂ킿AÓICu (static library)ALCu
 (shared library)AICu (dynamically loaded library)Aɕ
ނ邱Ƃł܂B

́̕AŏɁAÓICu (vOsOɂ̎s
\vOɑgݍ܂郉Cu) ɂĐ܂BꂩA
LCu (vOsɃ[hA̃vOԂ
L郉Cu) ɂĐ܂BŌɁAICu (v
Os̔Cӂ̎_Ń[hĎgp邱Ƃ\ȃCu) 
Đ܂BICũCutH[}bǵAۂɂ͕
̎ނƂ킯ł͂܂ (ÓICuLCuI
CuƂĎgp邱Ƃ\ł)B̑ɁAvO}I
Cugp@ɈႢ܂B HOWTO ́AĂ
ƁȂ̏񌹂ւ̎QƂĂ͂Œ߂܂B

CuJĂقƂǂ̊J҂́ALCu쐬ׂ
łBƂ̂́A[UÃCugpAvP[V
͕ʁXɃCuXVł悤ɂȂ邩łBICu͕֗
łAgpɂ͏Ԃ܂B܂ÃvOł́A
ICu񋟂_KvƂ͂܂BƂ͋tɁAÓI
CȕꍇACuXV͔̂ɖłB̂߁A
Iɗp悤ƂĂȂ΁AÓICu͂߂܂B
AeCuɂ͂ꂼ̗_܂B_ɂẮAeCu
Ƃ̏͂łꂼ܂B C++ ƓICugpJ҂
AuC++ dlopen mini HOWTO <http://www.tldp.org/HOWTO/C++-dlopen/>vQ
ƂĂB

LCuw dynamically linked library (DLL) Ƃpg
l邱ƁA DLL Ƃp𓮓ICuƂĎgpC
̃Cuw߂Ɏgl邱ƁA܂Aǂ炩̏𖞂
Cuw߂ DLL Ƃpgl邱ƁAɂ͒ӂ
悢łBwɂĂA HOWTO ł Linux ɂ DLL
܂B

 HOWTO ł́As\t@CуCup Executable and
Linking Format (ELF) tH[}bg (̂قƂǑSĂ Linux fBXg
r[VŎgpĂtH[}bg) ɂĂ݈̂܂B GNU
gcc c[ZbǵAۂɂ ELF ȊÕCutH[}bg
ł܂BɁAقƂǂ Linux fBXgr[Vł́A
a.out tH[}bgȂgp邱Ƃ\łBȂA
̃tH[}bg͂̑̕ΏۊOƂ܂B

̃VXeւƈڐAKv̂AvP[V쐬ĂȂ
΁ACu\zăCXg[ƂALinux c[𒼐ڎgp
ɁAGNU libtool <http://www.gnu.org/software/libtool/
libtool.html> gp邱Ƃlق悢܂B GNU
libtool ́ALCugp̕G (Ⴆ΁ALCu̍쐬
CXg[) ѐ̂ڐA̍C^[tF[XŉB
AėpIȃCuT|[gXNvgłB Linux ł́AGNU libtool
́A HOWTO ŐĂc[QƖ񑩂Ƃ̏ɍ\zĂ܂
BICuɑ΂ڐA̍C^[tF[XƂāAlXȃ|[
^reBbp[gp邱Ƃł܂B GNU libtool ɂ́ulibltdl
vƌĂ΂郉bp[܂܂Ă܂B̑IƂẮAڐÂ
@ŃW[̓I[fBOT|[g glib Cu (glibc
ƍȂł) gp邱Ƃł܂B glib ̏ڍׂɂ
 http://developer.gnome.org/doc/API/glib/
glib-dynamic-loading-of-modules.html ŊwK邱Ƃł܂Bēxq
܂ALinux ł́A̋@\́A HOWTO ŐĂ\
p邱ƂɂĎĂ܂BȂۂ Linux ŃR
[h̊J܂̓fobOĂȂA炭A HOWTO ̏
ꂩKvƂ邱Ƃł傤B

 HOWTO ̈ꎟzzꏊ http://www.dwheeler.com/program-library/ 
 (󒍁F{ http://www.linux.or.jp/JF/JFdocs/
Program-Library-HOWTO/ ɂ܂)ALinux Documentation Project (http:/
/www.linuxdoc.org/) Ɋ񑡂Ă܂B쌠 David A. Wheeler ɂ
 (Copyright (C) 2000)AGeneral Public License (GPL) ŃCZX
Ă܂BڍׂȏɂĂ͍Ō̏͂ǂłB

 

2. ÓICu

ÓICúAʏ̃IuWFNgt@C̒PȂŴłBK
āAÓICúu.avƂgq܂B̏Ŵ́Aar
(archiver) vOgpč쐬܂BÓICu͈ȑOقǂ
͎gȂȂĂ܂ÁALCûقDĂ邽
߂ł (ƂŐ܂)Bł܂AÓICu͐܂ɐGč쐬
 (͂߂͗jIȗRő݂Ă܂)A܂ÂȒP
B

[ÚAR[hăRpCKvȂÓICuvO
N邱Ƃł̂ŁAăRpCɂ鎞Ԃߖł܂B
A̍ȃRpĈƂlƁAăRpCԂ͏dvł
ȂȂĂĂ̂ŁA̗Rt͈ȑOقǗL͂ł͂܂BÓI
CúÅJ҂ACuN邱ƂvO}ɋ
͂Cũ\[XR[h͓n͂ȂAƂꍇɂ
Ζɗ܂ (̓Cux_ɂƂĂ͍DsłÃ
CugƂĂvO}ɂƂẮAǂlĂ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Ă
B

  ar rcs my_library.a file1.o file2.o                                  

̃R}hł́AÓICu my_library.a ɃIuWFNgt@C
file1.o  file2.o ǉĂ܂B܂ my_library.a ݂ĂȂ
΁A쐬܂BÓICu쐬ɊւڍׂȏɂĂ ar(1)
QƂĂB

ÓICu쐬AgȂ邱Ƃł傤Bs\v
O쐬ƂɃRpCƃN̈ꕔƂĎ荞ނ
ŁAÓICugpł܂Bs\t@C쐬Ƃ gcc
(1) gĂȂ΁ACuw肷̂ -l IvVgp
܂BڂɂĂ info:gcc QƂĂB

gcc gƂɂ̓p[^̏ԂɋCĂB-l IvV
JIvVȂ̂ŁARpCt@ĆuɁvuKv
܂B́Aʏ̃IvV\Ƃ͂ԈقȂ܂B-l IvV
t@C̑OɒuꍇAN͊SɎsAsȃG[ɂ
Ă܂ł傤B

-l  -L IvVgăJ ld(1) 𒼐ڎgp邱Ƃł܂B
ȂAld(1) ̃C^[tF[X gcc(1) ύX₷
ŁAقƂǂ̏ꍇ gcc(1) gق悢łB

 

3. LCu

LCúAvONɃ[h郉CułBL
CuK؂ɃCXg[ƁǍɋNSẴvO
́AIɂ̐VLCugƂɂȂ܂Bۂɂ́A
͂邩ɏ_ŐĂ܂BȂȂALinux ɂ鋤L
Cu̎@̂ŁÂƂ\ƂȂ邩łB

 E CuXVȂÃCǔÂČ݊̂Ȃ
    o[WgƂvOAT|[g邱Ƃ
    ł
   
 E ̃vOsƂÃCuA̓Cu
    ̓̊֐łI[o[Ch邱Ƃł
   
 E ̃CugpăvOĂԂɂAS
    ȂƂł
   
 

3.1. 񑩂

̖]܂ׂĂLCuT|[g邽߂ɂ́A
̊KƎwjɏ]Ȃ΂Ȃ܂BCu̖OAɁusonamev
Ɓureal namev̈Ⴂɂ (yт炪ǂ̂悤ɑݍp邩ɂ
) w΂Ȃ΂Ȃ܂B܂A炪t@CVXêǂ̏
ɒuׂł邩ɂĂAmĂȂ΂Ȃ܂B

 

3.1.1. LCu

SĂ̋LCúusonamevƌĂ΂ʂȖOĂ܂B
soname ́AulibvƂvtBbNXACu̖OAu.sovƂ
ō\AɌɁAsIhƁAC^[tF[XύXɕK
o[WԍA܂ (ʂȗOƂāAŉw C Cu
́ulibvł͎n܂܂)BSLq soname ́ÃCu
g܂܂fBNgvtBbNXƂĊ܂ł܂Bۂ̃VX
eł́ASLq soname ́ALCúureal namevւ̒PȂ
V{bNNɂȂĂ܂B

SĂ̋LCuɂ́ureal namev(ۂ̃CuR[h܂ރt@
C̖O) ܂Breal name ́Asoname ɁAsIhA}Ci[ԍ
A̃sIhA[XԍÂłBŌ̃sIh
[Xԍ͔CӂłB}Ci[ԍƃ[Xԍ́ACûǂ
o[WCXg[Ă邩𐳊mɎ̂ŁAݒǗɖ
܂B̔ԍ (ɂĂΘb₷Ȃ̂ł)
ŃCuۂɗpĂԍƓł͂Ȃ
ȂAƂ_ɒӂĂB

āACuvɃRpCgp閼OƂ̂܂
(ulinker namevƌĂڂƎv܂)B̖ÓAPɈ؂̃o[W
ԍ菜 soname łB

LCuǗ錮ƂȂ̂́A̖O̎głBKv
Ƃ鋤LCüꗗ\ɎƂɂ́AvÓAKv
 soname ݂̂XgAbv悤ɂ܂BtɁALCu
쐬Ƃɂ́A(ڍׂȃo[W) ̃t@C
Cû݂쐬悤ɂ܂BVo[W̃Cu
CXg[Ƃɂ́AAO̓ʂȃfBNĝ̈ɂ
CXg[Aꂩ ldconfig(8) vOs܂B
ldconfig ́Aɑ݂t@C𒲂ׁAreal name ւ̃V{bN
NƂ soname Q쐬܂BlɂāALbVt@C /etc/
ld.so.cache 쐬܂ (ɐ܂)B

ldconfig  linker name 쐬܂BʏA̍쐬Ƃ̓Cu
CXg[ɂȂAPɁAuŐV́vsoname ͍ŐV real
name ւ̃V{bNNƂ linker name 쐬܂BقƂǂ
ꍇɂāACuXVANɂIɗp
Ǝvł傤Asoname ւ̃V{bNNƂ linker name
ĂƂ߂܂BȂ ldconfig I linker name 
쐬Ȃ̂A H. J. Lu ɐq˂܂Bނ̐́A{Iɂ́A
uCu̍ŐVo[WgăR[hsƎv邩m
܂񂪁Ał͂ȂA(炭݊̂Ȃ) ÂCuN
Ȃ̊JƂ]邱Ƃ肤ł傤vAƂ̂ł
B̂߁Aldconfig ́AvOǂ̃CuɃN
ƂƂɂẮẢȂȂ̂łBłACu
ƂăJɎg킹̂ۂɍXV邽߂ɂ́ACXg[
V{bNNʂɕύXȂ΂ȂȂ̂łB

Ⴆ΁A/usr/lib/libreadline.so.3 ͊SLq 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܂B
ڍׂ info:standards#Directory_Variables ɂ info t@ChL
gQƂĂB GNU ḰA\[XR[hzzƂAftH
gݒ莞ɂ̓CuS /usr/local/lib ɃCXg[悤
Ă܂ (R}hS /usr/local/bin ɔzu悤ɂƂ
Ă܂)B܂ÃftHgݒI[o[ChACXg
[[`Ăяo肷ۂ̖񑩂Ƃ`Ă܂B

t@CVXeKwK (Filesystem Hierarchy Standard; FHS) ́AfB
Xgr[VɂĉǂɃCXg[ׂĂ
 (http://www.pathname.com/fhs/ QƂĂ)BFHS ɂƁA
Ƃǂ̃Cu /usr/lib ɃCXg[ANɕKvƂ郉
Cu /lib ɁAVXëꕔł͂ȂCu /usr/local/lib
ɃCXg[̂ǂAƂƂɂȂ܂B

ۂɂ́A̋KԂɖ͂܂B GNU ḰA\[XR[
hJ҂̂߂̃ftHgݒ𐄏Ă̂łA FHS ́Af
BXgr[^ (ʏAVXepbP[WǗVXeɂ\[XR[
h̃ftHgݒIIɃI[o[ChlX) ̂߂̃ftHg
ݒ𐄏Ă̂łBۂɂ͂܂@\Ă܂BȂ_
E[huŐV́v(炭oO炯́I) \[XR[h́AI
Ɏgu[JȁvfBNg (/usr/local) ɃCXg[
BăR[hnĂAfBXgr[Vp̕WIȈ
uɃR[hzu邽߁ApbP[WǗc[ŃftHgݒȒP
I[o[Chł܂BȂ̃CuACuoRłĂ
o邱Ƃ̂ȂvOĂяoĂ̂Ȃ΁ÃvO
 /usr/local/libexec (fBXgr[Vł /usr/libexec 
Ȃ܂) ɔzuׂłBȂ̂́ARed Hat hVXe
ftHgݒł /usr/local/lib CuΏۂɊ܂߂ĂȂ
ƂƂłB /etc/ld.so.conf Ɋւ鉺L̋c_QƂĂB
̕WIȃCuzuꏊƂẮAX Window System p /usr/X11R6
/lib ܂B/lib/security  PAM W[pɎg܂Aʏ
APAM W[Q͓ICu (ƂŐ܂) Ƃă[
ĥŒӂĂB

 

3.2. Cu͂ǂ̂悤Ɏg邩

GNU glibc x[X̃VXe (SĂ Linux VXe܂܂܂) ł́A
ELF oCist@CNƁAIɃvO[_[h
As܂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ɋLq
Ă܂B Red 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 ɒ
邱Ƃ́ARed Hat hĂVXeő̃vO
点̂ɕKvȁAʂ́uCvƎvĂ܂B

Ců̊֐I[o[ChŁAc͂̂܂
ɂĂȂ΁AI[o[Ch郉Cu (.o t@C) ̖O
 /etc/ld.so.preload ɓ邱Ƃł܂B́us[hv
CúAWWs܂B̐s[ht@ĆAT^I
ɂً͋}p̃pb`ƂĎg܂BʏAfBXgr[Vzz
ہÂ悤ȃt@C͊܂܂Ȃł傤B

vONɂSẴfBNĝ́AƂĂ
IȂ̂ŁAۂɂ̓LbVȂ܂B ldconfig(8) vO
̓ftHg /etc/ld.so.conf t@Cǂݍ݁AK؂ȃV{bN
N𓮓INfBNgɍ쐬܂ (ɂAWIȊK
ɉƂɂȂ܂)BꂩAƂő̃vO痘p邱
ɂȂLbV /etc/ld.so.cache ɏ݂܂BɂACu
ւ̃ANZXɑȂ܂BʂƂČ邱Ƃ́ADLL 
ƂA܂́ADLL 폜ADLL fBNg̃ZbgύX
肵Ƃɂ͕KAldconfig sȂ΂ȂȂAƂƂł
B ldconfig ̎śACuCXg[ɃpbP[WǗc[
ĂȂXebv̈ł邱ƂłB ldconfig ȍ~A
I[_͋NAۂɂ /etc/ld.so.cache t@CgAKvƂ
郉Cu[h邱ƂɂȂ܂B

b͕ς܂AFreeBSD ́ÃLbVp̃t@CقȂ
܂B FreeBSD ł́AELF LbV /var/run/ld-elf.so.hints ŁA
a.out LbV /var/run/ld.so.hints ɂȂ܂B̃t@C
܂ ldconfig(8) ɂXV̂ŁAꏊ̈ႢƂȂ̂́A
̓ʂȏ󋵂ɂĂ݂̂ł傤B

 

3.3. ϐ

lXȊϐɂALCũ[h𐧌ł܂B[h
I[o[Ch邽߂̊ϐ݂̂łB

 

3.3.1. LD_LIBRARY_PATH

̃vOsہAꎞIɕʂ̃Cu֓IɎgp
Ƃł܂BLinux ł́Aϐ LD_LIBRARY_PATH ɁAWIȃfB
NgQɐ旧ăCuΏۂƂׂfBNgQAR
؂ĕׂ܂B́AVCufobOƂA
ړÎ߂ɔWIȃCugpƂȂǂɕ֗łBϐ
LD_PRELOAD ɂ́A傤 /etc/ld.so.preload łĂ̂Ɠ悤
ALCuQAWWI[o[Ch֐QƋɗ񋓂
B̋@\́A[_ /lib/ld-linux.so ɂĂ܂B
LD_LIBRARY_PATH ͑ Unix nVXeŋ@\܂ASẴVXe
ɂċ@\킯ł͂Ȃ̂Œӂ܂傤BႦ΁AHP-UX ł
@\𗘗pł܂A SHLIB_PATH łAAIX ł LIBPATH ƂȂ
܂ (\͓ŁAR؂̃Xgł)B

LD_LIBRARY_PATH ͊JeXgɂ͕֗łAʃ[UɓIɎgp
悤ƂāACXg[ŕύXׂł͂܂B̗R
ẮAhttp://www.visi.com/~barr/ldpath.html ́uWhy LD_LIBRARY_PATH
is badv(Ȃ LD_LIBRARY_PATH ͂Ȃ̂) QƂĂBƂ
̂́ALD_LIBRARY_PATH ́AJeXgAāA̕@ł͉
łȂɑΏ邽߂ɂ́A͂֗łB LD_LIBRARY_PATH 
ݒ肵ȂꍇALinux ł́AvO[_𒼐ڋNĈ
^邱Ƃł܂BႦ΁Â悤ɂƁAw̎st@C
Aϐ LD_LIBRARY_PATH ̓eł͂ȂA^ꂽ PATH gpĎ
s܂B

  /lib/ld-linux.so.2 --library-path PATH EXECUTABLE                    

^ ld-linux.so sƁAgɂẴwv\
܂BAx܂Ai͂gȂ悤ɂĂ
B̋@\͑SăfobÔ߂ɂ̂łB

 

3.3.2. LD_DEBUG

GNU C [_̂֗̕Ȋϐ LD_DEBUG łBɂAdl*
() ֐QAs̏Ɋւʂɏo͂悤ɂȂ܂B
΁ÃR}h

  export LD_DEBUG=files                                                
  command_to_run                                                       

́ACuƂɏt@CQƃCuQ\A
oꂽˑ֌WAсAǂ so t@Cǂ̏ԂŃ[hꂽA
Ă܂BLD_DEBUG ubindingsvɃZbgƁAV{̃oC
fBOɊւ\܂BulibsvɃZbgƁACu
pX\܂BuversionsvɃZbgƁAo[Wˑ֌W
\܂B

LD_DEBUG uhelpvɐݒ肵AvO̎s݂ƁAw\ȃIv
VXgAbv܂Bēx\܂ALD_DEBUG ͓IɎgp
邽߂̂̂ł͂ȂAfobOeXgɖ𗧂̂łB

 

3.3.3. ̑̊ϐ

ۂɂ́A[h𐧌䂷ϐ͑ɂ񑶍݂܂B
̖O LD_  RTLD_ ł͂܂ÂقƂǂA[_̒჌x
ȃfobOȋ@\邽߂̂̂łBقƂǂ̂̂ɂ͂
܂BɂĒׂȂA(gcc ̈ꕔł) [
_̃\[XR[hǂނ̂ԂłB

ʂȑΉȂĂȂꍇAIɃN郉Cuɑ΂
[UɋĂ܂ƁAsetuid/setgid vO͔ߎSȂƂ
Ȃł傤B̂߁A(vONɃvO̎c̕[
h) GNU [_́Åϐ (yїގ̊ϐ) 𖳎
ÁÅϐ̌ʂ啝ɐ܂B[_́Av
O̐MC (credential) 𒲂ׂ邱ƂɂāÃvO
setuid  setgid Ă邩ǂmF܂B uid (
[U ID)  euid ([U ID) قȂ邩A gid (O[v
ID)  egid (O[v ID) قȂȂA[_͂̃vO
setuid/setgid Ă (͂̂悤ȃvONꂽ)
Ɛ肵AN𐧌䂷\͂啝ɐ܂B GNU glibc Cu
̃\[XR[hǂ߂΁ÂƂmF邱Ƃłł傤B
ɁAelf/rtld.c t@C sysdeps/generic/dl-sysdep.c t@CQƂ
ĂB̂ƂAuuid  gid  euid  egid ɓ
vOĂׂ΁ÅϐSɋ@\vAƂ
܂B Unix nVXeł́Aʂ̕@ł̖ɑΏ܂
Ausetuid/setgid vÓAݒ肳ĂϐQɂĉߓx
ɉe󂯂ׂł͂ȂvAƂl͓łB

 

3.4. LCu̍쐬

LCu̍쐬͊ȒPłB܂͂߂ɁALCuɑgݍ
IuWFNgt@CAgcc  -fPIC ܂ -fpic tOgč쐬
܂B -fPIC  -fpic IvVɂALCuɑ΂v
łuʒuƗR[h (position independent code)v𐶐邱Ƃ
܂B̃IvV̈ႢɂẮA̐QƂĂB
soname ́Agcc  -Wl IvVgĎw肵܂B -Wl IvV́A
IvVQ (̗ł -soname JIvV) Jɓn
̂̂łB-Wl ̌̃J}̓^Cv~Xł͂܂B -Wl IvV
ɂ́AGXP[vĂȂXy[X܂߂Ă͂ȂȂ̂ł (󒍁F
-Wl ̒ɑu,-soname,your_sonamevƂ́AJ}̕
Ă烊Jɓn܂B܂AJɂ́u-soname
your_sonamevƂIvVn܂)B̏pċLCu
쐬ĂB

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

̃IuWFNgt@C (a.o  b.o) 쐬A痼̃IuWF
Ngt@C܂ދLCu쐬܂BL̃RpC
ł́AIuWFNgt@CɃfobO (-g) ܂܂邱Ƃɂ
A܂AxbZ[W (-Wall) \܂B̃IvV́A
LCu쐬ɕK{ł͂܂񂪁A߂܂B̃RpC
ŁA(-c IvVɂ) IuWFNgt@C܂BȂ
A-fPIC IvV̎w͕K{ł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                               

ӂׂƂ܂B

 E ꂽCu strip ȂłB܂A{ɕKvł
    ARpCIvV -fomit-frame-pointer gȂł
    BȂĂꂽCu͋@\܂Afo
    bKقƂǎgɂȂȂȂĂ܂܂B
   
 E R[h̐ɂ -fPIC ܂ -fpic gpĂBR[h̐
     -fPIC  -fpic ̂ǂǵA^[QbgɈˑ܂B
    -fPIC IłΏɓ܂A-fpic 傫ȃR[h𐶐
    \܂ (oĂ@́AuPIC ͑啶
    傫ȃR[h𐶐\vAł)B -fpic IvVg
    ƁAʏ͏đR[h܂AO[oŉ
    łV{̐R[h̃TCYƂAvbgtH[Ɉˑ
    鐧܂BLCu쐬ƂA܂ǂ
    JĂ܂B^킵ƂA -fPIC ̕I
    BȂȂA-fPIC ͏ɋ@\邩łB
   
 E ꍇɂẮAgcc ĂяoăIuWFNgt@C𐶐Ƃ
    Au-Wl,-export-dynamicvIvV܂߂Ȃ΂ȂȂƂ
    ܂BʏAIV{e[uɂ́AIIuWFNggpV
    {݂̂܂܂Ă܂B̃IvV́A(ELF t@C𐶐
    ꍇ) SẴV{𓮓IV{e[uɒǉ܂ (ڍׂɂ
    Ă ld(1) QƂĂ)Butˑ֌Wv݂ƂA
    ܂ACu[h悤ƂĂvO̓ (K
    ) 錾ĂȂ΂ȂȂV{AICuɂ
    Ė̂ƂÃIvVgKv܂Butˑ֌Wv
    @\ɂ́AvOAV{Q𓮓Iɗp\ɂ
    Kv܂B Linux VXeōƂ̂ł΁Au
    -Wl,-export-dynamicv̂Ɂu-rdynamicvł悢łBA
    ELF ɂƁALinux ȊÕVXeɂ gcc ł́Au
    -rdynamicvtO͏ɋ@\킯ł͂܂B
   
J́Aȗ̃vOpĂ郉CuC
Ă܂ȂvƂݓIȖ肪܂BJiK̃Cu
ΏۂɂăeXgȂẴAvP[VȊOɂ́A
̊JiK̃Cug킹Ȃł傤Bgp邱ƂɂȂƎv
郊NIvV́Ald ́u-rpathvłB́ARpC
X̃vÓAs̃CupXw肷̂łB gcc 
́Â悤Ɏw肷邱ƂŁA-rpath IvVnƂł܂B

  -Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)                               

CũNCAgvOrhƂɂ̃IvVg
΁ÃvOYCuBĂ܂悤ȑ̋ZpƋ
ĂȂƁA܂́Â悤ȋZpgpĂȂƁAmF
Kv邱ƂāALD_LIBRARY_PATH (Ő܂) ɂĔY
KvȂȂ܂B

 

3.5. LCũCXg[Ǝgp

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

܂ALCuǂɍ쐬Kvł傤BꂩAK
vȃV{bNNA soname  real name ւ̃N쐬
Kvł傤 (lɁAo[WԍSw肵Ȃ[Û
Ao[Wԍ̖ soname, ܂u.sovŏI soname ̃
NKvł)BłȒPȕ@́ÂƂs邱ƂłB

  ldconfig -n directory_with_shared_libraries                          

ŌɁAvORpCƂɁAgƂĂSĂ̐ÓI
CuƋLCuɂāAJɋĂKv܂B
́A-l IvV -L IvVgĂȂ܂B

WIȏꏊɃCuCXg[łȂA̓CXg[
ȂȂ (Ⴆ΂Ȃ /usr/lib ύX錠ĂȂȂ)
Aʂ̎菇𓥂܂Ȃ΂Ȃ܂B̂悤ȏꍇACuǂ
ɃCXg[ĂÃCu邽߂ɏ\ȗʂ̏
vOɗ^Ȃ΂Ȃ܂BȂɂ́A@
܂BPȏꍇł́Agcc  -L tOgpł܂B܂AɁA
̃vOȊO͔WIȏꏊɒuĂ郉Cu𗘗p
Ƃ̂ł΁A(Ő)u-rpathvgƂł܂B
ϐgĂ낢됧䂷邱Ƃł܂BɁALD_LIBRARY_PATH 
肷邱Ƃł܂B LD_LIBRARY_PATH ɂ́ALCu
ɒʏ̏ꏊɐ旧ČΏۂƂfBNgQARŋ؂
ė񋓂܂B bash głA̕@ my_program sł
܂B

  LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH my_program                        

̊֐IIɃI[o[ChȂ΁AI[o[Ch
IuWFNgt@C쐬 LD_PRELOAD ݒ肷邾Ŏł
B̃IuWFNgt@C̊֐ɂAΏۂƂȂĂ֐
I[o[Ch܂ (̊֐͌̂܂܂ł)B

ʏACu̍XV́ACɂɂȂƂł܂B
API ɕύXȂ΁ACu쐬҂ɂ soname ύXĂ
Ƃł傤B킯ŁA̃VXeɕ̃Cu
łAevOɑ΂郉CuÎłBA
ACu̍XV soname ͕ύXȂ̂ɃvO
܂ȂȂĂ܂AƂƂ̂Ȃ΁AÂCu
ǂɃRs[ÃvÔ̖ύX (ÂOɁu.origv
tȂ) ƂɂāÃvOÂo[Ŵق̃C
ug悤ɋ邱Ƃł܂B̍ƂȂ
Ap郉CuĐݒ肵Ďۂ (̕ύXꂽ) vO
яoAȁubp[vXNvg쐬ĂBԍt̖
Ƃ̂ŁAfBNgɕ̃o[W̃Cuu
Ƃł܂A]݂ȂAÂCuƎ̓ʂȏꏊɒu
Ƃł܂Bbp[XNvǵÂ悤Ȃ̂ɂȂł傤B

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

ŃvOƂɂ́A̕@ɈˑȂ悤ɂĂ
BCǔ݊邩ÁA̖݊ύX
ȂƂ͕K soname ̃o[Wԍ𑝂₷悤AC𕥂Ă
B̕@́Aň̏ꍇ̖߂́uً}vΉȂ̂łB

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

  ldd /bin/ls                                                          

ʏAvOˑe soname ɂāAꂼǂ̃fBNg
ɑ݂邩肳A̓肳ꂽfBNgƂƂɁAY
soname Q̃Xg\܂BIɑSĂ̏󋵂ɂāAȂƂ
̈ˑ񂪕\ł傤B

 E /lib/ld-linux.so.N (N  1 ȏBʏ͏ȂƂ 2). ́A
    SẴCu[h邽߂̃CułB
   
 E libc.so.N (N  6 ȏ).  C CułBC ȊǑ
    łAC CugpX܂ (ȂƂ玩g
    ̃Cu邽)B̂߁AقƂǂ̃vÓA
    Ƃ̃Cu܂ł܂B
   
ӁFMłȂvOɑ΂ ldd sĂ͂܂B ldd
(1) ̃}jAŖmɏqׂĂƂAldd ́A(̏󋵂ɂ
Ă) ʂȊϐ (ELF IuWFNg̏ꍇ
LD_TRACE_LOADED_OBJECTS) ݒ肵ăvOs邱ƂɂA
Ă܂BMłȂvOA(ldd Pɕ\邩)
Cӂ̃R[h ldd [UɋsĂ܂Ƃ\܂
B

 

3.6. ݊̂ȂCu

Vo[W̃CuÂ̂Ƃ̃oCi݊ȂƂ
ɂ́Asoname ύXKv܂B C ł́ACuoCi
݊ł͂ȂȂĂ܂l̊{IȌ܂B

 1. ֐̋ύXAX̎dlɓKȂȂ
   
 2. GNX|[gĂf[^ύX (OF\̂Cu
    ł̂݃AP[gꍇɌA\̖̂ɔCӂ̃o[
    ǉ邱Ƃɂ͖肪Ȃ)
   
 3. GNX|[gĂ֐폜
   
 4. GNX|[gĂ֐̃C^[tF[XύX
   
̌ł΁ACuoCi݊ɕۂƂł
Bʂ̌ƁA̕ύX΁AApplication Binary
Interface (ABI) ݊ۂƂłAƂƂłBႦ΁AÂ
폜ɐV֐ǉAƂ͖̂Ȃł傤B\
̖̂ɂ̂݃o[ǉA̍\̂AP[ĝ̓Cu
Ƃ (AvP[Vɂ̓AP[gȂ)Aǉ̃o[
IvVɂ (Cũo[ݒ肷)AȂǂ̑
ȂĐύXAÂvOɑ΂ĉe^ȂƂm
ȏꍇɂ̂݁Ao[ǉ邱Ƃł܂B[U\̂
zŎgĂȂ΁A̍\̂g邱Ƃ͂قƂǂłȂ̂
\ӂĂB

C++ (сAev[gfBXpb`郁\bhRpCɑg
ݍނƂ@ŃT|[g邻̑̌) ł́A󋵂͂蕡GɂȂ
܂BLɏqׂƂSēĂ͂܂Aɑ̒ӓ_܂
B̏񂪁ARpCR[hɁuBꂽԂŁvgݍ
܂Ƃ_ɂ̌̂łÂ߂ɁAC++ ʏǂ̂悤
ɎĂ邩mȂlɂ͗ɂˑ肪AN
Ă܂̂łBmɌ΁ÁuVvł͂܂BP
ARpCς݂ C++ R[hAlɂĂ͋Ȃ
NAƂ̘błB̃XǵAoCi݊ێ
邽߂ C++ łĂ͂Ȃڂ̃Xg (炭Sł͂
) łATroll Tech ЃeNjJ FAQ <http://www.trolltech.com/
developer/faq/tech.html#bincomp> ŌJĂ̂łB

 1. z֐̍Ďǉ (ÂoCi̎Ăяô
    Sł͂Ȃꍇ)BRpC SuperClass::virtualFunction() ďo
    RpCɕ]邽 (Nł͂Ȃ)B
   
 2. zo֐ǉ܂͍폜BɂSTuNX̉z
    e[ũTCYƃCAEgύXĂ܂߁B
   
 3. CCo֐oRŃANZX\ȃf[^oړ
    Af[^ǒ^ύXB
   
 4. NXKwύXBA[t (󒍁FʃNXȂN
    X) ̐VKǉB
   
 5. vCx[gf[^ǉA܂͍폜BɂSTuNX
    TCYƃCAEgύXĂ܂߁B
   
 6. public  protected o֐CC֐łȂꍇɁA
    폜B
   
 7. public  protected o֐CCB
   
 8. CC֐̋ύXBAÂo[W@\
    ꍇB
   
 9. vÕo֐̃ANZX (Ȃ킿A
    public, protected ܂ private) ύXBANZX֐
    ɑgݓRpC邽߁B
   
̒XĝƂl (󒍁FȒXg̑Sڂ
邱Ƃ͖낤)A C++ CůJ҂́AoCi
ێłȂXVpɂɎ{邱Ƃv悵ĂKv܂
BKɂāAUnix nVXe (Linux ܂݂܂) ł́A̃Cu
̃̕o[W𓯎Ƀ[h邱Ƃł̂ŁAfBXNXy[X
邱Ƃɂ͂Ȃ܂AÂCuKvƂuÂvvO
s邱Ƃ\łB

 

4. ICu

ICúAvŐNȊÔƂɃ[h郉Cu
łBICúAvOC⃂W[Ƃɓɕ֗
łBƂ̂́AKvɂȂ܂ŁAvOC̃[hҋ@邱Ƃ
ł邩łBႦ΁APluggable Authentication Modules (PAM) VXe
ł́AǗ҂F؂̐ݒ^ĐݒȂ悤AICugp
Ă܂B܂Aグ邽߂ɓrŋx~ɂ̎XŃR[h
}VR[hɃRpCÃRpCꂽ̂gpƂC
^v^̂ɂɗ܂B̕@́AႦ΃WXgC
^CERpCA}`[UE_W (MUD) ƂɎg
܂B

Linux ł́Aۂ̂ƂAtH[}bgƂ_猩ƁAICu
͓ʂȂ̂ł͂܂B܂ŏqׂĂ̂ƓŁAWI
IuWFNgt@C⋤LCuƂărhĂ܂BȈႢ
́AICúAvÕNNɎIɂ̓[h
ȂAƂ_łB̂ɁACuI[vAV{
AG[ACuAƂ API ݂܂B
 API gp邽߂ɂ́AC vO}̓wb_t@C <dlfcn.h> C
N[hKv܂B

Linux ŎgpC^[tF[X́A{I Solaris ̂̂Ɠł
Budlopen()vAPI ƌĂڂƎv܂BÃC^[tF[
X͑SẴvbgtH[ŃT|[gĂ킯ł͂܂B
HP-UX ł shl_load() Ƃʂ̎dg݂gpAWindows vbgtH
[ł͑SقȂC^[tF[Xł DLL gp܂BL͂ȈڐA
ŏIڕWƂȂ΁A炭AvbgtH[Ԃ̍B
bp[Cu̎gpق悢ł傤B@̈Ƃ
AW[̓I[fBOT|[g glib Cu܂
B glib CúAvbgtH[ŗL̓I[fBOE[`
QŎgpAI[fBOp̈ڐA̍C^[tF[X
Ă܂B glib ɂẮAhttp://developer.gnome.org/doc/API/glib
/glib-dynamic-loading-of-modules.html QƂĂB glib ̃C
^[tF[XɂẮAglib ̃hLgŏ\ɐĂ̂ŁA
ł͂ȏ㌾y܂B̕@́Alibltdl g@ł
B libltdl ́AGNU libtool <http://www.gnu.org/software/libtool/
libtool.html> ̈ꕔłBƑ̋@\KvȂ΁ACORBA Object
Request Broker (ORB) 𒲂ׂĂ݂̂悢ł傤B Linux  Solaris 
T|[gC^[tF[X𒼐ڎgp邱Ƃɂ܂Ȃ
΁AǂݐiłB

C++ ƓICugpJ҂́̕AuC++ dlopen mini HOWTO
<http://www.tldp.org/HOWTO/C++-dlopen/>vQƂĂB

 

4.1. dlopen()

dlopen(3) ֐́ACuI[vAgpȌȂ܂B
C ̃vg^Cv͎̂悤ɂȂ܂B

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

t@Cu/vŎn܂Ȃ (܂΃pXȂ)Adlopen() ͒P
̃t@CgƂ܂ (Cu悤Ƃ͂܂)B
ȊOȂ΁Adlopen() ͎̏ԂŃCu܂B

 1. [U LD_LIBRARY_PATH ϐ̃Rŋ؂ꂽfBNg
    Xg
   
 2. /etc/ld.so.cache Ɏw肳ꂽCuXg (/etc/ld.so.cache
     /etc/ld.so.conf Ƃɐ܂)
   
 3. /lib,  /usr/lib. ̏ԂɒӂĂB̏Ԃ́AÂ
    a.out [_ŎgĂԂƂ͋tłBÂ a.out [_́Av
    O[hƂAŏ /usr/lib ÂƂ /lib
    Ă܂ (man y[W ld.so(8) QƂĂ)B̂
    Ƃ́Aʏ͖ɂȂȂ͂łBȂȂACu͂ǂ炩
    ̃fBNĝ݂ɒuĂ͂łBقȂ郉Cu
    ɓOtƁA܂B
   
dlopen() ł́Aflag ̒l RTLD_LAZY  RTLD_NOW ̂ǂ炩łȂ΂
܂B RTLD_LAZY ́AuICũR[hsƂɖ
`V{vƂӖŁARTLD_NOW ́Audlopen() ^[
OɑSĂ̖`V{AꂪłȂ悤ȂΎs
vƂӖłB RTLD_GLOBAL ́Aflag ̂ǂ炩̒lƔCӂŘ_a
邱Ƃł܂B RTLD_GLOBAL tOtă[hꂽCu
Œ`ĂOV{́Aォ烍[h郉Cu
łgpł悤ɂȂ܂BfobÓA炭 RTLD_NOW g
Ȃł傤B RTLD_LAZY gƁA̎QƂƂɕs
G[܂B RTLD_NOW gƁACũI[vɂ͎኱
Ԃ悤ɂȂ܂ (Â̂̌x͑Ȃ܂)B
̂Ƃ[UC^[tF[XɂȂ悤łAƂ
RTLD_LAZY ɐ؂ւ邱Ƃł܂B

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

dlopen() ̖߂ĺA̓ICuE[`ɂĎgpun
hvł (̃nh͉̎̂BĂ̂ƂĈĂ
)B[hsꍇAdlopen()  NULL Ԃ܂̂ŁA߂l`
FbNKv܂BCu dlopen() œȏネ[h
ƁAt@CnhԂ܂B

ÂVXeł́ACu _init ƂÕ[`GNX|[g
ĂꍇAdlopen() ߂Oɂ̃R[hs܂B̎dg
gāACȕ[`邱Ƃł܂BA
CúA_init  _fini ƂÕ[`GNX|[gׂ
ł͂܂B̎dg݂͌ÂȂĂA]łȂ
\܂BɁACuł́A__attribute__
((constructor)) ֐ __attribute__((destructor)) ֐gp
ă[`GNX|[gĂ (gcc gpĂ̂Ɖ肵
܂)BڍׂɂĂ Section 5.2 QƂĂB

 

4.2. dlerror()

dlerror() ɂG[񍐂ł܂B dlerror() ́AŌ dlopen(),
dlsym(), ܂ dlclose() ďõG[ɂĐ镶Ԃ
BςĂ̂́Adlerror() ĂяoƁAȍ~ dlerror() ̌
o͑̃G[܂ NULL ԂƂ_łB

 

4.3. dlsym()

ICu[hĂAgȂΈӖ܂BI
CugpŒSƂȂ郋[` dlsym(3) łB dlsym() 
A^ꂽ (I[vς݂) CuɂV{̒l
B̊֐͎̂悤ɒ`Ă܂B

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

handle  dlopen() ԂlŁAsymbol ̓kŏI[ꂽ
łB dlsym() ̌ʂ void * |C^Ɋi[邱Ƃ́Ał邾
ĂBȂȂÃ|C^gp邽тɃLXgȂ
ȂȂȂ邩ł (̃vOeiX悤Ƃ鑼̕X
󂯎ʂĂ܂܂)B

dlsym() ́AV{Ȃ NULL Ԃ܂BV{ NULL
̓[ƂlƂ邱Ƃ͂肦ȂƕĂ΁A肠
BAłȂꍇ͐ݓIɞBc܂B NULL 
󂯎ꍇÁAuȃV{݂͑ȂvƂƂӖ
̂ł傤AƂũV{̒l NULL łvƂ
Ӗ̂ł傤HWIȕ@́A(݂Ă\̂G[
NA邽߂) ܂ŏ dlerror() ĂсAɁAV{v
邽߂ dlsym() ĂсAŌɁAG[Ă邩ǂ𒲂
邽߂ɍēx dlerror() ĂяoAƂ̂łBR[ĥ͎悤ɂ
ł傤B

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

 

4.4. dlclose()

dlopen() ̋t dlclose() łBdlclose() œICuN[Y
܂B dl Cu͓Iȃt@Cnhւ̃NǗĂ
̂ŁA̓ICuɑ΂āAdlopen() 񐔂Ɠ
dlclose() Ă΂ȂAYCu͎ۂɂ̓ォ폜
܂Bł̂ŁAvOCu񃍁[hĂA
ɂ͂Ȃ܂BCůĂƂAÂCu
ł́A(݂Ȃ) _fini ֐Ă΂܂BA_fini ͌
dg݂Ȃ̂ŁAɈˑĂ͂܂BɁACuł́A
__attribute__((constructor)) ֐ __attribute__((destructor)) 
gpă[`GNX|[gĂBڍׂɂĂ 
Section 5.2 QƂĂBӁFdlclose() ́AȂ 0 AG
[ȂΔ[Ԃ܂B̕ԂlɂČyĂȂ Linux man
y[W܂B

 

4.5. ICu̗

dlopen(3)  man y[W̗Ɍfڂ܂B̗ł́AwCu
[hA2.0 ̃RTCo͂Ă܂B܂ASẴXebv
G[`FbNĂ܂ ()B

  #include <stdlib.h>                                                  
  #include <stdio.h>                                                   
  #include <dlfcn.h>                                                   
                                                                       
  int main(int argc, char **argv) {                                    
      void *handle;                                                    
      double (*cosine)(double);                                        
      char *error;                                                     
                                                                       
      handle = dlopen ("/lib/libm.so.6", 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 -o foo foo.c -ldl                                                

 

5. G^

5.1. nm R}h

nm(1) R}h́Aw肳ꂽCuɑ݂V{̃Xg\
܂BÓICuALCûǂɑ΂Ă@\܂B
w肳ꂽCuɂāAnm(1) ́A`ĂV{̖OA
ꂼ̃V{̒lAV{̃^CvA\ł܂B܂Ã
Cuɏ񂪑݂Ȃ (-l IvVQƂĂ)AV
{\[XR[ĥǂ (t@Cƍsԍ) `Ă邩
Ƃł܂B

V{^CvɂẮAKvłB͂̃V{
[Jł邱ƂӖA啶͂̃V{O[o (O
`) ł邱ƂӖ܂BT^IȃV{^Cv͎̂ƂłB

 E T (R[hZNV̕ʂ̒`)
   
 E D (ꂽf[^ZNV)
   
 E B (Ȃf[^ZNV)
   
 E U (`BV{̓CuɂĎgĂ邪ACu
    ł͒`ĂȂ)
   
 E W (weak. ̃CuV{`ĂꍇA
    `ɂI[o[Ch)
   
֐̖O͊oĂ邯ǂAꂪǂ̃CuŒ`Ă邩
mɂ͎voȂꍇAnm ́u-ovIvVg (R}hC
̓t@COɒu܂)Ao͂ grep 邱ƂɂāACu
oƂł܂B Bourne VFł΁A/lib, /usr/lib, /
usr/lib ̃TufBNgA /usr/local/lib ̑SCu
Ώۂɂāucosvɂ́Â悤ɂ܂B

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

nm Ɋւڍׂȏ́A茳̃}VɃCXg[Ă nm ́u
infov (info:binutils#nm) ɂ܂B

 

5.2. CũRXgN^֐уfXgN^֐

Cȕ[`ƏI[`́Agcc  __attribute__
((constructor)) ֐ __attribute__((destructor)) ֐gp
ăGNX|[g܂B̊֐Ɋւ gcc  info y[W
QƂĂBRXgN^[`́Adlopen() ߂OɎs
܂ (܂́ACuvOJnɃ[hȂ main
() JnO)BfXgN^[` dlclose() ߂OɎs܂
(܂́ACuvOJnɃ[hꂽȂ΁Aexit() ̌
A main() )B̊֐ C vg^Cv͎̂悤
ɂȂ܂B

  void __attribute__ ((constructor)) my_init(void);                    
  void __attribute__ ((destructor)) my_fini(void);                     

LCuRpCƂ́Agcc IvV́u-nostartfilesv
u-nostdlibvtĂ͂܂B̃IvVgƁA
(ȕ@pȂ) RXgN^[`уfXgN^[
`sȂȂĂ܂܂B

 

5.2.1. ʂȊ֐ _init  _fini (Âdg݁^댯)

jIȌo܂ɂARXgN^ƃfXgN^𐧌䂷邱Ƃł
̓ʂȊ֐A_init  _fini ݂Ă܂BȂA
͌ÂȂĂAgpƁA\łȂʂƂ܂B
Ȃ̃Cuł́Å֐gpȂ悤ɂĂB
ɁAŐ֐ constructor  destructor gpĂ
B

ÂVXeA_init ܂ _fini gpĂR[hȂ΂
ȂƂ̂߁A_init  _fini ̓Ő܂B̓ʂ
֐ _init  _fini ́AW[̏ƏÎ߂ɒ`
Bu_initv֐CuŃGNX|[gĂꍇÃC
u߂ (dlopen() ɂA܂͒PɋLCuƂ) I[v
ꂽƂɌĂяo܂BC vOł́A_init ƂỎ
̊֐`ĂƂƂӖ܂B_init ɑΉ֐Ƃ
 _fini ݂܂B_fini ́A(QƃJEg[ɂ dlclose() 
ďoA܂̓vO̒ʏ̏Iɂ) NCAgCu
̎gpIƂɌĂяo܂B̊֐ C vg^Cv
͎̂悤ɂȂ܂B

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

̏ꍇ́Agcc Ńt@Cu.ovt@CɃRpCƂAYꂸ
 gcc IvVu-nostartfilesvtĂB̃IvV
A.so t@Cɑ΂ăVXeX^[gAbvCuNȂ
AC RpCɓ`̂łB̃IvVtȂƁAu
multiple-definition (d`)vG[Ă܂܂B߂
֐păW[RpC@ƁA̕@Ƃ́AS
قȂ̂Ȃ̂ŒӂĂB _init  _fini Ɋւc_
邱ƂĂĂꂽƁAт̋Lq`ĂꂽƂɑ΂
AJim Mischel  Tim Gentry Ɋӂ܂B

 

5.3. LCu̓XNvgł

ʏ̃CutH[}bgƂ͈قȂAʂȃXNvgŋLq
eLXgt@CAGNU [_LCuƂĈ邱Ƃ́A
ڂɒl܂B̋@\́ÃCuԐړIɌۂɕ֗
BႦ΁ÃVXëł́A/usr/lib/libc.so ̒ĝ͎悤
ȂĂ܂B

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

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

 

5.4. V{̃o[Wtƃo[WXNvg

ʏAO֐ւ̎QƂ͕KvɉăoCh܂BAvP[V
̋NɑSĂoCh킯ł͂܂BLCuÂ
̂łꍇAKvȃC^[tF[X݂Ȃ܂BAv
P[V̂悤ȃC^[tF[XgƂƂɂȂď
āAAvP[V͓ˑR\ʃG[N܂B

̖ɑ΂̉@́Ao[WXNvgɂV{
o[WtłBV{̃o[WtɂAAvP[V
gp郉CuÂꍇɁÃAvP[VN
ƂɌxo悤ɂȂ܂BɂẮAo[WXNvg
Ɋւ ld }jA̐ (http://www.gnu.org/software/binutils/
manual/ld-2.9.1/html_node/ld_25.html) QƂĂB

 

5.5. GNU libtool

̃VXeɈڐAKv̂AvP[V쐬ĂȂ
ACu̍\zƃCXg[ɂāAGNU libtool <http://
www.gnu.org/software/libtool/libtool.html> gp邱Ƃق
悢܂B GNU libtool ́AėpIȃCuT|[gXN
vgłB libtool ́ALCugp̕GAѐ̂ڐA
̍C^[tF[XŉB܂B libtool ́AIuWFNg쐬A
CũN (ÓIыL)As\t@C̃NAs\t
@C̃fobOACũCXg[As\t@C̃CXg
[Aɑ΂āAڐA̍C^[tF[X񋟂܂B܂Alibltdl
ƂAvO𓮓IɃ[h邽߂̈ڐÂ郉bp[A
libtool ɂ͊܂܂Ă܂BڍׂɂẮAlibtool ̕ http://
www.gnu.org/software/libtool/manual.html QƂĂB

 

5.6. Xy[Xߖ񂷂邽߂ɃV{폜

ꂽt@CɊ܂܂V{͑SāAfobO̍ۂɖɗ
AXy[X܂BXy[Xߖ񂷂KvȂ΁AV{
̈ꕔ폜邱Ƃł܂B

ԗǂ@́AŏɂʂɃIuWFNgt@C𐶐Afob
OƃeXgSĎsĂ܂Ƃł (V{܂ރIuWFNgt@
Cł́AfobOƃeXg͔ɊȒPł)B̌AvOS
eXgIAstrip(1) păV{폜܂B strip(1) R}
hł́Aǂ̃V{폜邩ɂāA낢Ɛ䂷邱Ƃ
܂BڍׂɂĂ strip(1) ̕QƂĂB

̕@́AGNU ld IvV́u-SvƁu-svgp邱ƂłB
u-Sv́Ao̓t@CA(SĂł͂Ȃł) fobOV{
O܂BAu-sv́Ao̓t@CSẴV{O
܂Bu-Wl,-Svu-Wl,-svƂ邱ƂɂÃIvV gcc
oR ld ɓn܂BɃV{菜ƂɂĂāÃI
vVŏ\Ƃ̂Ȃ΁Ał悢ł傤BÂ
Astrip(1) ɔ׏_܂B

 

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

uWhirlwind Tutorial on Creating Really Teensy ELF Executables for
Linux <http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html>
({ɏ Linux p ELF s\t@C쐬ɂĂ̂𗧂`
[gA)vƂAȂ̖ɗ܂B́̕A
ɏȎs\vO̍ɂĐĂ܂BɌ
΁AʓIȏ󋵉ł́A̕ŏЉĂgbN̂قƂǂ
AgȂق悢łB́̕AELF ۂɂǂ̂悤ɋ@\
邩ĂƂ_ɂāAɂ߂ėLvłB

 

5.8. C++ vs. C

C++ vOĂāAC Cu֐ĂяoȂAC++ R[h
ł C ֐ extern "C" ƂĐ錾Kv̂ŒӂĂ
BȂƁAJ C ֐邱ƂłȂȂĂ
܂BIɁAC++ RpC C++ ֐̖Ouό` (mangle)v
܂ (Ⴆ΁A^t邽߂)B̂߁AC++ RpCɂ́Aw
肳ꂽ֐ C ֐ƂČĂяoƂĂKv܂ (
ɂA C ֐̖O͕ό`ȂȂ܂)B

C ܂ C++ ĂяovOCu쐬Ă̂ȂA
Cu[Û߁ȀIɂȂ悤Awb_t@
CɁuextern "C"v܂߂邱Ƃ߂܂Bwb_t@C̍ēǍ
݂XLbv邽߂Ƀwb_t@C̐擪ɒuA #ifndef Ƒg
ݍ킹ĎƂ΁AC  C++ ̂ǂłgp\ȃwb_t@C
̓T^́AႦ foobar.h ƂƁÂ悤ɂȂ܂B

  /* foobar ̂Ȃ̂AŐB*/                   
                                                                       
  #ifndef FOOBAR_H                                                     
  #define FOOBAR_H                                                     
                                                                       
  #ifdef __cplusplus                                                   
  extern "C" {                                                         
  #endif                                                               
                                                                       
   ... foobar pwb_R[hɏ ...                           
                                                                       
  #ifdef  __cplusplus                                                  
  }                                                                    
  #endif                                                               
  #endif                                                               

 

5.9. C++ ̍

KDE J҂́A傫 GUI C++ AvP[V̋NɒԂA
̗R̈ÃP[VȂKv邱ƂƋC
tĂ܂B̖ɑ΂āA@܂Bڍׂɂ
́AuMaking C++ ready for the desktop (by Waldo Bastian) <http://
www.suse.de/~bastian/Export/linking.txt> (C++ R[hfXNgbv
ɂ (Waldo Bastian ))vQƂĂB

 

5.10. Linux Standard Base (LSB)

Linux Standard Base (LSB) vWFNg̖ړÍALinux fBXgr[
VԂ̌݊߁ALSB ɏSĂ Linux VXeŃ\tgE
FAAvP[V̎s\Ƃ邽߂̕WJAy邱
ƂłB̃vWFNg̃z[y[W http://www.linuxbase.org/ ł
B

LSB AvP[V̊J@ɂĊȒPɂ܂Ƃ߂AGeorge Kraft
IV (IBM Linux eNmW[Z^[㋉\tgEFAGWjA) ɂf
炵ADeveloping LSB-certified applications: Five steps to
binary-compatible Linux applications <http://www-106.ibm.com/
developerworks/linux/library/l-lsb.html?t=gr,lnxw02=LSBapps> (󒍁F
{͂灨 LSB FAvP[VJ <http://www-6.ibm.com/jp/
developerworks/linux/030117/j_l-lsb.html>)  2002 N 10 ɌJ
BRȂÃR[ḧڐA߂Ȃ΁AWꂽ
Aŵ݂gpăR[hKv܂BɁALSB ł́AC/C++
vÕAvP[V쐬҂ LSB ɏĂ邩ǂ`Fb
N邽߂Ɏgc[A񋟂Ă܂B̃c[́A
J̊̋@\ƁA`FbNȂ߂̓ʂȃCugp
Ă܂BA`FbNȂ߂ɂ́Ac[QCXg[
Kv܂Bc[Q LSB ̃EFuTCg擾ł܂B擾
́AC/C++ RpCƂĒP "lsbcc" RpCgĂ
(lsbcc ́A LSB KĂȂƂɂ̎|o͂邽
߂̃NpϐAIɍ쐬܂)B

  $ CC=lsbcc make myapplication                                        
   (܂)                                                            
  $ CC=lsbcc ./configure; make myapplication                           

āAYvO LSB ŕWĂ֐gpĂ邱
ƂmF邽߁A lsbappchk vOgp܂B

  $ lsbappchk myapplication                                            

LSB ̃pbP[WOKChCɏ]Kv܂ (Ⴆ΁ARPM o[
W 3 gALSB ̃pbP[WgAAhI\tgEFȀ
̓ftHg /opt ɃCXg[Ȃ΂ȂȂAȂ)Bڍׂɂ
ẮAɌy LSB EFuTCgQƂĂB

 

5.11. CuQ𓝍đ傫ȋLCu

ŏɏCuQ쐬ĂAォ炻傫ȃCu
ւƃ}[WƂꍇAǂ悢ł傤Ĥ悤ȂƂ
Ald  "--whole-archive" IvV֗łB̃IvV́A.a t
@CQIɈ .so t@CփNۂɎgpł܂B

--whole-archive ̎g̈܂B

  gcc -shared -Wl,-soname,libmylib.$(VER) -o libmylib.so $(OBJECTS) \  
      -Wl,--whole-archive $(LIBS_TO_LINK) -Wl,--no-whole-archive \     
      $(REGULAR_LIBS)                                                  

ld łĂƂAŌ --no-whole-archive IvVg
悤ɂĂBȂƁAgcc ͕WCuQ}[W
ƂĂ܂܂B --whole-archive ɊւLq̒Ăƍ쐬̗ɑ
āAKendall Bennett Ɋӂ܂B

 

6. 

O̕@ (ÓICuALCuAICu) SĂ̗
ȉɋ܂B libhello.c t@C͊ȒPȃCuŁÃwb_t
@CƂ libhello.h ܂B demo_use.c t@ĆAlibhello 
CuĂяoȒPȃvOłBāARgt̃XNv
g (script_static  script_dynamic) ܂B̃XNvǵA
libhello CuÓICuыLCuƂĎg@
̂łB demo_dynamic.c  script_dynamic ܂B
́ALCu𓮓ICuƂĎg@̂łB

 

6.1. libhello.c t@C

  /* libhello.c - Cugp@܂ */                      
                                                                       
  #include <stdio.h>                                                   
                                                                       
  void hello(void) {                                                   
      printf("Hello, library world.\n");                               
  }                                                                    

 

6.2. libhello.h t@C

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

 

6.3. demo_use.c t@C

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

 

6.4. script_static t@C

  #!/bin/sh                                                            
  # ÓICũf                                               
                                                                       
  # ÓICũIuWFNgt@C libhello-static.o           
  # 쐬܂BÓICu̗ƓICu̗𖾊m         
  # ʂ邽߁Alibhello-static ƂOgpĂ܂B         
  # AIuWFNgt@CÓICu̖O               
  # "-static" gKv͂܂B                                 
                                                                       
  gcc -Wall -g -c -o libhello-static.o libhello.c                      
                                                                       
  # ÓICu쐬܂B                                       
                                                                       
  ar rcs libhello-static.a libhello-static.o                           
                                                                       
  # ̒iKŁAlibhello-static.a ǂ̏ꏊփRs[         
  # gp邱Ƃł܂AfړIȂ̂ŁAlibhello-static.a      
  # Cu̓JgfBNgɒu܂܂ɂ܂B           
                                                                       
  # demo_use vORpC܂B                            
                                                                       
  gcc -Wall -g -c demo_use.c -o demo_use.o                             
                                                                       
  # demo_use vO쐬܂B-L. IvVɂAv        
  # O쐬AJgfBNg "." ܂B        
  # R}hɂAlibhello-static ̊֘AIuWFNg           
  # t@C demo_use_static ɑgݍ܂܂B                      
                                                                       
  gcc -g -o demo_use_static demo_use.o -L. -lhello-static              
                                                                       
  # vOs܂B                                           
                                                                       
  ./demo_use_static                                                    

 

6.5. script_shared t@C

  #!/bin/sh                                                            
  # LCũf                                               
                                                                       
  # LCũIuWFNgt@C libhello.o 쐬܂B     
                                                                       
  gcc -fPIC -Wall -g -c libhello.c                                     
                                                                       
  # LCu쐬܂Blibhello  C CuɈˑ     
  # ̂ŁAC CuƃN邽߂ -lc IvVg    
  # ܂B                                                             
                                                                       
  gcc -g -shared -Wl,-soname,libhello.so.0 \                           
      -o libhello.so.0.0 libhello.o -lc                                
                                                                       
  # ̒iKŁAlibhello.so.0.0 A/usr/local/lib ̂ǂ        
  # fBNgփ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 ݂邩ǂ𒲂ׁA݂ꍇɂ linker      
  # name cׂۂmFKv܂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. IvVɂAv        
  # O쐬AJgfBNg "." ܂B́A    
  # vOsɃJgfBNg "." Ƃ      
  # Ӗł͂Ȃ̂ŒӂĂ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. demo_dynamic.c t@C

  /*                                                                                  
   * demo_dynamic.c                                                                   
   *                                                                                  
   * I[fBO "hello" [`̎gp@܂                          
   */                                                                                 
                                                                                      
  /*                                                                                  
   * IɃCu[h郋[`p dlfcn.h Kv                          
   */                                                                                 
  #include <dlfcn.h>                                                                  
                                                                                      
  #include <stdlib.h>                                                                 
  #include <stdio.h>                                                                  
                                                                                      
  /*                                                                                  
   * "libhello.h" CN[hKvȂƂɒӂ                          
   * BAA֘Aw肷Kv܂B                               
   * dlsym() Ŏ擾lێ邽߂̌^KvłB                               
   */                                                                                 
                                                                                      
  /*                                                                                  
   * "simple_demo_function" ^́A炸AlԂȂ                      
   * ֐Ă܂B                                                             
   */                                                                                 
                                                                                      
  typedef void (*simple_demo_function)(void);                                         
                                                                                      
  int main(void) {                                                                    
      const char *error;                                                              
      void *module;                                                                   
      simple_demo_function demo_function;                                             
                                                                                      
      /* ICu[h */                                                
      module = dlopen("libhello.so", RTLD_LAZY);                                      
      if (!module) {                                                                  
          fprintf(stderr, "libhello.so I[vł܂ł: %s\n", dlerror()); 
          exit(1);                                                                    
      }                                                                               
                                                                                      
      /* V{擾 */                                                        
      dlerror();                                                                      
      demo_function = dlsym(module, "hello");                                         
      if ((error = dlerror())) {                                                      
          fprintf(stderr, "hello ܂ł: %s\n", error);               
          exit(1);                                                                    
      }                                                                               
                                                                                      
      /* ICů֐Ăяo */                                          
      (*demo_function)();                                                             
                                                                                      
      /* SďIBƃN[Y */                                            
      dlclose(module);                                                                
                                                                                      
      return 0;                                                                       
  }                                                                                   

 

6.7. script_dynamic t@C

  #!/bin/sh                                                            
  # ICũf                                               
                                                                       
  # libhello.so Ƃ̊֘At@Cɍ쐬Ă̂           
  # 肵Ă܂ (LCũfQƂĂ)B          
                                                                       
  # demo_dynamic vOt@CIuWFNgt@C            
  # RpC܂B                                                 
                                                                       
  gcc -Wall -g -c demo_dynamic.c                                       
                                                                       
  # demo_use vO쐬܂B̃vOgp          
  # B̓ʂȃCúAvON܂Ń[h           
  # Ȃ̂ŁAICuǂɒTɂ΂悢         
  # Kv͂܂BAAICu[h邽߂           
  # Cu܂߂̂ɁA-ldl IvVKvƂȂ܂B          
                                                                       
  gcc -g -o demo_dynamic demo_dynamic.o -ldl                           
                                                                       
  # vOs܂BLD_LIBRARY_PATH gāAǂ           
  # ICu݂邩vOɋKv           
  # ƂɒӂĂB                                           
                                                                       
  LD_LIBRARY_PATH="." ./demo_dynamic                                   

 

7. ̑̏

CuɊւɗLvȏ񌹂Lɋ܂B

 E Daniel Barlow ɂuThe GCC HOWTOvBɁA HOWTO ł́AC
    u쐬p̃RpCIvVƁACuւ̖₢킹@
    Ă܂Bł͎グĂȂĂA܂
    At^łB HOWTO ́Ahttp://www.linuxdoc.org/  Linux
    Documentation Project ł܂ (󒍁FGCC HOWTO ́A҂
    ]ɂJ~Ă܂)B
   
 E Tool Interface Standards (TIS) ψɂuExecutable and
    Linkable Format (ELF)v (͂́̕Aψɂ Portable
    Formats Specification Version 1.1 ̈̏͂ł)B́̕A
    ELF tH[}bg (Linux  GNU gcc ɓ̂ł͂܂) 
    ւʂ̏ڍ׏񋟂̂łB ftp://tsx-11.mit.edu/pub/
    linux/packages/GCC/ELF.doc.tar.gz QƂĂBMIT t@
    C擾ꍇAtH[}bgʓIȂ̂ł͂Ȃ̂Œӂ
    B gunzip  tar ŉ𓀂ƁAuhpsvt@Cł܂
    Bt@C̍ŏƍŌ̍s폜Aupsvt@CɖOύX
    ΁A̃t@ĆA󎚉\ PostScript t@C擾ł
    ܂B
   
 E Hongjui Lu ɂuELF: From the Programmer's PerspectivevB Linux
     GNU gcc ɓ ELF ֘A񂪂܂B ftp://tsx-11.mit.edu
    /pub/linux/packages/GCC/elf.ps.gz Ŏ擾ł܂B
   
 E ld uUsing LD, the GNU linkervɂ́Ald ɂĂڂ
    ܂B http://www.gnu.org/software/binutils/manual/ld-2.9.1/
    ŎQƂł܂B
   
 E ́uinfovA ld  gcc  info QƂĂ
    B
   
 E (҂ɂǉ) 앐rɂuLinux C Library (libc) ɂ
    āvB 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)AGNU 
ʌLgp (GPL) ɂی삳܂B㉿ȂōĔzzĂ\܂
B̌uvOvƉ߂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ɂĉxy邱Ƃh
łBȂK؂Ƀ~[OĂȂƂ̗RŁA
NOɒoOɊւb͕͂܂B}X^[TCg
N𒣂邱ƂɂA[U͂Ȃ̃TCgŐV̂̂ł邩ǂ
mFł܂BɌZLeBvÂ߂ɃC^
[lbg֒ʏɐڑ郊XN邱ƂłȂTCg̖A
CɂĂ܂BꂪȂ̏󋵂ɓĂ͂܂Ȃ΁AȂƂA
|Cgւ̐ڑ݂A܂ɐGĂȂ̊ւ̃Xj[J[lbg
(sneakernet) Abvf[g (󒍁FXj[J[lbg FD ^т
ƂɂLlbg[N) ݂ȂǂĂB

̃CZXɂ΁AȂ̓hLgύXĂ\܂񂪁A
Ȃ̂ł͂Ȃ̂Ȃ̂̂łƎ咣 (܂
pł)AύXo[Wł邩̂悤Ȃӂ邱Ƃ͂ł
܂B앨̕ύX́A앨Ŝ̒쌠Ȃɏn̂ł͂
܂B́A쌠@̗płƂ́upubNhCv
앨ł͂܂BCZXוɓnĎQƂĂBɁA
uYou 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ɕ\邱)vƂ
_ɂ͒ӂĂBCZXɂ艽Ă邩ɂĎ
₪ꍇ́AɘABĂ̏ꍇɂ́AȂ̕ύX
݂̂Ȃ̕ύXƋɃ}X^[Rs[֓悤AȂ̕ύX
 (݂ David A. Wheeler) ֑̂悢ł傤B

 

9. {ɂ

Program Library HOWTO ̓{̈ێǗ JF vWFNg (http://
www.linux.or.jp/JF/) ȂĂ܂B{ɂĂ̂ӌ
JF vWFNg̃[OXg <JF(a)linux.or.jp> ܂ł肢v܂
B

 

9.1. {󗚗

Revision History                                                       
Revision 1.20-ja     2004 N 6  30       Revised by: MF      
o[W 1.20 ̑Ζ                                             

 

9.2. ӎ

{ɖ|󂷂ɂA̕Xɂ͂Ă܂Bɂ
OĂƂƂɁAӂ̈ӂ\Ǝv܂ (s
Ah̗A1.20-ja ȍ~)B

 E JG
   
 E Seiji Kaneko
   
 E ̑ JF vWFNg̃o[̕X
   
