Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > e74e806c1a2640e922856d7eb69d1420 > files > 90

howto-text-ja-2006-5mdv2010.0.noarch.rpm

Program Library HOWTO

David A. Wheeler

“ú–{Œê–ó / ìè‹M•F

        takahiko@hakubi.co.jp
      

version 0.75, 31 October 2000

Revision History                                                       
Revision 0.75-J1                           4 Dec 2000                  

ƒvƒƒOƒ‰ƒ}—p‚Ì‚±‚Ì HOWTO ‚ł́ALinux ã‚ŃvƒƒOƒ‰ƒ€ƒ‰ƒCƒuƒ‰ƒŠ‚ðì¬AŽg
—p‚·‚é•û–@‚ð˜_‚¶‚Ü‚·B‚±‚±‚ɂ́AÃ“Iƒ‰ƒCƒuƒ‰ƒŠA‹¤—Lƒ‰ƒCƒuƒ‰ƒŠA“®“I‚É
ƒ[ƒh‚³‚ê‚郉ƒCƒuƒ‰ƒŠA‚ªŠÜ‚Ü‚ê‚Ü‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

Table of Contents
1. ‚Í‚¶‚ß‚É
2. Ã“Iƒ‰ƒCƒuƒ‰ƒŠ
3. ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ
   
    3.1. –ñ‘©‚²‚Æ
       
        3.1.1. ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ–¼
        3.1.2. ƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€”z’u
       
    3.2. ƒ‰ƒCƒuƒ‰ƒŠ‚͂ǂ̂悤‚ÉŽg‚í‚ê‚é‚©
    3.3. ŠÂ‹«•Ï”
    3.4. ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚̍쐬
    3.5. ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚̃Cƒ“ƒXƒg[ƒ‹‚ÆŽg—p
    3.6. ”ñŒÝŠ·ƒ‰ƒCƒuƒ‰ƒŠ
   
4. “®“I‚Ƀ[ƒh‚³‚ê‚é (Dynamically Loaded; DL) ƒ‰ƒCƒuƒ‰ƒŠ
   
    4.1. dlopen()
    4.2. dlerror()
    4.3. dlsym()
    4.4. dlclose()
    4.5. DL ƒ‰ƒCƒuƒ‰ƒŠ‚Ì—á
   
5. ŽG˜^
   
    5.1. nm ƒRƒ}ƒ“ƒh
    5.2. “Á•Ê‚Ȋ֐” _init ‚Æ _fini
    5.3. ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚̓XƒNƒŠƒvƒg‰»‚Å‚«‚é
    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. ’˜ìŒ ‚ƃ‰ƒCƒZƒ“ƒX

1. ‚Í‚¶‚ß‚É

ƒvƒƒOƒ‰ƒ}‚Ì‚½‚ß‚Ì‚±‚Ì HOWTO ‚́AGNU ƒc[ƒ‹ƒZƒbƒg‚ðŽg—p‚µ‚Ä‚¢‚é Linux
ã‚ŃvƒƒOƒ‰ƒ€ƒ‰ƒCƒuƒ‰ƒŠ‚ðì¬AŽg—p‚·‚é•û–@‚ð˜_‚¶‚Ü‚·B ``ƒvƒƒOƒ‰ƒ€ƒ‰
ƒCƒuƒ‰ƒŠ'' ‚Ƃ́A’P‚ɁA‚ ‚ƂŃvƒƒOƒ‰ƒ€‚É‘g‚ݍž‚Ü‚ê‚邱‚Æ‚É‚È‚éƒRƒ“ƒpƒC
ƒ‹Ï‚݂̃R[ƒh (‹y‚уf[ƒ^) ‚ðŠÜ‚Þƒtƒ@ƒCƒ‹‚Ì‚±‚Æ‚Å‚·BƒvƒƒOƒ‰ƒ€ƒ‰ƒCƒu
ƒ‰ƒŠ‚́AƒvƒƒOƒ‰ƒ€‚ðA‚æ‚胂ƒWƒ…[ƒ‹‰»‚µA‚æ‚葬‚­ÄƒRƒ“ƒpƒCƒ‹‚Å‚«A‚æ
‚èŠÈ’P‚ɍXV‚Å‚«‚é‚à‚Ì‚É‚µ‚Ü‚·BƒvƒƒOƒ‰ƒ€ƒ‰ƒCƒuƒ‰ƒŠ‚́AŽO‚‚̃^ƒCƒv\
\Ã“Iƒ‰ƒCƒuƒ‰ƒŠA‹¤—Lƒ‰ƒCƒuƒ‰ƒŠA“®“I‚Ƀ[ƒh‚³‚ê‚é (dynamically
loaded; DL) ƒ‰ƒCƒuƒ‰ƒŠ\\‚É•ª—Þ‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

‚±‚Ì•¶‘‚́AÅ‰‚ɁAÃ“Iƒ‰ƒCƒuƒ‰ƒŠ\\ƒvƒƒOƒ‰ƒ€‚ªŽÀs‚³‚ê‚é‘O‚É‚»‚ÌŽÀ
s‰Â”\ƒvƒƒOƒ‰ƒ€‚É‘g‚ݍž‚Ü‚ê‚郉ƒCƒuƒ‰ƒŠ\\‚ɂ‚¢‚Ę_‚¶‚Ü‚·B‚»‚ê‚©‚ç
A‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ\\ƒvƒƒOƒ‰ƒ€ŽÀsŽž‚Ƀ[ƒh‚³‚êA‚©‚•¡”‚̃vƒƒOƒ‰ƒ€
ŠÔ‚Å‹¤—L‚³‚ê‚郉ƒCƒuƒ‰ƒŠ\\‚ɂ‚¢‚Ę_‚¶‚Ü‚·BÅŒã‚ɁA“®“I‚Ƀ[ƒh‚³‚ê
‚é (dynamically loaded; DL) ƒ‰ƒCƒuƒ‰ƒŠ\\ƒvƒƒOƒ‰ƒ€ŽÀs’†‚Ì”CˆÓ‚ÌŽž“_
‚э[ƒh‚µ‚ÄŽg—p‚·‚邱‚Æ‚ª‰Â”\‚ȃ‰ƒCƒuƒ‰ƒŠ\\‚ɂ‚¢‚Ę_‚¶‚Ü‚·B DL ƒ‰
ƒCƒuƒ‰ƒŠ‚́AŽÀÛ‚ɂ͈قȂ郉ƒCƒuƒ‰ƒŠŒ`Ž®‚Æ‚¢‚¤‚킯‚Å‚Í‚ ‚è‚Ü‚¹‚ñ (Ã“I
ƒ‰ƒCƒuƒ‰ƒŠ‚à‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚à DL ƒ‰ƒCƒuƒ‰ƒŠ‚Æ‚µ‚ÄŽg—p‚·‚邱‚Æ‚ª‰Â”\‚Å‚·)
B‚»‚Ì‘ã‚í‚è‚ɁAƒvƒƒOƒ‰ƒ}‚ª DL ƒ‰ƒCƒuƒ‰ƒŠ‚ð‚ǂ̂悤‚ÉŽg—p‚·‚é‚©‚Æ‚¢‚¤
“_‚É‚¨‚¢‚āAˆá‚¢‚ª‚ ‚è‚Ü‚·BHOWTO ‚́A‚³‚ç‚É‘½‚­‚Ì—á‚ð‹“‚°‚Ä‚¢‚éÍA‚»
‚Ì‘¼‚̏î•ñŒ¹‚Ö‚ÌŽQÆ‚ð‹“‚°‚Ä‚¢‚éÍA‚ð‚à‚Á‚ďI—¹‚µ‚Ü‚·B

‚±‚Ì HOWTO ‚ÍŽÀs‰Â”\ƒtƒ@ƒCƒ‹‚ƃ‰ƒCƒuƒ‰ƒŠ‚Ì‚½‚ß‚Ì Executable and
Linking Format (ELF) Œ`Ž®\\ð¡‚Ì‚Ù‚Æ‚ñ‚Ç‘S‚Ä‚Ì Linux ƒfƒBƒXƒgƒŠƒrƒ…
[ƒVƒ‡ƒ“‚ÅŽg—p‚³‚ê‚Ä‚¢‚éŒ`Ž®\\‚ɂ‚¢‚Ă̂ݘ_‚¶‚Ü‚·B GNU gcc ƒc[ƒ‹ƒZ
ƒbƒg‚́AŽÀÛ‚É‚Í ELF ˆÈŠO‚̃‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ðˆµ‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B“Á‚ɁA‚Ù
‚Æ‚ñ‚Ç‚Ì Linux ƒfƒBƒXƒgƒŠƒrƒ…[ƒVƒ‡ƒ“‚ł́A‹ŒŽ®‚Ì a.out Œ`Ž®‚ð¡‚È‚¨Žg
—p‚·‚邱‚Æ‚ª‰Â”\‚Å‚·B‚µ‚©‚µ‚È‚ª‚çA‚±‚ê‚ç‚ÌŒ`Ž®‚Í‚±‚Ì•¶‘‚̑ΏۊO‚Å‚·
B

‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ðŽw‚µ‚Ä dynamically linked libraries (DLL) ‚Æ‚¢‚¤—pŒê‚ð
Žg‚¤l‚ª‚¢‚邱‚ƁA‚»‚Ì DLL ‚Æ‚¢‚¤—pŒê‚ð DL ƒ‰ƒCƒuƒ‰ƒŠ‚Æ‚µ‚ÄŽg—p‚³‚ê‚é”C
ˆÓ‚̃‰ƒCƒuƒ‰ƒŠ‚ðˆÓ–¡‚·‚邽‚ß‚ÉŽg‚¤l‚ª‚¢‚邱‚ƁA‚Ü‚½A‚Ç‚¿‚ç‚©‚ÌðŒ‚ð
–ž‚½‚·ƒ‰ƒCƒuƒ‰ƒŠ‚ðˆÓ–¡‚·‚邽‚ß‚É DLL ‚Æ‚¢‚¤—pŒê‚ðŽg‚¤l‚ª‚¢‚邱‚ƁA‚É‚Í
’ˆÓ‚µ‚½‚Ù‚¤‚ª‚æ‚¢‚Å‚·B‚¢‚¸‚ê‚̈Ӗ¡‚ðŽæ‚èã‚°‚é‚É‚µ‚Ä‚àA‚±‚Ì HOWTO ‚Í
Linux ã‚Å‚Ì‚±‚ê‚ç‘S‚Ä‚Ì DLL ‚ɂ‚¢‚ăJƒo[‚µ‚Ü‚·B

‘½‚­‚̃VƒXƒeƒ€‚ɈڐA‚³‚ê‚éƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ðì¬‚µ‚Ä‚¢‚é‚È‚ç‚΁Aƒ‰ƒCƒu
ƒ‰ƒŠ‚ð\’z‚µƒCƒ“ƒXƒg[ƒ‹‚·‚é‚̂ɁALinux ƒc[ƒ‹‚𒼐ڎg—p‚·‚é‘ã‚í‚è‚É 
GNU libtool <http://www.gnu.org/software/libtool/libtool.html> ‚ðŽg—p‚·
‚邱‚Æ‚ðl—¶‚µ‚½‚Ù‚¤‚ª‚æ‚¢‚©‚à‚µ‚ê‚Ü‚¹‚ñBGNU libtool ‚́A‹¤—Lƒ‰ƒCƒuƒ‰
ƒŠŽg—p‚Ì•¡ŽG‚³ (—Ⴆ‚΁A‚»‚ê‚ç‚ðì¬‚µƒCƒ“ƒXƒg[ƒ‹‚·‚é‚È‚Ç) ‚ðˆêŠÑ«‚Ì
‚ ‚éƒ|[ƒ^ƒuƒ‹‚ȃCƒ“ƒ^[ƒtƒF[ƒX‚ʼnB‚·A”Ä—p“I‚ȃ‰ƒCƒuƒ‰ƒŠƒTƒ|[ƒgƒXƒN
ƒŠƒvƒg‚Å‚·BLinux ã‚ł́AGNU libtool ‚Í‚±‚Ì HOWTO ‚É‹Lq‚³‚ê‚Ä‚¢‚éƒc[
ƒ‹‚ÆŠµK‚̏ã‚ɍ\’z‚³‚ê‚Ä‚¢‚Ü‚·B“®“I‚Ƀ[ƒh‚³‚ê‚郉ƒCƒuƒ‰ƒŠ‚ւ̃|[ƒ^
ƒuƒ‹‚ȃCƒ“ƒ^[ƒtƒF[ƒX—p‚ɁA—lX‚ȃ|[ƒ^ƒrƒŠƒeƒBƒ‰ƒbƒp[‚ðŽg—p‚·‚邱‚Æ
‚ª‚Å‚«‚Ü‚·BGNU libtool ‚́A ``libltdl'' ‚ƌĂ΂ê‚é‚»‚ÌŽí‚̃‰ƒbƒp[‚ðŠÜ
‚ñ‚Å‚¢‚Ü‚·B‘¼‚Ì‘I‘ðŽˆ‚Æ‚µ‚ẮA‰Â”À«‚Ì‚ ‚é•û–@‚Å“®“Iƒ[ƒfƒBƒ“ƒO‚ðƒT
ƒ|[ƒg‚·‚é glib ƒ‰ƒCƒuƒ‰ƒŠ (glibc ‚ƍ¬“¯‚µ‚È‚¢‚Å‚­‚¾‚³‚¢) ‚ðŽg—p‚·‚邱
‚Æ‚à‚Å‚«‚Ü‚·Bglib ‚ɂ‚¢‚ẮA http://developer.gnome.org/doc/API/glib
/glib-dynamic-loading-of-modules.html ‚Å‚³‚ç‚É’m‚邱‚Æ‚ª‚Å‚«‚Ü‚·BÄ“x
q‚ׂ܂·‚ªALinux ã‚ł́A‚±‚Ì‹@”\‚́A‚±‚Ì HOWTO “à‚É‹Lq‚³‚ê‚Ä‚¢‚é\¬
•¨‚ðŽg—p‚·‚邱‚Æ‚É‚æ‚Á‚ÄŽÀ‘•‚³‚ê‚Ä‚¢‚Ü‚·B‚à‚µ‚à‚ ‚È‚½‚ªŽÀÛ‚É Linux ã
‚ŃR[ƒh‚ðŠJ”­A‚à‚µ‚­‚̓fƒoƒbƒO‚µ‚Ä‚¢‚é‚È‚ç‚΁A‚¨‚»‚ç‚­‚È‚¨‚³‚ç‚Ì‚±‚Æ
A‚±‚Ì HOWTO “à‚̏î•ñ‚ð—~‚³‚ê‚邱‚Æ‚Å‚µ‚傤B

‚±‚Ì HOWTO ‚̈ꎟ”z•zêŠ‚Í 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) ‚щƒCƒZƒ“ƒX‚³‚ê‚Ä‚¢‚Ü‚·B‚³‚ç‚È‚éî•ñ‚É‚Â
‚¢‚Ă͍Ōã‚̏͂ð“Ç‚ñ‚Å‚­‚¾‚³‚¢B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

2. Ã“Iƒ‰ƒCƒuƒ‰ƒŠ

Ã“Iƒ‰ƒCƒuƒ‰ƒŠ‚́A’ʏí‚̃IƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚Ì’P‚È‚éW‡‘Ì‚Å‚·BŠµK“I
‚ɁAÃ“Iƒ‰ƒCƒuƒ‰ƒŠ‚Í ``.a'' ‚Æ‚¢‚¤Šg’£Žq‚ðŽ‚¿‚Ü‚·B‚±‚̏W‡‘̂́Aar
(archiver) ƒvƒƒOƒ‰ƒ€‚ðŽg—p‚µ‚č쐬‚³‚ê‚Ü‚·BÃ“Iƒ‰ƒCƒuƒ‰ƒŠ‚͈ȑO‚Ù‚Ç‚É
‚ÍŽg‚í‚ê‚È‚­‚È‚Á‚Ä‚¢‚Ü‚·‚ªA‚»‚ê‚́A‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚Ì‚Ù‚¤‚ª—D‚ê‚Ä‚¢‚邱
‚Æ‚É‚æ‚è‚Ü‚· (‚ ‚Ƃŏq‚ׂ܂·)B‚»‚ê‚Å‚à‚Ü‚¾AÃ“Iƒ‰ƒCƒuƒ‰ƒŠ‚ÍŽžXì¬‚³
‚ê\\‚Í‚¶‚ß‚Í—ðŽj“I‚È——R‚Å‘¶Ý‚µ‚Ä‚¢‚½‚Ì‚Å‚·‚ª\\Aà–¾‚·‚é‚Ì‚à‚æ‚è
ŠÈ’P‚Å‚·B

ƒ†[ƒU‚́AƒR[ƒh‚ðÄƒRƒ“ƒpƒCƒ‹‚·‚é•K—v‚à‚È‚­Ã“Iƒ‰ƒCƒuƒ‰ƒŠ‚ðƒvƒƒOƒ‰ƒ€
‚ɃŠƒ“ƒN‚·‚邱‚Æ‚ª‚Å‚«AÄƒRƒ“ƒpƒCƒ‹‚É‚©‚©‚鎞ŠÔ‚ðß–ñ‚Å‚«‚Ü‚·B’\\
ð¡‚Ì‚æ‚荂‘¬‚ȃRƒ“ƒpƒCƒ‰‚Ì‚±‚Æ‚ðl‚¦‚ê‚΁AÄƒRƒ“ƒpƒCƒ‹ŽžŠÔ‚͏d—v‚Å‚Í
‚È‚­‚È‚Á‚Ä‚«‚Ä‚¢‚Ü‚·\\‚»‚Ì‚½‚ß‚É‚±‚Ì——R•t‚¯‚͈ȑO‚Ù‚Ç—L—Í‚Å‚Í‚ ‚è‚Ü
‚¹‚ñBÃ“Iƒ‰ƒCƒuƒ‰ƒŠ‚́A‚»‚ÌŠJ”­ŽÒ‚ªAƒ‰ƒCƒuƒ‰ƒŠ‚ÖƒŠƒ“ƒN‚·‚邱‚Æ‚ðƒvƒ
ƒOƒ‰ƒ}‚É‹–‰Â‚Í‚µ‚½‚¢‚ªƒ‰ƒCƒuƒ‰ƒŠƒ\[ƒXƒR[ƒh‚Í“n‚µ‚½‚­‚Í‚È‚¢A‚Æ‚¢‚¤ê
‡‚É‚µ‚΂µ‚Ζð‚É—§‚¿‚Ü‚· (‚±‚ê‚̓‰ƒCƒuƒ‰ƒŠƒxƒ“ƒ_[‚É‚Æ‚Á‚Ă͍D“s‡‚Å‚·
‚ªA‚»‚̃‰ƒCƒuƒ‰ƒŠ‚ðŽg‚¨‚¤‚Æ‚µ‚Ä‚¢‚éƒvƒƒOƒ‰ƒ}‚É‚Æ‚Á‚Ä‚Í–¾‚ç‚©‚ɍD“s‡
‚Æ‚ÍŒ¾‚¦‚Ü‚¹‚ñ)B˜_—“I‚ɂ́AŽÀs‰Â”\ƒtƒ@ƒCƒ‹‚ɃŠƒ“ƒN‚³‚ê‚éÃ“I ELF ƒ‰
ƒCƒuƒ‰ƒŠ“à‚̃R[ƒh‚͎኱‘¬‚­ (1-5%) “®ì‚·‚é‚Í‚¸‚Å‚·‚ªAŽÀÛ‚ɂ́A‘¼‚Ì
‚²‚¿‚Ⴒ‚¿‚Ⴕ‚½—vˆö‚Ì‚½‚߁A‚»‚Ì’Ê‚è‚ɂȂ邱‚Æ‚Í‹H‚̂悤‚Å‚·B

Ã“Iƒ‰ƒCƒuƒ‰ƒŠ‚ðì¬‚·‚éA‚à‚µ‚­‚ÍŠù‚É‘¶Ý‚·‚éÃ“Iƒ‰ƒCƒuƒ‰ƒŠ‚É‚³‚ç‚ɃI
ƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚ð’ljÁ‚·‚é‚ɂ́AŽŸ‚̂悤‚ȃRƒ}ƒ“ƒh‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢
\\

ar rcs my_library.a file1.o file2.o                                    

‚±‚̃Rƒ}ƒ“ƒh—á‚ł́AÃ“Iƒ‰ƒCƒuƒ‰ƒŠ my_library.a ‚ɃIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹
file1.o ‚Æ file2.o ‚ð•t‚¯‰Á‚¦‚Ä‚¢‚Ü‚·B‚Ü‚¾ my_library.a ‚ª‘¶Ý‚µ‚Ä‚¢‚È
‚¯‚ê‚΁Aì¬‚µ‚Ü‚·BÃ“Iƒ‰ƒCƒuƒ‰ƒŠì¬‚ÉŠÖ‚µ‚Ä‚³‚ç‚ɏî•ñ‚𓾂é‚ɂ́Aar
(1) ‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

ˆê“xÃ“Iƒ‰ƒCƒuƒ‰ƒŠ‚ðì¬‚µ‚Ä‚µ‚Ü‚¤‚ƁA‚»‚ê‚ðŽg‚¢‚½‚­‚Ȃ邱‚Æ‚Å‚µ‚傤B
ŽÀs‰Â”\ƒvƒƒOƒ‰ƒ€‚ðì¬‚·‚é‚Æ‚«‚ɃRƒ“ƒpƒCƒ‹‚ƃŠƒ“ƒNˆ—‚̈ꕔ‚Æ‚µ‚ÄŒÄ
‚эž‚Þ‚±‚ƂŁA‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ðŽg—p‚Å‚«‚Ü‚·BŽÀs‰Â”\ƒtƒ@ƒCƒ‹‚ðì¬‚·‚é
‚Ì‚É gcc(1) ‚ðŽg‚Á‚Ä‚¢‚é‚È‚ç‚΁Aƒ‰ƒCƒuƒ‰ƒŠ‚ðŽw’è‚·‚é‚Ì‚É -l ƒIƒvƒVƒ‡ƒ“
‚ðŽg—p‚Å‚«‚Ü‚·B‚æ‚èÚ‚µ‚¢î•ñ‚ɂ‚¢‚Ä‚Í info:gcc ‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
-l ‚Æ -L ƒIƒvƒVƒ‡ƒ“‚ðŽg‚Á‚āAƒŠƒ“ƒJ ld(1) ‚𒼐ڎg—p‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·
B‚µ‚©‚µ‚È‚ª‚çAld(1) ‚̃Cƒ“ƒ^[ƒtƒF[ƒX‚Í gcc(1) ‚æ‚è‚à•ÏX‚³‚ê‚â‚·‚¢
‚̂ŁA‚Ù‚Æ‚ñ‚ǂ̏ꍇ‚Í gcc(1) ‚ðŽg‚¤‚Ù‚¤‚ª‚æ‚¢‚Å‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

3. ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ

‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚́AƒvƒƒOƒ‰ƒ€‚ª‹N“®‚·‚é‚Æ‚«‚Ƀ[ƒh‚³‚ê‚郉ƒCƒuƒ‰ƒŠ‚Å‚·
B‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ª“KØ‚ɃCƒ“ƒXƒg[ƒ‹‚³‚ê‚é‚ƁA‚»‚ÌŒã‚É‹N“®‚³‚ê‚é‘S‚Ä‚Ì
ƒvƒƒOƒ‰ƒ€‚́AŽ©“®“I‚É‚»‚̐V‚µ‚¢‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ðŽg‚¤‚±‚Æ‚É‚È‚è‚Ü‚·BŽÀ
Û‚ɂ́A‚±‚êˆÈã‚É‚Í‚é‚©‚ɏ_“î‚Őô—û‚³‚ê‚Ä‚¢‚Ü‚·B‚Æ‚¢‚¤‚̂́A Linux ‚É
‚æ‚éƒAƒvƒ[ƒ`‚ÍŽŸ‚Ì‚±‚Æ‚ð‰Â”\‚É‚·‚é‚©‚ç‚Å‚·\\

 E ƒ‰ƒCƒuƒ‰ƒŠ‚ðXV‚µ‚È‚ª‚ç‚àA‚»‚̃‰ƒCƒuƒ‰ƒŠ‚̌­‚ÄŒã•ûŒÝŠ·«‚Ì‚È‚¢
    ƒo[ƒWƒ‡ƒ“‚ðŽg‚¢‚½‚¢‚Æ‚¢‚¤ƒvƒƒOƒ‰ƒ€‚ðAˆË‘R‚Æ‚µ‚ăTƒ|[ƒg‚Å‚«‚é
   
 E “Á•Ê‚ȃvƒƒOƒ‰ƒ€‚ðŽÀs‚·‚é‚Æ‚«A“Á’è‚̃‰ƒCƒuƒ‰ƒŠA‚à‚µ‚­‚̓‰ƒCƒuƒ‰
    ƒŠ“à‚Ì“Á’è‚̊֐”‚Å‚³‚¦ƒI[ƒo[ƒ‰ƒCƒh‚Å‚«‚é
   
 E Šù‚É‘¶Ý‚µ‚Ä‚¢‚郉ƒCƒuƒ‰ƒŠ‚ðŽg—p‚µ‚ăvƒƒOƒ‰ƒ€‚ª“®‚¢‚Ä‚¢‚éŠÔ‚É‚àA
    ‚±‚Ì‘S‚Ä‚ð‚¨‚±‚È‚¤‚±‚Æ‚ª‚Å‚«‚é
   
„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

3.1. –ñ‘©‚²‚Æ

‚±‚ê‚ç‚Ì–]‚Ü‚µ‚¢“Á«‚·‚×‚Ä‚ð‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ªƒTƒ|[ƒg‚·‚邽‚߂ɂ́A‘½‚­
‚ÌŠµK‚ÆŽwj‚ɏ]‚í‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñBƒ‰ƒCƒuƒ‰ƒŠ‚Ì–¼‘OA“Á‚É ``soname''
‚Æ ``real name'' ‚̈Ⴂ‚ɂ‚¢‚Ä (‹y‚Ñ‚»‚ê‚炪‚ǂ̂悤‚É‘ŠŒÝì—p‚·‚é‚©‚É
‚‚¢‚Ä) —‰ð‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B‚Ü‚½A‚»‚ê‚炪ƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€“à‚Ì‚Ç‚Ì
êŠ‚É’u‚©‚ê‚é‚ׂ«‚Å‚ ‚é‚©‚ɂ‚¢‚Ä‚àA—‰ð‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

3.1.1. ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ–¼

‘S‚Ä‚Ì‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚́A``soname'' ‚ƌĂ΂ê‚é“Á•Ê‚È–¼‘O‚ðŽ‚Á‚Ä‚¢‚Ü‚·B
soname ‚Í ``lib'' ‚Æ‚¢‚¤ƒvƒŠƒtƒBƒbƒNƒXAƒ‰ƒCƒuƒ‰ƒŠ‚Ì–¼‘OA``.so'' ‚Æ‚¢
‚¤‹å‚ðŽ‚¿AƒsƒŠƒIƒh‚ƁAƒCƒ“ƒ^[ƒtƒF[ƒX‚ª•ÏX‚³‚ê‚é‚Æ‚«‚É‚Í•K‚¸‘‚₳
‚ê‚éƒo[ƒWƒ‡ƒ“”ԍ†‚ªŒã‚É‘±‚«‚Ü‚· (“Á•Ê‚È—áŠO‚Æ‚µ‚āAÅ’჌ƒxƒ‹‚Ì C ƒ‰ƒC
ƒuƒ‰ƒŠ‚Í ``lib'' ‚Å‚ÍŽn‚Ü‚è‚Ü‚¹‚ñ) BŠ®‘S‚É‹Lq‚³‚ꂽ soname ‚́A‚»‚̃‰
ƒCƒuƒ‰ƒŠŽ©g‚ªŠÜ‚Ü‚ê‚éƒfƒBƒŒƒNƒgƒŠ‚ðƒvƒŠƒtƒBƒbƒNƒX‚Æ‚µ‚ÄŠÜ‚ñ‚Å‚¢‚Ü‚·B
ŽÀÛ‚̃VƒXƒeƒ€‚ł́AŠ®‘S‚É‹Lq‚³‚ꂽ soname ‚́A‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚Ì ``real
name'' ‚Ö‚Ì’P‚È‚éƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚É‚È‚Á‚Ä‚¢‚Ü‚·B

‘S‚Ä‚Ì‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚́A``real name'' \\ŽÀÛ‚̃‰ƒCƒuƒ‰ƒŠƒR[ƒh‚ðŠÜ‚Þ
ƒtƒ@ƒCƒ‹–¼\\‚àŽ‚Á‚Ä‚¢‚Ü‚·Breal name ‚́A soname ‚ɁAƒsƒŠƒIƒhAƒ}ƒC
ƒi[”ԍ†A‚à‚¤ˆê‚ƒsƒŠƒIƒhAƒŠƒŠ[ƒX”ԍ†A‚ð‰Á‚¦‚½‚à‚Ì‚Å‚·BÅŒã‚̃sƒŠ
ƒIƒh‚ƃŠƒŠ[ƒX”ԍ†‚Í‚È‚­‚Ä‚à‚©‚Ü‚¢‚Ü‚¹‚ñBƒ}ƒCƒi[”ԍ†‚ƃŠƒŠ[ƒX”ԍ†‚Í
A‚ǂ̃o[ƒWƒ‡ƒ“‚̃‰ƒCƒuƒ‰ƒŠ‚ªƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚é‚©‚𐳊m‚ÉŽ¦‚µAÝ
’èŠÇ—‚̏•‚¯‚Æ‚È‚è‚Ü‚·B‚±‚ê‚ç‚̔ԍ†‚́A\\‚»‚̂悤‚É‚·‚ê‚Ε¨Ž–‚ð‚æ‚è
’Pƒ‰»‚Å‚«‚é‚É‚à‚©‚©‚í‚炸\\ƒhƒLƒ…ƒƒ“ƒg‚Ì’†‚щƒCƒuƒ‰ƒŠ‚ðà–¾‚·‚é‚Ì
‚É—p‚¢‚ç‚ê‚Ä‚¢‚é”ԍ†‚Æ“¯‚¶‚Å‚Í‚È‚¢‚©‚à‚µ‚ê‚È‚¢A‚Æ‚¢‚¤‚±‚Æ‚É’ˆÓ‚µ‚Ä‚­
‚¾‚³‚¢B

‰Á‚¦‚āAƒ‰ƒCƒuƒ‰ƒŠ—v‹Žž‚ɃRƒ“ƒpƒCƒ‰‚ªŽg—p‚·‚é–¼‘O‚Æ‚¢‚¤‚à‚Ì‚à‚ ‚è‚Ü‚·
(``linker name'' ‚ƌĂڂ¤‚ÆŽv‚¢‚Ü‚·) B‚»‚ê‚́A’P‚ɁAˆêØ‚̃o[ƒWƒ‡ƒ“”Ô
†‚ðŽæ‚菜‚¢‚½ soname ‚Å‚·B

‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ðŠÇ—‚·‚錮‚Æ‚È‚é‚̂́A‚±‚ê‚ç‚Ì–¼‘O‚ÌŽg‚¢•ª‚¯‚Å‚·B•K—v
‚ƂȂ鋤—Lƒ‰ƒCƒuƒ‰ƒŠ‚̈ꗗ•\‚ð“à•”‚ɍ쐬‚·‚é‚Æ‚«‚ɂ́AƒvƒƒOƒ‰ƒ€‚́A•K
—v‚Æ‚È‚é soname ‚ðƒŠƒXƒgƒAƒbƒv‚·‚é‚Ì‚Ý‚Æ‚µ‚Ü‚·B‹t‚ɁA‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ð
ì¬‚·‚é‚Æ‚«‚ɂ́A(‚æ‚èÚ×‚ȃo[ƒWƒ‡ƒ“î•ñ‚ðŽ‚Â) “Á’è‚̃tƒ@ƒCƒ‹–¼‚щ
ƒCƒuƒ‰ƒŠ‚ðì¬‚·‚é‚Ì‚Ý‚Æ‚µ‚Ü‚·BV‚µ‚¢ƒo[ƒWƒ‡ƒ“‚̃‰ƒCƒuƒ‰ƒŠ‚ðƒCƒ“ƒXƒg
[ƒ‹‚·‚é‚Æ‚«‚ɂ́A“ñAŽO‚Ì“Á•Ê‚ȃfƒBƒŒƒNƒgƒŠ‚Ì‚¤‚¿‚̈ê‚‚ɂ»‚ê‚ðƒCƒ“ƒX
ƒg[ƒ‹‚µA‚»‚ê‚©‚ç ldconfig(8) ƒvƒƒOƒ‰ƒ€‚ðŽÀs‚µ‚Ü‚·Bldconfig ‚́AŠù
‚É‘¶Ý‚·‚éƒtƒ@ƒCƒ‹‚𒲂ׁAreal name ‚ւ̃Vƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚Æ‚µ‚āA
soname ‚ðì¬‚µ‚Ü‚·B“¯—l‚É‚µ‚āAƒLƒƒƒbƒVƒ…ƒtƒ@ƒCƒ‹ /etc/ld.so.cache ‚à
Ý’肵‚Ü‚· (‚·‚®‚Éà–¾‚µ‚Ü‚·)B

ldconfig ‚Í linker name ‚ðÝ’肵‚Ü‚¹‚ñB“TŒ^“I‚ɂ́A‚±‚̐ݒè‚̓‰ƒCƒuƒ‰
ƒŠƒCƒ“ƒXƒg[ƒ‹Žž‚É‚¨‚±‚È‚í‚êA``ÅV‚Ì'' soname ‚à‚µ‚­‚͍ŐV‚Ì realname
‚Ö‚Ì’P‚È‚éƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚Æ‚µ‚āAlinker name ‚ªì¬‚³‚ê‚Ü‚·B‚Ù‚Æ‚ñ
‚ǂ̏ꍇ‚É‚¨‚¢‚āAƒ‰ƒCƒuƒ‰ƒŠ‚ðXV‚µ‚½‚çAƒŠƒ“ƒNŽž‚É‚»‚ê‚ðŽ©“®“I‚ÉŽg—p
‚µ‚½‚¢‚ÆŽv‚¤‚Å‚µ‚傤‚©‚çAsoname ‚ւ̃Vƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚Æ‚µ‚Ä linker
name ‚ðì‚Á‚Ä‚¨‚­‚±‚Æ‚ð‚¨Š©‚ß‚µ‚Ü‚·BŽ„‚́A‚È‚º ldconfig ‚ÍŽ©“®“I‚É
linker name ‚ðÝ’肵‚È‚¢‚Ì‚©‚ðAH. J. Lu ‚ɐq‚Ë‚Ü‚µ‚½B”Þ‚Ìà–¾‚́AŠî–{
“I‚ɂ́Auƒ‰ƒCƒuƒ‰ƒŠ‚̍ŐVƒo[ƒWƒ‡ƒ“‚ðŽg‚Á‚ăR[ƒh‚ðŽÀs‚µ‚½‚¢‚ÆŽv‚í‚ê
‚é‚©‚à’m‚ê‚Ü‚¹‚ñ‚ªA‚»‚¤‚Å‚Í‚È‚­A(‚¨‚»‚ç‚­ŒÝŠ·«‚Ì‚È‚¢) ŒÃ‚¢ƒ‰ƒCƒuƒ‰ƒŠ
‚ɃŠƒ“ƒN‚·‚éŠJ”­‚ð–]‚ñ‚Å‚¢‚é‚Æ‚¢‚¤‚±‚Æ‚à‚ ‚肤‚é‚Ì‚Å‚·vA‚Æ‚¢‚¤‚à‚Ì‚Å
‚µ‚½B‚»‚Ì‚½‚߁Aldconfig ‚́A‚ ‚È‚½‚ª‚ǂ̃‰ƒCƒuƒ‰ƒŠ‚ɃvƒƒOƒ‰ƒ€‚ðƒŠƒ“ƒN
‚³‚¹‚½‚¢‚Ì‚©‚Æ‚¢‚¤‚±‚Ƃɂ‚¢‚ẮA‰½‚̉¼’è‚à‚¨‚±‚È‚¢‚Ü‚¹‚ñB‚Å‚·‚̂ŁA
ƒŠƒ“ƒJ‚ªƒ‰ƒCƒuƒ‰ƒŠ‚ÉŽg‚¤‚à‚Ì‚ðXV‚·‚邽‚߂ɂ́AƒCƒ“ƒXƒg[ƒ‰‚ªƒVƒ“ƒ{ƒŠ
ƒbƒNƒŠƒ“ƒN‚𖾊m‚ɕύX‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢‚Ì‚Å‚·B

—Ⴆ‚΁A/usr/lib/libreadline.so.3 ‚ÍŠ®‘S‚É‹Lq‚³‚ꂽ soname ‚Å‚ ‚èA
ldconfig ‚ª /usr/lib/libreadline.so.3.0 ‚Æ‚¢‚¤‚悤‚ȉ½‚ç‚©‚Ì real name
‚ɑ΂·‚éƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚Æ‚µ‚Đݒ肷‚é‚à‚Ì‚Å‚·B /usr/lib/
libreadline.so ‚Æ‚¢‚¤ linker name ‚à‘¶Ý‚·‚é‚ׂ«‚ŁA‚»‚ê‚́A /usr/lib/
libreadline.so.3 ‚ðŽQÆ‚·‚éƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚ɂȂ邱‚Æ‚Å‚µ‚傤B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

3.1.2. ƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€”z’u

‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚̓tƒ@ƒCƒ‹ƒVƒXƒeƒ€‚Ì‚Ç‚±‚©‚É”z’u‚³‚ê‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB
‚Ù‚Æ‚ñ‚ǂ̃I[ƒvƒ“ƒ\[ƒXƒ\ƒtƒgƒEƒFƒA‚́AGNU ‹K€‚ɏ]‚¤ŒXŒü‚ª‚ ‚è‚Ü‚·\
\Ú×‚Í info:standards#Directory_Variables ‚É‚ ‚é info ƒtƒ@ƒCƒ‹ƒhƒLƒ…
ƒƒ“ƒg‚ðŒ©‚Ä‚­‚¾‚³‚¢B GNU ‹K€‚́Aƒ\[ƒXƒR[ƒh‚ð”z•z‚·‚é‚Æ‚«AƒfƒtƒHƒ‹
ƒg‚Å‚Í‘S‚Ẵ‰ƒCƒuƒ‰ƒŠ‚ð /usr/local/lib ‚ɃCƒ“ƒXƒg[ƒ‹‚·‚邱‚Ƃ𐄏§‚µ
‚Ä‚¢‚Ü‚· (‘S‚ẴRƒ}ƒ“ƒh‚ª /usr/local/bin ‚É“ü‚é‚ׂ«‚¾‚Æ‚àŠ©‚ß‚Ä‚¢‚Ü‚·)
B‚Ü‚½A‚±‚ê‚ç‚̃fƒtƒHƒ‹ƒg‚ðƒI[ƒo[ƒ‰ƒCƒh‚µ‚½‚èAƒCƒ“ƒXƒg[ƒ‹ƒ‹[ƒ`ƒ“
‚ðŒÄ‚яo‚µ‚½‚è‚·‚邽‚ß‚ÌŠµK‚ð‚Í‚Á‚«‚èq‚ׂĂ¢‚Ü‚·B

ƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€ŠK‘w‹K€ (Filesystem Hierarchy Starndard; FHS) ‚́AƒfƒB
ƒXƒgƒŠƒrƒ…[ƒVƒ‡ƒ“‚É‚¨‚¢‚ĉ½‚ª‚Ç‚±‚ɃCƒ“ƒXƒg[ƒ‹‚³‚ê‚é‚ׂ«‚©‚ð˜_‚¶‚Ä‚¢
‚Ü‚· (http://www.pathname.com/fhs ‚ðŒ©‚Ä‚­‚¾‚³‚¢) B FHS ‚ɏ]‚¦‚΁A‚Ù‚Æ
‚ñ‚ǂ̃‰ƒCƒuƒ‰ƒŠ‚Í /usr/lib ‚ɃCƒ“ƒXƒg[ƒ‹‚³‚ê‚é‚ׂ«‚Å‚·‚ªA‹N“®‚É•K—v
‚Æ‚³‚ê‚郉ƒCƒuƒ‰ƒŠ‚Í /lib ‚ɁA‚»‚µ‚ăVƒXƒeƒ€‚̈ꕔ‚É‚È‚Á‚Ä‚Í‚¢‚È‚¢ƒ‰ƒC
ƒuƒ‰ƒŠ‚Í /usr/local/lib ‚ɃCƒ“ƒXƒg[ƒ‹‚³‚ê‚é‚ׂ«‚Å‚·B

ŽÀÛ‚ɂ́A‚±‚ê‚ç“ñ‚‚̕¶‘ŠÔ‚É–µ‚‚Í‚ ‚è‚Ü‚¹‚ñBGNU ‹K€‚́Aƒ\[ƒXƒR[
ƒhŠJ”­ŽÒ‚Ì‚½‚߂̃fƒtƒHƒ‹ƒg‚𐄏§‚µ‚Ä‚¢‚é‚Ì‚Å‚ ‚èAˆê•û‚Å FHS ‚́AƒfƒBƒX
ƒgƒŠƒrƒ…[ƒ^ (’ʏíAƒVƒXƒeƒ€ƒpƒbƒP[ƒWŠÇ—ƒVƒXƒeƒ€‚ð’Ê‚µ‚ă\[ƒXƒR[ƒh
‚̃fƒtƒHƒ‹ƒg‚ð‘I‘ð“I‚ɃI[ƒo[ƒ‰ƒCƒh‚·‚élX) ‚Ì‚½‚߂̃fƒtƒHƒ‹ƒg‚𐄏§
‚µ‚Ä‚¢‚é‚Ì‚Å‚·BŽÀÛ‚É‚±‚ê‚Í‚¤‚Ü‚­‹@”\‚µ‚Ä‚¢‚Ü‚·B‚ ‚È‚½‚ªƒ_ƒEƒ“ƒ[ƒh
‚µ‚½ ``ÅV‚Ì'' (‚¨‚»‚ç‚­ƒoƒO‚¾‚炯‚Ì!) ƒ\[ƒXƒR[ƒh‚́AŽ©“®“I‚ÉŽ©•ªŽ©
g‚ð ``ƒ[ƒJƒ‹‚È'' ƒfƒBƒŒƒNƒgƒŠ (/usr/local/) ‚ɃCƒ“ƒXƒg[ƒ‹‚µ‚Ü‚·B‚»
‚µ‚ăR[ƒh‚ª¬n‚µ‚Ä‚«‚½‚çAƒpƒbƒP[ƒWŠÇ—ƒc[ƒ‹‚́AƒfƒBƒXƒgƒŠƒrƒ…[ƒV
ƒ‡ƒ“—p‚Ì•W€“I‚Ȉʒu‚ɃR[ƒh‚ð”z’u‚·‚邽‚߂ɃfƒtƒHƒ‹ƒg‚ð’P‚ɃI[ƒo[ƒ‰
ƒCƒh‚Å‚«‚Ü‚·B‚ ‚È‚½‚̃‰ƒCƒuƒ‰ƒŠ‚ªAƒ‰ƒCƒuƒ‰ƒŠŒo—R‚Å‚µ‚©ŒÄ‚яo‚³‚ê‚邱
‚Æ‚Ì‚È‚¢ƒvƒƒOƒ‰ƒ€‚ðŒÄ‚яo‚µ‚Ä‚¢‚é‚Ì‚È‚ç‚΁A‚»‚ê‚ç‚̃vƒƒOƒ‰ƒ€‚ð /usr/
local/libexec (‚ ‚éƒfƒBƒXƒgƒŠƒrƒ…[ƒVƒ‡ƒ“‚Å‚Í /usr/libexec ‚É‚È‚è‚Ü‚·)
‚É”z’u‚·‚é‚ׂ«‚Å‚·Bˆê‚ÂŽ–‘Ô‚ð•¡ŽG‚É‚µ‚Ä‚¢‚邱‚Æ‚ª‚ ‚Á‚āA‚»‚ê‚́A Red
Hat ‚©‚ç”h¶‚µ‚½ƒVƒXƒeƒ€‚ªƒfƒtƒHƒ‹ƒg‚Å‚Í /usr/local/lib ‚ðƒ‰ƒCƒuƒ‰ƒŠŒŸ
õ‘ΏۂɊ܂߂Ă¢‚È‚¢‚Æ‚¢‚¤‚±‚Æ‚Å‚·B /etc/ld.so.conf ‚ÉŠÖ‚·‚鉺‹L‚Ì‹c˜_
‚ðŒ©‚Ä‚­‚¾‚³‚¢B‘¼‚Ì•W€“I‚ȃ‰ƒCƒuƒ‰ƒŠƒƒP[ƒVƒ‡ƒ“‚Æ‚µ‚ẮAX Window
System —p‚Ì /usr/X11R6/lib ‚ªŠÜ‚Ü‚ê‚Ü‚·B /lib/security ‚Í PAM ƒ‚ƒWƒ…[
ƒ‹—p‚ÉŽg‚í‚ê‚Ü‚·‚ªA‚»‚ê‚ç‚͒ʏí DL ƒ‰ƒCƒuƒ‰ƒŠ (‚±‚ê‚à‚ ‚Æ‚Åà–¾‚µ‚Ü‚·)
‚Æ‚µ‚㍁[ƒh‚³‚ê‚éA‚Æ‚¢‚¤‚±‚Æ‚É’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

3.2. ƒ‰ƒCƒuƒ‰ƒŠ‚͂ǂ̂悤‚ÉŽg‚í‚ê‚é‚©

GNU glibc ƒx[ƒX‚̃VƒXƒeƒ€\\‘S‚Ä‚Ì Linux ƒVƒXƒeƒ€‚ðŠÜ‚Ý‚Ü‚·\\‚ł́A
ELF ƒoƒCƒiƒŠŽÀsƒtƒ@ƒCƒ‹‚ð‹N“®‚³‚¹‚é‚ƁAŽ©“®“I‚ɃvƒƒOƒ‰ƒ€ƒ[ƒ_‚ªƒ[
ƒh‚³‚êAŽÀs‚³‚ê‚Ü‚·B Linux ƒVƒXƒeƒ€ã‚ł́A‚±‚̃[ƒ_‚Í /lib/
ld-linux.so.X (X ‚ɂ̓o[ƒWƒ‡ƒ“”ԍ†‚ª“ü‚è‚Ü‚·) ‚Æ‚¢‚¤–¼‘O‚Å‚·B‚±‚̃[
ƒ_‚́AƒvƒƒOƒ‰ƒ€‚É‚æ‚Á‚ÄŽg—p‚³‚ê‚é‚»‚Ì‘¼‚Ì‘S‚Ä‚Ì‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ð‡ŽŸ’T
‚µo‚µAƒ[ƒh‚µ‚Ü‚·B

ŒŸõ‘ΏۂƂȂéƒfƒBƒŒƒNƒgƒŠ‚̃ŠƒXƒg‚́A/etc/ld.so.conf ƒtƒ@ƒCƒ‹“à‚ɏ‘‚©
‚ê‚Ä‚¢‚Ü‚·BRed Hat ‚©‚ç”h¶‚µ‚Ä‚¢‚éƒfƒBƒXƒgƒŠƒrƒ…[ƒVƒ‡ƒ“‚Ì‘½‚­‚́A’Ê
í /etc/ld.so.conf ƒtƒ@ƒCƒ‹“à‚É /usr/local/lib ‚ðŠÜ‚ß‚Ä‚¢‚Ü‚¹‚ñBŽ„‚Í‚±
‚ê‚ðƒoƒO‚¾‚ƍl‚¦‚Ä‚¨‚èA‚Ü‚½A/usr/local/lib ‚ð /etc/ld.so.conf ‚ɒljÁ
‚·‚邱‚Ƃ́A Red Hat ‚©‚ç”h¶‚µ‚Ä‚¢‚éƒVƒXƒeƒ€ã‚Å‘½‚­‚̃vƒƒOƒ‰ƒ€‚ð‘–‚ç
‚¹‚邽‚ß‚É•K—v‚Æ‚³‚ê‚éA‹¤’Ê‚Ì ``C³'' ‚¾‚ÆŽv‚Á‚Ä‚¢‚Ü‚·B

ƒ‰ƒCƒuƒ‰ƒŠ“à‚ÌŠô‚‚©‚̊֐”‚ðƒI[ƒo[ƒ‰ƒCƒh‚µ‚½‚¢‚¾‚¯‚ŁAŽc‚è‚Í‚»‚Ì‚Ü‚Ü
‚É‚µ‚Ä‚¨‚«‚½‚¢‚È‚ç‚΁AƒI[ƒo[ƒ‰ƒCƒh‚·‚郉ƒCƒuƒ‰ƒŠ (.o ƒtƒ@ƒCƒ‹) ‚Ì–¼‘O
‚ð /etc/ld.so.preload ‚É“ü‚ê‚邱‚Æ‚ª‚Å‚«‚Ü‚·B‚±‚ê‚ç‚Ì ``æs‚µ‚㍁[ƒh
‚·‚é'' ƒ‰ƒCƒuƒ‰ƒŠ‚́A•W€ƒZƒbƒg‚ɐæs‚µ‚Ü‚·B‚±‚̐æs‚µ‚㍁[ƒh‚·‚éƒtƒ@
ƒCƒ‹‚́A“TŒ^“I‚É‚Í‹Ù‹}—p‚̃pƒbƒ`‚Æ‚µ‚ÄŽg‚í‚ê‚Ü‚·BƒfƒBƒXƒgƒŠƒrƒ…[ƒVƒ‡
ƒ“‚́A’ʏíA”z•z‚³‚ê‚éÛ‚É‚±‚̂悤‚ȃtƒ@ƒCƒ‹‚ðŠÜ‚Þ‚±‚Æ‚Í‚È‚¢‚Å‚µ‚傤B

ƒvƒƒOƒ‰ƒ€‹N“®Žž‚É‚±‚ê‚ç‘S‚ẴfƒBƒŒƒNƒgƒŠ‚ðŒŸõ‚·‚é‚̂́A‚Æ‚Ä‚à”ñŒø—¦
“I‚Ȃ̂ŁAŽÀÛ‚ɂ̓LƒƒƒbƒVƒ…”z’u‚ªŽg‚í‚ê‚Ü‚·B ldconfig(8) ƒvƒƒOƒ‰ƒ€‚Í
ƒfƒtƒHƒ‹ƒg‚Å /etc/ld.so.conf ƒtƒ@ƒCƒ‹‚ð“ǂݍž‚݁A“KØ‚ȃVƒ“ƒ{ƒŠƒbƒNƒŠƒ“
ƒN‚ð“®“IƒŠƒ“ƒNƒfƒBƒŒƒNƒgƒŠ“à‚ɐݒ肵‚Ü‚· (‚»‚Ì‚½‚߁A•W€‚ÌŠµK‚ɉˆ‚¤‚±
‚Æ‚É‚È‚è‚Ü‚·) B‚»‚ê‚©‚çAƒLƒƒƒbƒVƒ…‚ð /etc/ld.so.cache \\‚ ‚Æ‚Å‘¼‚Ì
ƒvƒƒOƒ‰ƒ€‚ÉŽg‚í‚ê‚Ü‚·\\‚ɏ‘‚«ž‚Ý‚Ü‚·B‚±‚ê‚́Aƒ‰ƒCƒuƒ‰ƒŠ‚ւ̃AƒNƒZ
ƒX‚ð”ñí‚É‘¬‚­‚µ‚Ü‚·BˆÃ–Ù“I‚ÉŒ¾‚¦‚邱‚Ƃ́ADLL ‚ª’ljÁ‚³‚ꂽ‚Æ‚«‚Í•K‚¸
A‚à‚µ‚­‚́ADLL ‚ªíœ‚³‚ꂽ‚èA DLL ƒfƒBƒŒƒNƒgƒŠ‚̃Zƒbƒg‚ª•Ï‰»‚µ‚½‚Æ‚«
‚ɂ́Aldconfig ‚ªŽÀs‚³‚ê‚È‚¯‚ê‚΂Ȃç‚È‚¢A‚Æ‚¢‚¤‚±‚Æ‚Å‚·Bldconfig ‚Ì
ŽÀs‚́Aƒ‰ƒCƒuƒ‰ƒŠƒCƒ“ƒXƒg[ƒ‹Žž‚ɃpƒbƒP[ƒWŠÇ—ƒc[ƒ‹‚É‚æ‚Á‚Ä‚¨‚±‚È‚í
‚ê‚éƒXƒeƒbƒv‚̈ê‚‚ł ‚邱‚Æ‚ª‘½‚¢‚Å‚·B‚»‚êˆÈ~A‹N“®Žž‚ɂ́A“®“Iƒ[
ƒ_‚ÍŽÀÛ‚É /etc/ld.so.cache ƒtƒ@ƒCƒ‹‚ðŽg‚¢A•K—v‚Æ‚·‚郉ƒCƒuƒ‰ƒŠ‚ðƒ[
ƒh‚µ‚Ü‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

3.3. ŠÂ‹«•Ï”

—lX‚Ȋ‹«•Ï”‚ª‚±‚̏ˆ—Žè‡‚𐧌ä‚Å‚«‚Ü‚·BŽ–ŽÀA‚±‚̏ˆ—Žè‡‚ðƒI[ƒo
[ƒ‰ƒCƒh‚·‚é‚Ì‚ÉŽg‚¦‚éŠÂ‹«•Ï”‚ª‘¶Ý‚µ‚Ü‚·B—Ⴆ‚΁A‚±‚Ì“ÁŽê‚ÈŽÀs‚ðA
ˆêŽž“I‚É‘¼‚̃‰ƒCƒuƒ‰ƒŠ‚Å‘ã‘Ö‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B Linux ‚ł́AŠÂ‹«•Ï”
LD_LIBRARY_PATH ‚́A•W€“I‚ȃfƒBƒŒƒNƒgƒŠŒQ‚ɐ旧‚Á‚ă‰ƒCƒuƒ‰ƒŠ‚ªŒŸõ‚³
‚ê‚é‚ׂ«ƒfƒBƒŒƒNƒgƒŠŒQ‚ðAƒRƒƒ“‚Å‹æØ‚Á‚Ä•À‚ׂ½‚à‚Ì‚Å‚·B‚±‚ê‚́AV‚µ
‚¢ƒ‰ƒCƒuƒ‰ƒŠ‚ðƒfƒoƒbƒO‚µ‚Ä‚¢‚é‚Æ‚«‚âA“Á•Ê‚È–Ú“I‚Ì‚½‚ß‚É”ñ•W€“I‚ȃ‰ƒC
ƒuƒ‰ƒŠ‚ðŽg—p‚µ‚Ä‚¢‚é‚Æ‚«‚É•Ö—˜‚Å‚·BŠÂ‹«•Ï” LD_PRELOAD ‚́A•W€ƒZƒbƒg
‚ðƒI[ƒo[ƒ‰ƒCƒh‚·‚éƒIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚ðŠÖ”‚Æ‹¤‚ɁA‚¿‚傤‚Ç /etc/
ld.so.preload ‚Å‚¨‚±‚È‚í‚ê‚Ä‚¢‚é‚悤‚ɁA—ñ‹“‚µ‚Ü‚·B‚±‚ê‚ç‚Ì‹@”\‚́A/
lib/ld-linux.so ƒ[ƒ_‚É‚æ‚èŽÀ‘•‚³‚ê‚Ä‚¢‚Ü‚·B LD_LIBRARY_PATH ‚Í‘½‚­‚Ì
Unix ƒ‰ƒCƒN‚ȃVƒXƒeƒ€ã‚Å‹@”\‚µ‚Ü‚·‚ªA‘S‚ẴVƒXƒeƒ€ã‚Å“®‚­‚킯‚Å‚Í‚È
‚¢‚±‚Æ‚É’ˆÓ‚µ‚Ü‚µ‚傤B—Ⴆ‚΁AHP-UX ‚Å‚à“¯‚¶‹@”\‚ª—˜—p‚Å‚«‚Ü‚·‚ªA‚»
‚ê‚Í SHLIB_PATH ‚Æ‚µ‚Ä‚Å‚·‚µAAIX ‚Å‚Í LIBPATH ‚ð’Ê‚¶‚Ä‚Æ‚¢‚¤‚±‚Æ‚É‚È‚è
‚Ü‚·B‚Ü‚½ALD_LIBRARY_PATH ‚ÍŠJ”­‚âƒeƒXƒg‚É‚Í•Ö—˜‚Å‚Í‚ ‚è‚Ü‚·‚ªA’ʏí
Žg—p‚Ì‚½‚߂ɃCƒ“ƒXƒg[ƒ‹Žž‚ɏC³‚³‚ê‚é‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB‚±‚Ì——R‚̐à
–¾‚ɂ‚¢‚ẮA http://www.visi.com/~barr/ldpath.html ‚Ì ``‚È‚º
LD_LIBRARY_PATH ‚Í‚¢‚¯‚È‚¢‚Ì‚©'' ‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

ŽÀÛ‚ɂ́Aƒ[ƒfƒBƒ“ƒOˆ—Žè‡‚𐧌䂷‚éŠÂ‹«•Ï”‚Í‚Ù‚©‚É‚à‚½‚­‚³‚ñ‘¶Ý
‚µ‚Ü‚·B‚»‚ê‚ç‚Ì–¼‘O‚́ALD_ ‚â RTLD_ ‚Å‚Í‚¶‚Ü‚è‚Ü‚·B‚»‚ê‚ç‚Ì‚Ù‚Æ‚ñ‚Ç‚Í
Aƒ[ƒ_ˆ—‚̒჌ƒxƒ‹‚ȃfƒoƒbƒO‚âA“ÁŽê‰»‚³‚ꂽƒPƒCƒpƒrƒŠƒeƒB‚ðŽÀ‘•‚·
‚邽‚ß‚Ì‚à‚Ì‚Å‚·B‚Ù‚Æ‚ñ‚ǂ́A\•ª‚ɃhƒLƒ…ƒƒ“ƒg‰»‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB‚»‚ê
‚ç‚ɂ‚¢‚Ä’m‚é•K—v‚ª‚ ‚é‚È‚ç‚΁AŠwK‚·‚é‚à‚Á‚Æ‚à‚æ‚¢•û–@‚́Aƒ\[ƒXƒR[
ƒh‚ð“Ç‚Þ‚±‚Æ‚Å‚·B

“Á•Ê‚ȑΏˆ‚ª‚È‚³‚ê‚È‚¢‚È‚ç‚΁A“®“I‚ɃŠƒ“ƒN‚³‚ê‚郉ƒCƒuƒ‰ƒŠ‚ɑ΂·‚鐧Œä
‚ðƒ†[ƒU‚É”F‚ß‚é‚Æ‚¢‚¤‚±‚Ƃ́Asetuid/setgid ƒvƒƒOƒ‰ƒ€‚É‚Æ‚Á‚Ă͔ߎS‚È
‚à‚Ì‚É‚È‚é‚Å‚µ‚傤B‚»‚Ì‚½‚߁AGNU ƒ[ƒ_‚ł́AƒvƒƒOƒ‰ƒ€‚ª setuid ‚à‚µ
‚­‚Í setgid ‚³‚ê‚Ä‚¢‚éê‡A‚±‚ê‚ç‚̕ϐ” (‹y‚Ñ—ÞŽ—‚̕ϐ”) ‚Í–³Ž‹‚³‚ê‚é
‚©A‚à‚µ‚­‚́A‚»‚ê‚炪‚Å‚«‚邱‚Ƃ͑啝‚ɐ§ŒÀ‚³‚ê‚Ü‚·Bƒ[ƒ_‚́AƒvƒƒO
ƒ‰ƒ€‚̐M”CØ (credential) ‚𒲂ׂ邱‚Æ‚É‚æ‚Á‚āA‚»‚̃vƒƒOƒ‰ƒ€‚ª setuid
‚à‚µ‚­‚Í setgid ‚³‚ê‚Ä‚¢‚é‚©‚Ç‚¤‚©‚ðŠm”F‚µ‚Ü‚·B‚à‚µ‚à uid ‚Æ euid ‚ªˆÙ
‚È‚é‚©A‚à‚µ‚­‚Í gid ‚Æ egid ‚ªˆÙ‚È‚é‚È‚çAƒ[ƒ_‚Í‚»‚̃vƒƒOƒ‰ƒ€‚ª
setuid/setgid ‚³‚ê‚Ä‚¢‚é (‚à‚µ‚­‚Í‚»‚̂悤‚ȃvƒƒOƒ‰ƒ€‚©‚çŽÀs‚³‚ꂽ)
‚Ɛ„’肵AƒŠƒ“ƒNˆ—‚ðƒRƒ“ƒgƒ[ƒ‹‚·‚é”\—Í‚ð‘啝‚ɐ§ŒÀ‚µ‚Ü‚·B GNU
glibc ƒ‰ƒCƒuƒ‰ƒŠ‚̃\[ƒXƒR[ƒ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 ƒ‰ƒCƒN‚ȃVƒXƒeƒ€‚́A‚±‚̏󋵂ðˆÙ‚È‚é•û–@‚ňµ‚¢‚Ü‚·‚ª
A“¯‚¶——R\\setuid/setgid ƒvƒƒOƒ‰ƒ€‚͊‹«•Ï”ŒQ‚É‚æ‚Á‚ĉߓx‚ɉe‹¿‚ð
Žó‚¯‚é‚ׂ«‚Å‚Í‚È‚¢‚Æ‚¢‚¤——R\\‚É‚æ‚è‚Ü‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

3.4. ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚̍쐬

‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚̍쐬‚ÍŠÈ’P‚Å‚·B‚Ü‚¸‚Í‚¶‚߂ɁAgcc ‚Ì -fPIC ƒtƒ‰ƒO (‚±‚ê
‚́A‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚É•K—v‚Æ‚³‚ê‚é ``ˆÊ’u“Æ—§ƒR[ƒh (position independent
code)'' ‚̐¶¬‚ð‰Â”\‚É‚µ‚Ü‚·) ‚ðŽg‚Á‚āA‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚É‘g‚ݍž‚Ü‚ê‚邱
‚Æ‚É‚È‚éƒIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚ðì¬‚µ‚Ü‚·B‚»‚ê‚©‚çAŽŸ‚ÌŒ`Ž®‚ðŽg‚Á‚Ä‹¤
—Lƒ‰ƒCƒuƒ‰ƒŠ‚ðì¬‚µ‚Ä‚­‚¾‚³‚¢\\

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

“ñ‚‚̃IƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹ (a.o ‚Æ b.o) ‚ðì¬‚µA‚±‚ê‚ç—¼•û‚ðŠÜ‚Þ‹¤—L
ƒ‰ƒCƒuƒ‰ƒŠ‚ðì¬‚·‚é—á‚ð‚±‚±‚É‹“‚°‚Ü‚·BƒRƒ“ƒpƒCƒ‹ˆ—‚ªAƒfƒoƒbƒOî•ñ
(-g) ‚ðŠÜ‚݁AŒxƒƒbƒZ[ƒW‚𐶐¬‚·‚é (-Wall) ‚Æ‚¢‚¤‚±‚Ɓ\\‚±‚ê‚ç‚Í‹¤
—Lƒ‰ƒCƒuƒ‰ƒŠ‚É•K—v‚Æ‚Í‚³‚ê‚Ü‚¹‚ñ‚ª„§‚³‚ê‚Ü‚·\\‚É‚Í’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢
BƒRƒ“ƒpƒCƒ‹ˆ—‚Í (-c ‚ðŽg‚Á‚Ä) ƒIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚𐶐¬‚µA‚»‚µ‚āA
—v‹‚³‚ê‚é -fPIC ƒIƒvƒVƒ‡ƒ“‚ð‚Í‚Á‚«‚è‚ÆŠÜ‚Þ‚±‚Æ‚É‚È‚è‚Ü‚·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 ¶¬‚³‚ꂽƒ‰ƒCƒuƒ‰ƒŠ‚ð strip ‚µ‚È‚¢‚Å‚­‚¾‚³‚¢B‚Ü‚½–{“–‚É•K—v‚Å‚È‚¢
    ŒÀ‚èƒRƒ“ƒpƒCƒ‰ƒIƒvƒVƒ‡ƒ“ -fomit-frame-pointer ‚ðŽg‚í‚È‚¢‚Å‚­‚¾‚³‚¢
    B¶¬‚³‚ꂽƒ‰ƒCƒuƒ‰ƒŠ‚Í‹@”\‚·‚é‚Å‚µ‚傤‚ªA‚±‚ê‚ç‚̍ì‹Æ‚́Aƒfƒoƒb
    ƒK‚ð‚Ù‚Æ‚ñ‚ÇŽg‚¢•¨‚É‚È‚ç‚È‚­‚µ‚Ä‚µ‚Ü‚¢‚Ü‚·B
   
 E ƒR[ƒh‚𐶐¬‚·‚é‚ɂ́A-fpic ‚Å‚Í‚È‚­A-fPIC ‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢ (‘OŽÒ
    ‚Í‹@”\‚µ‚È‚¢‚±‚Æ‚à‚ ‚è‚Ü‚·B‚Æ‚¢‚¤‚̂́A•ªŠò‚ª‘å‹K–Í‚È”z’u“]Š·‚ð•K
    —v‚Æ‚·‚éê‡A-fpic ‚ÍŠ®‘S‚Ȉʒu“Æ—§ƒR[ƒh‚𐶐¬‚µ‚È‚¢‚©‚à‚µ‚ê‚È‚¢
    ‚©‚ç‚Å‚·)B
   
„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

3.5. ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚̃Cƒ“ƒXƒg[ƒ‹‚ÆŽg—p

ˆê“x‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ðì¬‚µ‚Ä‚µ‚Ü‚¤‚ƁA‚»‚ê‚ðƒCƒ“ƒXƒg[ƒ‹‚µ‚½‚­‚Ȃ邱‚Æ
‚Å‚µ‚傤BŠÈ’P‚È•û–@‚́A•W€“I‚ȃfƒBƒŒƒNƒgƒŠ (—Ⴆ‚Î /usr/lib ‚È‚Ç) ‚Ì
ˆê‚‚ɁA‚»‚̃‰ƒCƒuƒ‰ƒŠ‚ðƒRƒs[‚µAldconfig(8) ‚ðŽÀs‚·‚邱‚Æ‚Å‚·B

‚à‚µ‚à‚±‚ꂪ‚Å‚«‚È‚¢‚È‚ç‚Î (—Ⴆ‚΁A‚ ‚È‚½‚ª /usr/lib ‚ð•ÏX‚·‚錠—˜‚ð
Ž‚Á‚Ä‚¢‚È‚¢‚È‚Ç)AŽ–‘Ԃ𐧌䂷‚邽‚߂Ɋ‹«•Ï”‚ðŽg—p‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·
B‚Ü‚¸‚Í‚¶‚߂ɁA‚Ç‚±‚©‚É‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ðì¬‚·‚é•K—v‚ª‚ ‚é‚Å‚µ‚傤B‚»
‚ê‚©‚çA•K—v‚ȃVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒNA“Á‚É soname ‚©‚ç real name ‚ւ̃Vƒ“ƒ{
ƒŠƒbƒNƒŠƒ“ƒN (“¯—l‚ɁAƒo[ƒWƒ‡ƒ“”ԍ†‚ð‚Ü‚Á‚½‚­Žw’肵‚È‚¢ƒ†[ƒU‚Ì‚½‚ß‚É
Aƒo[ƒWƒ‡ƒ“”ԍ†‚Ì‚È‚¢ soname A‚‚܂èA``.so'' ‚ŏI‚í‚é soname ‚©‚ç‚Ì
ƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚à) Ý’è‚·‚é•K—v‚ª‚ ‚é‚Å‚µ‚傤B‚à‚Á‚Æ‚àŠÈ’P‚È•û–@‚Í
AŽŸ‚̃Rƒ}ƒ“ƒhƒ‰ƒCƒ“‚ðŽÀs‚·‚邱‚Æ‚Å‚·\\

 ldconfig -n directory_with_shared_libraries                           

‚»‚ê‚©‚çALD_LIBRARY_PATH \\‚¢‚‚à‚̏ꏊ‚æ‚è‚àæ‚É‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ÌŒŸ
õ‘ΏۂƂȂéƒfƒBƒŒƒNƒgƒŠ‚̃ŠƒXƒg‚ðƒRƒƒ“‚Å‹æØ‚Á‚½‚à‚́\\‚ðÝ’肵‚Ü‚·
Bbash ‚ð‚¨Žg‚¢‚Å‚µ‚½‚çAŽŸ‚Ì•û–@‚Å my_program ‚ðŽÀs‚Å‚«‚Ü‚·B

LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH  my_program                         

Šô‚‚©‚Ì‘I‘ð‚³‚ê‚½ŠÖ”‚ðƒI[ƒo[ƒ‰ƒCƒh‚µ‚½‚¢‚¾‚¯‚È‚ç‚΁AƒI[ƒo[ƒ‰ƒCƒh
‚·‚éƒIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚ðì¬‚µ‚Ä LD_PRELOAD ‚ðÝ’è‚·‚邾‚¯‚ʼn”\‚Å‚·
B‚±‚̃IƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹“à‚̊֐”‚́A‘ΏۂƂȂÁ‚Ä‚¢‚éŠÖ”‚¾‚¯‚ðƒI[ƒo
[ƒ‰ƒCƒh‚µ‚Ü‚·B

•’i‚́AS”z‚·‚é•K—v‚à‚È‚­ƒ‰ƒCƒuƒ‰ƒŠ‚ðXV‚Å‚«‚Ü‚·B‚à‚µ‚à API ‚̕ύX‚ª
‚ ‚é‚È‚ç‚΁Aƒ‰ƒCƒuƒ‰ƒŠì¬ŽÒ‚Í soname ‚ð•ÏX‚·‚é‚Å‚µ‚傤B‚µ‚©‚µ‚È‚ª‚ç
A‚à‚µ‚à“¯‚¶ soname ‚̂܂܂̃‰ƒCƒuƒ‰ƒŠ‚ɑ΂·‚éXVŒÂŠ‚É‚¨‚¢‚āA‚ ‚éƒv
ƒƒOƒ‰ƒ€‚ª’†’f‚µ‚Ä‚µ‚Ü‚¤‚悤‚È‚çAŒÃ‚¢ƒ‰ƒCƒuƒ‰ƒŠ‚ð‚Ç‚±‚©‚ɃRƒs[‚µA‚»
‚̃vƒƒOƒ‰ƒ€‚Ì–¼‘O‚ð•ÏX‚·‚邱‚Æ‚É‚æ‚Á‚Ä (ŒÃ‚¢–¼‘O‚É ``.orig'' ‚ð•t‚¯‘«
‚·‚È‚Ç) A‹­§“I‚Ɍ¢ƒ‰ƒCƒuƒ‰ƒŠƒo[ƒWƒ‡ƒ“‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·BŽg—p‚·
‚郉ƒCƒuƒ‰ƒŠ‚ðÄÝ’肵AŽÀÛ‚ÉŽÀs‚·‚é (–¼‘O‚ð•ÏX‚³‚ꂽ) ƒvƒƒOƒ‰ƒ€‚ð
ŒÄ‚яo‚·‚½‚߂̏¬‚³‚È ``ƒ‰ƒbƒp['' ƒXƒNƒŠƒvƒg‚àì¬‚µ‚Ä‚­‚¾‚³‚¢B”ԍ†•t
‚¯‚ÌŠµK‚́A“¯ˆêƒfƒBƒŒƒNƒgƒŠ“à‚É•¡”‚̃o[ƒWƒ‡ƒ“‚ª‘¶Ý‚·‚邱‚Æ‚ð‰Â”\‚É
‚µ‚Ä‚¢‚Ü‚·‚ªA‚¨–]‚Ý‚È‚çAŒÃ‚¢ƒ‰ƒCƒuƒ‰ƒŠ‚ð‚»‚ê“ÆŽ©‚Ì“Á•Ê‚ȏꏊ‚É’u‚­‚±
‚Æ‚à‚Å‚«‚Ü‚·Bƒ‰ƒbƒp[ƒXƒNƒŠƒvƒg‚́AŽŸ‚̂悤‚È‚à‚Ì‚É‚È‚é‚Å‚µ‚傤\\

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

ldd(1) ‚ðŽg‚¦‚΁A‚ ‚éƒvƒƒOƒ‰ƒ€‚É‚æ‚Á‚ÄŽg—p‚³‚ê‚Ä‚¢‚鋤—Lƒ‰ƒCƒuƒ‰ƒŠ‚̃Š
ƒXƒg‚𒲂ׂ邱‚Æ‚ª‚Å‚«‚Ü‚·B—Ⴆ‚΁AŽŸ‚̂悤‚Ƀ^ƒCƒv‚·‚ê‚΁A ls ‚É‚æ‚Á
‚ÄŽg—p‚³‚ê‚Ä‚¢‚鋤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ðŠm”F‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·\\

  ldd /bin/ls                                                          

ˆê”Ê“I‚ɂ́AƒvƒƒOƒ‰ƒ€‚̈ˑ¶‚·‚é soname ‚̃ŠƒXƒg‚ªA–¼‘O‰ðŒˆŒã‚̃fƒBƒŒ
ƒNƒgƒŠ–¼‚Æ‹¤‚É“¾‚ç‚ê‚Ü‚·BŽÀÛ‚É‚Í‘S‚Ă̏ꍇ‚É‚¨‚¢‚āA­‚È‚­‚Æ‚à“ñ‚‚Ì
ˆË‘¶—v‘f‚ðŒ©‚é‚±‚Æ‚É‚È‚é‚Å‚µ‚傤\\

 E /lib/ld-linux.so.N (N ‚́A1 ‚©‚»‚êˆÈãB‚½‚¢‚Ä‚¢‚͏­‚È‚­‚Æ‚à 2) B
    ‚±‚ê‚́A‘¼‚Ì‘S‚Ẵ‰ƒCƒuƒ‰ƒŠ‚ðƒ[ƒh‚·‚邽‚߂̃‰ƒCƒuƒ‰ƒŠ‚Å‚·B
   
 E libc.so.N (N ‚́A6 ‚©‚»‚êˆÈã) B‚±‚ê‚Í C ƒ‰ƒCƒuƒ‰ƒŠ‚Å‚·B‘¼‚ÌŒ¾Œê
    ‚Å‚³‚¦AC ƒ‰ƒCƒuƒ‰ƒŠ‚ðŽg—p‚·‚éŒXŒü‚ª‚ ‚è‚Ü‚· (­‚È‚­‚Æ‚à‚»‚ê‚玩g
    ‚̃‰ƒCƒuƒ‰ƒŠ‚ðŽÀ‘•‚·‚邽‚ß‚É) B‚»‚Ì‚½‚߁A‚Ù‚Æ‚ñ‚ǂ̃vƒƒOƒ‰ƒ€‚͏­
    ‚È‚­‚Æ‚à‚±‚̃‰ƒCƒuƒ‰ƒŠ‚ÍŠÜ‚ñ‚Å‚¢‚Ü‚·B
   
’ˆÓ\\M—p‚Å‚«‚È‚¢ƒvƒƒOƒ‰ƒ€‚ɑ΂µ‚Ä ldd ‚ðŽÀs‚µ‚Ä‚Í‚¢‚¯‚Ü‚¹‚ñB‚±‚ê
‚ɂ‚¢‚ẮA ldd(1) ‚̃}ƒjƒ…ƒAƒ‹‚Å–¾Šm‚ɏq‚ׂç‚ê‚Ä‚¢‚Ü‚·B ldd ‚́A“–ŠY
ƒvƒƒOƒ‰ƒ€‚𒼐ڌĂяo‚·‚±‚Æ‚Å‹@”\‚µ‚Ä‚¢‚Ü‚·BM—p‚Å‚«‚È‚¢ƒvƒƒOƒ‰ƒ€‚ª
—\Šú‚µ‚Ä‚¢‚È‚¢ƒR[ƒh‚ðŽÀs‚µ‚Ä‚µ‚Ü‚¤‚±‚Æ‚ª‚ ‚肦‚Ü‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

3.6. ”ñŒÝŠ·ƒ‰ƒCƒuƒ‰ƒŠ

V‚µ‚¢ƒo[ƒWƒ‡ƒ“‚̃‰ƒCƒuƒ‰ƒŠ‚ªŒÃ‚¢‚à‚̂ƃoƒCƒiƒŠ”ñŒÝŠ·‚Å‚ ‚é‚Æ‚«‚́A
soname ‚ð•ÏX‚·‚é•K—v‚ª‚ ‚è‚Ü‚·BC ‚É‚¨‚¢‚ẮAƒ‰ƒCƒuƒ‰ƒŠ‚ªƒoƒCƒiƒŠŒÝŠ·
‚Å‚Í‚È‚­‚È‚Á‚Ä‚µ‚Ü‚¤Žl‚‚̊î–{“I‚È——R‚ª‚ ‚è‚Ü‚·B

 1. Œ³‚ÌŽd—l‚É“K‡‚µ‚È‚¢‚悤‚Ɋ֐”‚Ì“®ì‚ª•ÏX‚³‚ê‚Ä‚µ‚Ü‚¤
   
 2. ƒGƒNƒXƒ|[ƒg‚³‚ê‚éƒf[ƒ^€–Ú‚ª•ÏX‚³‚ê‚Ä‚µ‚Ü‚¤ (—áŠO\\\‘¢‘Ì‚ªƒ‰
    ƒCƒuƒ‰ƒŠ“à‚ł̂݃AƒƒP[ƒg‚³‚ê‚éê‡‚ÉŒÀ‚èA\‘¢‘Ì‚Ì––”ö‚É”CˆÓ‚̍€
    –Ú‚ð’ljÁ‚·‚é‚Ì‚Í–â‘è‚È‚¢)
   
 3. ƒGƒNƒXƒ|[ƒg‚³‚ê‚Ä‚¢‚éŠÖ”‚ªíœ‚³‚ê‚Ä‚µ‚Ü‚¤
   
 4. ƒGƒNƒXƒ|[ƒg‚³‚ê‚Ä‚¢‚éŠÖ”‚̃Cƒ“ƒ^[ƒtƒF[ƒX‚ª•ÏX‚³‚ê‚Ä‚µ‚Ü‚¤
   
‚±‚ê‚ç‚Ì——R‚ð‰ñ”ð‚Å‚«‚é‚È‚ç‚΁Aƒ‰ƒCƒuƒ‰ƒŠ‚ðƒoƒCƒiƒŠŒÝŠ·‚ɕۂ‚±‚Æ‚ª‚Å
‚«‚Ü‚·B•Ê‚ÌŒ¾‚¢•û‚ð‚·‚é‚ƁA‚±‚ê‚ç‚̕ύX‚ð”ð‚¯‚ê‚΁AApplication Binary
Interface (ABI) ŒÝŠ·‚ð•Û‚‚±‚Æ‚ª‚Å‚«‚éA‚Æ‚¢‚¤‚±‚Æ‚Å‚·B—Ⴆ‚΁AV‚µ‚¢
ŠÖ”‚ð’ljÁ‚µ‚½‚¢‚¯‚ê‚Ç‚àŒÃ‚¢ŠÖ”‚ðíœ‚µ‚½‚­‚Í‚È‚¢‚©‚à‚µ‚ê‚Ü‚¹‚ñB\‘¢
‘Ì‚Ì––”ö‚ɂ̂݃AƒCƒeƒ€‚ð’ljÁ‚µAƒ‰ƒCƒuƒ‰ƒŠ‚É‚¾‚¯‚»‚̍\‘¢‘Ì‚ðƒAƒƒP[ƒg
‚·‚邱‚Æ‚ð‹–‰Â‚µ (ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚É‚Í‹–‰Â‚µ‚È‚¢)A‚»‚̒ljÁ‚̃AƒCƒeƒ€‚ð
ƒIƒvƒVƒ‡ƒ“ˆµ‚¢‚É‚·‚é (‚à‚µ‚­‚̓‰ƒCƒuƒ‰ƒŠ‚ª‚»‚ê‚ç‚ð–ž‚½‚·‚悤‚É‚·‚é)A‚È
‚Ç‚Ì‘€ì‚ð‚¨‚±‚È‚Á‚悶‚½•ÏX‚ªAŒÃ‚¢ƒvƒƒOƒ‰ƒ€‚ɑ΂µ‚ĉe‹¿‚ð—^‚¦‚È‚¢
‚±‚Æ‚ðŠm”F‚Å‚«‚éê‡‚ɂ̂݁AƒAƒCƒeƒ€‚ð’ljÁ‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B‹C‚ð•t‚¯
‚Ä‚­‚¾‚³‚¢B‚à‚µ‚àƒ†[ƒU‚ª\‘¢‘Ì‚ð”z—ñ‚ÅŽg‚Á‚Ä‚¢‚é‚È‚ç‚΁A‚»‚̍\‘¢‘Ì‚Í
Šg’£‚Å‚«‚Ü‚¹‚ñB

C++ (‚¨‚æ‚сAƒRƒ“ƒpƒCƒ‹Ï‚Ý‘gž‚݃eƒ“ƒvƒŒ[ƒgŠŽ‚^–”‚̓Rƒ“ƒpƒCƒ‹Ï‚Ý‚Ì
ƒfƒBƒXƒpƒbƒ`‚³‚ê‚郁ƒ\ƒbƒh‚ðƒTƒ|[ƒg‚·‚é‚»‚Ì‘¼‚ÌŒ¾Œê) ‚ł́Aó‹µ‚Í‚æ‚è
•¡ŽG‚É‚È‚è‚Ü‚·Bã‹L‚Ì–â‘è“_‘S‚Ä‚ª“K—p‚³‚ê‚éãA‚³‚ç‚É‘½‚­‚Ì–â‘肪‚ ‚è
‚Ü‚·B——R‚́AŠô‚‚©‚̏î•ñ‚ªƒRƒ“ƒpƒCƒ‹‚³‚ꂽƒR[ƒh“à‚É ``‰B‚³‚ꂽó‘Ô‚Å
'' ŽÀ‘•‚³‚ê‚Ä‚¢‚é‚Æ‚¢‚¤‚±‚Æ‚É‚ ‚é‚Ì‚Å‚·‚ªA‚±‚Ì‚±‚Æ‚ªA C++ ‚ªˆê”Ê“I‚É
‚ǂ̂悤‚ÉŽÀ‘•‚³‚ê‚Ä‚¢‚é‚©‚ð’m‚ç‚È‚¢l‚É‚Í‚æ‚­•ª‚©‚ç‚È‚¢‚悤‚Ȉˑ¶–â‘è
‚ðˆø‚«‹N‚±‚µ‚Ä‚µ‚Ü‚¤‚Ì‚Å‚·B³Šm‚ÉŒ¾‚¦‚΁A‚»‚ê‚ç‚Í ``V‚µ‚¢'' –â‘è‚Å‚Í
‚ ‚è‚Ü‚¹‚ñB’P‚ɁAƒRƒ“ƒpƒCƒ‹Ï‚Ý‚Ì C++ ‚̃R[ƒh‚ªA‚ ‚È‚½‚ð‹Á‚©‚¹‚邱‚Æ
‚É‚È‚é‚©‚à‚µ‚ê‚È‚¢•û–@‚Å‚»‚ê‚ç‚Ì–â‘è‚ðˆø‚«‹N‚±‚·‚Æ‚¢‚¤‚±‚Æ‚È‚Ì‚Å‚·BŽŸ
‚Ì‚à‚̂́AƒoƒCƒiƒŠŒÝŠ·‚ðˆÛŽ‚·‚邽‚ß‚É C++ “à‚Å‚â‚Á‚Ä‚Í‚¢‚¯‚È‚¢€–ڂ̃Š
ƒXƒg (‚¨‚»‚ç‚­•sŠ®‘S‚Å‚·‚ª) ‚Å‚ ‚èA Troll Tech ƒeƒNƒjƒJƒ‹ FAQ <http://
www.trolltech.com/developer/faq/tech.html#bincomp> ‚É‚æ‚è•ñ‚³‚ê‚Ä‚¢‚é
‚à‚Ì‚Å‚·B

 1. ƒƒ“ƒoŠÖ”‚ðÄŽÀ‘•‚µ‚½‚à‚Ì‚ð’ljÁ‚·‚é (ŒÃ‚¢ƒoƒCƒiƒŠ‚ªŒ³‚ÌŽÀ‘•‚ðŒÄ‚Ñ
    o‚·‚Ì‚ªˆÀ‘S‚Å‚Í‚È‚¢ê‡)B‚Æ‚¢‚¤‚̂́AƒRƒ“ƒpƒCƒ‰‚Í SuperClass::
    virtualFunction() ŒÄo‚µ‚ðƒRƒ“ƒpƒCƒ‹Žž‚É•]‰¿‚·‚é‚©‚ç‚Å‚· (ƒŠƒ“ƒNŽž
    ‚Å‚Í‚ ‚è‚Ü‚¹‚ñ)B
   
 2. ‰¼‘zƒƒ“ƒoŠÖ”‚ð’ljÁ‚Ü‚½‚͍폜‚·‚éB‚Æ‚¢‚¤‚̂́A‚±‚̍ì‹Æ‚Í‘SƒTƒuƒN
    ƒ‰ƒX‚̉¼‘zŠÖ”ƒe[ƒuƒ‹‚̃TƒCƒY‚Æ”z’u‚ð•ÏX‚·‚邾‚낤‚©‚ç‚Å‚·B
   
 3. ƒCƒ“ƒ‰ƒCƒ“ƒƒ“ƒoŠÖ”Œo—R‚ŃAƒNƒZƒX‚³‚ꂤ‚éƒf[ƒ^ƒƒ“ƒo‚̃^ƒCƒv‚ð•Ï
    X‚µ‚½‚èA‚Ü‚½‚Í‚»‚ê‚ç‚ðˆÚ“®‚³‚¹‚½‚è‚·‚éB
   
 4. ƒNƒ‰ƒXŠK‘w‚ð•ÏX‚·‚éB‚½‚¾‚µAƒŠ[ƒt (–󒍁F‰ºˆÊƒNƒ‰ƒX‚ðŽ‚½‚È‚¢ƒN
    ƒ‰ƒX) ‚̐V‹K’ljÁ‚ðœ‚­B
   
 5. private ƒf[ƒ^ƒƒ“ƒo‚ð’ljÁ‚Ü‚½‚͍폜‚·‚éB‚Æ‚¢‚¤‚̂́A‚±‚̍ì‹Æ‚Í‘S
    ƒTƒuƒNƒ‰ƒX‚̃TƒCƒY‚Æ”z’u‚ð•ÏX‚·‚邾‚낤‚©‚ç‚Å‚·B
   
 6. public ‚à‚µ‚­‚Í protected ƒƒ“ƒoŠÖ”‚ªƒCƒ“ƒ‰ƒCƒ“ŠÖ”‚Å‚È‚¢ê‡‚ɁA
    ‚»‚ê‚ç‚ðíœ‚·‚éB
   
 7. public ‚à‚µ‚­‚Í protected ƒƒ“ƒoŠÖ”‚ðƒCƒ“ƒ‰ƒCƒ“‰»‚·‚éB
   
 8. ƒCƒ“ƒ‰ƒCƒ“ŠÖ”‚ª‚¨‚±‚È‚Á‚Ä‚¢‚½‚±‚Æ‚ð•ÏX‚·‚éB‚½‚¾‚µAŒÃ‚¢ƒo[ƒWƒ‡
    ƒ“‚ª“®ì‚µ‘±‚¯‚Ä‚¢‚éê‡‚ðœ‚­B
   
 9. ƒ|[ƒ^ƒuƒ‹‚ȃvƒƒOƒ‰ƒ€‚̃ƒ“ƒoŠÖ”‚̃AƒNƒZƒXŒ  (‚·‚È‚í‚¿A public,
    protected ‚Ü‚½‚Í private) ‚ð•ÏX‚·‚éB‚Æ‚¢‚¤‚̂́AƒAƒNƒZƒXŒ ‚ðŠÖ”
    –¼‚ɉŸ‚µž‚ñ‚Å‚µ‚Ü‚¤ƒRƒ“ƒpƒCƒ‰‚à‘¶Ý‚·‚é‚©‚ç‚Å‚·B
   
C++ ƒ‰ƒCƒuƒ‰ƒŠ‚ÌŠJ”­ŽÒ‚́A‚±‚Ì’·‚Á‚½‚炵‚¢ƒŠƒXƒg‚ðŽè‚É‚µ‚āAƒoƒCƒiƒŠŒÝ
Š·«‚ð‚È‚­‚·‚±‚Æ‚É‚È‚Á‚Ä‚µ‚Ü‚¤ŽžÜ‚̍XVì‹ÆˆÈã‚Ì‚±‚Æ‚ð“Á‚ɍl—¶‚µ‚È‚¯
‚ê‚΂Ȃè‚Ü‚¹‚ñBK‚¢‚É‚µ‚āAUnix ƒ‰ƒCƒN‚ȃVƒXƒeƒ€ (Linux ‚ðŠÜ‚Ý‚Ü‚·) ‚Å
‚͈ê‚‚̃‰ƒCƒuƒ‰ƒŠ‚Ì•¡”‚̃o[ƒWƒ‡ƒ“‚𓯎ž‚Ƀ[ƒh‚·‚邱‚Æ‚ª‚Å‚«‚é‚Ì‚Å
AƒfƒBƒXƒNƒXƒy[ƒX‚ðŽ¸‚¤‚±‚Æ‚É‚Í‚È‚è‚Ü‚·‚ªAƒ†[ƒU‚͌¢ƒ‰ƒCƒuƒ‰ƒŠ‚ð•K
—v‚Æ‚·‚é ``ŒÃ‚¢'' ƒvƒƒOƒ‰ƒ€‚ð‚»‚ÌŒã‚àŽÀs‚·‚邱‚Æ‚ª‰Â”\‚Å‚Í‚ ‚è‚Ü‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

4. “®“I‚Ƀ[ƒh‚³‚ê‚é (Dynamically Loaded; DL) ƒ‰ƒCƒuƒ‰ƒŠ

“®“I‚Ƀ[ƒh‚³‚ê‚é (dynamically loaded; DL) ƒ‰ƒCƒuƒ‰ƒŠ‚́AƒvƒƒOƒ‰ƒ€‚Ì
‹N“®ŽžˆÈŠO‚Ì‚Æ‚«‚Ƀ[ƒh‚³‚ê‚郉ƒCƒuƒ‰ƒŠ‚Å‚·B‚±‚ê‚̓vƒ‰ƒOƒCƒ“‚⃂ƒWƒ…
[ƒ‹‚ðŽÀ‘•‚·‚é‚Ì‚É“Á‚É–ð‚É—§‚¿‚Ü‚·B‚Æ‚¢‚¤‚̂́Aƒvƒ‰ƒOƒCƒ“‚ª•K—v‚É‚È‚é
‚܂ŁA‚»‚ê‚ðƒ[ƒh‚·‚é‚Ì‚ð‘҂‚±‚Æ‚ª‚Å‚«‚é‚©‚ç‚Å‚·B—Ⴆ‚΁A Pluggable
Authentication Modules (PAM) ƒVƒXƒeƒ€‚́AŠÇ—ŽÒ‚ª”FØ‚̐ݒè‚âÄÝ’è‚ð‚¨
‚±‚È‚¦‚é‚悤‚É‚·‚邽‚߁A DL ƒ‰ƒCƒuƒ‰ƒŠ‚ðŽg—p‚µ‚Ä‚¢‚Ü‚·B‚Ü‚½A‘S‘Ì‚ðŽ~
‚߂邱‚Æ‚È‚­AŒø—¦‚ðã‚°‚é–Ú“I‚ŁA‚»‚ÌŽžX‚ŃR[ƒh‚ðƒ}ƒVƒ“ƒR[ƒh‚ɃRƒ“
ƒpƒCƒ‹‚µA‚»‚̃Rƒ“ƒpƒCƒ‹Œã‚Ì‚à‚Ì‚ðŽg—p‚·‚é‚Æ‚¢‚¤ƒCƒ“ƒ^ƒvƒŠƒ^‚ðŽÀ‘•‚·‚é
‚Ì‚É‚à–ð‚É—§‚¿‚Ü‚·B‚±‚Ì•û–@‚́AƒWƒƒƒXƒgƒCƒ“ƒ^ƒCƒ€ƒRƒ“ƒpƒCƒ‰‚âAƒ}ƒ‹ƒ`
ƒ†[ƒUƒ_ƒ“ƒWƒ‡ƒ“ (multi-user dungeon; MUD) ‚ÌŽÀ‘•Žž‚É‚à–ð‚É—§‚¿‚Ü‚·B

Linux ‚ł́AŽÀÛ‚Ì‚Æ‚±‚ëADL ƒ‰ƒCƒuƒ‰ƒŠ‚ÍŒ`Ž®‚Æ‚¢‚¤“_‚É‚¨‚¢‚Ä‚Í“Á•Ê‚Å‚Í
‚ ‚è‚Ü‚¹‚ñB‚»‚ê‚ç‚́A•W€“I‚ȃIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹A‚à‚µ‚­‚͍¡‚܂łɏq
‚ׂ½‚悤‚È•W€“I‚È‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚Æ‚µ‚č\’z‚³‚ê‚Ä‚¢‚Ü‚·BŽå‚ȈႢ‚́Aƒ‰
ƒCƒuƒ‰ƒŠ‚ªAƒvƒƒOƒ‰ƒ€‚̃Šƒ“ƒNŽž‚â‹N“®Žž‚ÉŽ©“®“I‚ɂ̓[ƒh‚³‚ê‚È‚¢A‚Æ
‚¢‚¤“_‚Å‚·B‚»‚Ì‘ã‚í‚èAƒ‰ƒCƒuƒ‰ƒŠ‚ðƒI[ƒvƒ“‚µAƒVƒ“ƒ{ƒ‹‚ðŒŸõ‚µAƒGƒ‰
[‚ðˆ—‚µAƒ‰ƒCƒuƒ‰ƒŠ‚ð•Â‚¶‚éA‚Æ‚¢‚¤ API ‚Í‘¶Ý‚µ‚Ü‚·B‚±‚Ì API ‚ðŽg
‚¤‚½‚߂ɂ́A C ƒ†[ƒU‚̓wƒbƒ_ƒtƒ@ƒCƒ‹ <dlfcn.h> ‚ðƒCƒ“ƒNƒ‹[ƒh‚·‚é•K—v
‚ª‚ ‚è‚Ü‚·B

Linux ‚É‚æ‚Á‚ÄŽg—p‚³‚ê‚éƒCƒ“ƒ^[ƒtƒF[ƒX‚Í–{Ž¿“I‚É Solaris ã‚Ì‚à‚Ì‚Æ“¯
‚¶‚ŁAŽ„‚ª ``dlopen()'' API ‚ƌĂڂ¤‚Æ‚µ‚Ä‚¢‚é‚à‚Ì‚Å‚·B‚µ‚©‚µ‚È‚ª‚çA
‚±‚Ì“¯‚¶ƒCƒ“ƒ^[ƒtƒF[ƒX‚Í‘S‚Ẵvƒ‰ƒbƒgƒtƒH[ƒ€‚ŃTƒ|[ƒg‚³‚ê‚Ä‚¢‚é‚í
‚¯‚Å‚Í‚ ‚è‚Ü‚¹‚ñBHP-UX ‚Í shl_load() ‚Æ‚¢‚¤ˆÙ‚È‚é‹@\‚ð—p‚¢‚Ü‚·‚µA
Windows ƒvƒ‰ƒbƒgƒtƒH[ƒ€‚ÍŠ®‘S‚ɈقȂéƒCƒ“ƒ^[ƒtƒF[ƒX‚Ì DLL ‚ðŽg—p‚µ‚Ü
‚·B‚ ‚È‚½‚̍ŏI–Ú•W‚ªL”͂ȃ|[ƒ^ƒrƒŠƒeƒB‚È‚ç‚΁A‚¨‚»‚ç‚­Aƒvƒ‰ƒbƒgƒt
ƒH[ƒ€ŠÔ‚̍·ˆá‚ð‰B‚·ƒ‰ƒbƒsƒ“ƒOƒ‰ƒCƒuƒ‰ƒŠ‚ÌŽg—p‚ðl‚¦‚½‚Ù‚¤‚ª‚æ‚¢‚Å‚µ‚å
‚¤Bˆê‚‚̃Aƒvƒ[ƒ`‚́Aƒ‚ƒWƒ…[ƒ‹‚Ì“®“Iƒ[ƒfƒBƒ“ƒO‚ðƒTƒ|[ƒg‚·‚é glib
ƒ‰ƒCƒuƒ‰ƒŠ‚Å‚·B‚±‚ê‚́Aƒvƒ‰ƒbƒgƒtƒH[ƒ€‚Å“y‘ä‚Æ‚È‚Á‚Ä‚¢‚é“®“Iƒ[ƒfƒB
ƒ“ƒO—pƒ‹[ƒ`ƒ“‚ðŽg‚¢A‚»‚ê‚ç‚Ì‹@”\‚ւ̃|[ƒ^ƒuƒ‹‚ȃCƒ“ƒ^[ƒtƒF[ƒX‚ðŽÀ
‘•‚µ‚Ü‚·Bglib ‚ɂ‚¢‚ẮA http://developer.gnome.org/doc/API/glib/
glib-dynamic-loading-of-modules.html ‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B glib ‚̃Cƒ“ƒ^
[ƒtƒF[ƒX‚Í‚»‚̃hƒLƒ…ƒƒ“ƒg‚Ì’†‚ŏ\•ª‚Éà–¾‚³‚ê‚Ä‚¢‚é‚̂ŁA‚±‚±‚Å‚Í‚±
‚êˆÈã‚͏q‚ׂ܂¹‚ñB‚à‚¤ˆê‚‚̃Aƒvƒ[ƒ`‚́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ƒ“ƒ^[ƒtƒF[ƒX‚𒼐ڎg‚¤‚±‚ƂɈˑR‚Æ‚µ‚Ä‹»–¡‚ð‚¨Ž‚¿‚È‚ç‚΁A“ǂݐi‚ñ
‚Å‚­‚¾‚³‚¢B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

4.1. dlopen()

dlopen(3) ŠÖ”‚́Aƒ‰ƒCƒuƒ‰ƒŠ‚ðƒI[ƒvƒ“‚µAŽg—p‚·‚邽‚߂̏€”õ‚ð‚µ‚Ü‚·B
C ‚ł́A‚»‚̃vƒƒgƒ^ƒCƒv‚ÍŽŸ‚̂悤‚É‚È‚è‚Ü‚·\\

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

ƒtƒ@ƒCƒ‹–¼‚ª ``/'' ‚Å‚Í‚¶‚Ü‚é‚È‚ç‚Î (‚‚܂èâ‘΃pƒX‚È‚ç‚Î) A dlopen()
‚̓‰ƒCƒuƒ‰ƒŠ‚ðŒŸõ‚µ‚Ü‚¹‚ñB‚»‚¤‚Å‚È‚¢‚È‚ç‚΁Adlopen() ‚ÍŽŸ‚̏‡˜‚щƒC
ƒuƒ‰ƒŠ‚ðŒŸõ‚µ‚Ü‚·\\

 1. ƒ†[ƒU‚Ì LD_LIBRARY_PATH ŠÂ‹«•Ï”“à‚̃Rƒƒ“‚Å‹æØ‚ç‚ꂽƒfƒBƒŒƒNƒgƒŠ
    ƒŠƒXƒg
   
 2. /etc/ld.so.cache ‚ÉŽw’肳‚ꂽƒ‰ƒCƒuƒ‰ƒŠƒŠƒXƒg
   
 3. /usr/lib, ŽŸ‚ª /lib
   
dlopen() ‚ł́Aflag ‚Ì’l‚́ARTLD_LAZY \\``“®“Iƒ‰ƒCƒuƒ‰ƒŠ‚̃R[ƒh‚ªŽÀ
s‚³‚ê‚é‚Æ‚«‚ɁA–¢’è‹`ƒVƒ“ƒ{ƒ‹‚ð‰ðŒˆ‚¹‚æ'' ‚Æ‚¢‚¤ˆÓ–¡‚Å‚·\\A‚à‚µ‚­‚Í
ARTLD_NOW \\``dlopen() ‚ªƒŠƒ^[ƒ“‚·‚é‘O‚É‘S‚Ä‚Ì–¢’è‹`ƒVƒ“ƒ{ƒ‹‚ð‰ðŒˆ
‚¹‚æA‚»‚ꂪ‚Å‚«‚È‚¢‚悤‚È‚ç‚ÎŽ¸”s‚¹‚æ'' ‚Æ‚¢‚¤ˆÓ–¡‚Å‚·\\A‚Ì‚Ç‚¿‚ç‚©
‚Å‚È‚¯‚ê‚΂¢‚¯‚Ü‚¹‚ñBRTLD_GLOBAL ‚́A flag ‚Ì‚Ç‚¿‚ç‚©‚Ì’l‚Æ”CˆÓ‚ɘ_—
˜aŒ‹‡‚³‚ê‚é‚à‚̂ŁA‘±‚¯‚ă‰ƒCƒuƒ‰ƒŠ‚ðƒ[ƒh‚·‚邱‚Æ‚É‚æ‚胉ƒCƒuƒ‰ƒŠ“à
‚Å’è‹`‚³‚ê‚Ä‚¢‚éŠO•”ƒVƒ“ƒ{ƒ‹‚𓾂ç‚ê‚éA‚Æ‚¢‚¤‚±‚Æ‚ðˆÓ–¡‚µ‚Ä‚¢‚Ü‚·Bƒf
ƒoƒbƒO’†‚́A‚¨‚»‚ç‚­ RTLD_NOW ‚ðŽg‚¢‚½‚­‚È‚é‚Å‚µ‚傤BRTLD_LAZY ‚ðŽg‚¤
‚ƁA‰ðŒˆ‚³‚ê‚È‚¢ŽQÆ‚ª‚ ‚Á‚½‚Æ‚«‚É•s‰Â‰ð‚ȃGƒ‰[‚ª¶¬‚³‚ê‚Ü‚·B
RTLD_NOW ‚ðŽg‚¤‚ƁAƒ‰ƒCƒuƒ‰ƒŠ‚̃I[ƒvƒ“‚ɂ͎኱ŽžŠÔ‚ª‘½‚­‚©‚©‚é‚悤‚É‚È
‚è‚Ü‚· (‚µ‚©‚µA‚Ì‚¿‚Ì‚¿‚ÌŒŸõƒXƒs[ƒh‚Í‘¬‚­‚È‚è‚Ü‚·) B‚±‚Ì‚±‚Æ‚ªƒ†[
ƒUƒCƒ“ƒ^[ƒtƒF[ƒX‚Ì–â‘è‚É‚È‚é‚悤‚Å‚µ‚½‚çA‚ ‚Æ‚Å RTLD_LAZY ‚É‚©‚¦‚邱
‚Æ‚ª‚Å‚«‚Ü‚·B

ƒ‰ƒCƒuƒ‰ƒŠ‚ª‚¨ŒÝ‚¢‚Ɉˑ¶‚µ‚Ä‚¢‚é‚悤‚È‚ç (—Ⴆ‚΁AX ‚ª Y ‚Ɉˑ¶‚µ‚Ä‚¢
‚é) AˆË‘¶‚³‚ê‚Ä‚¢‚é‚Ù‚¤‚ðæ‚Ƀ[ƒh‚µ‚Ä‚­‚¾‚³‚¢ (‚±‚Ì—á‚ÅŒ¾‚¦‚΁AY ‚ð
æ‚Ƀ[ƒh‚µA‚»‚ê‚©‚ç X ‚ðƒ[ƒh‚µ‚Ü‚·) B

dlopen() ‚Ì–ß‚è’l‚́A‘¼‚Ì DL ƒ‰ƒCƒuƒ‰ƒŠƒ‹[ƒ`ƒ“‚ÅŽg—p‚³‚ê‚é ``ƒnƒ“ƒhƒ‹
'' \\‚»‚ÌŽÀ‘͉̂B•Á‚³‚ê‚é‚Ø‚«‚à‚̂ƍl‚¦‚ç‚ê‚Ä‚¢‚é\\‚Å‚·Bƒ[ƒh‚ÌŽŽ
‚Ý‚ª¬Œ÷‚µ‚È‚¢ê‡Adlopen() ‚Í NULL ‚ð•Ô‚µ‚Ü‚·‚̂ŁA‚±‚Ì’l‚ðƒ`ƒFƒbƒN‚·
‚é•K—v‚ª‚ ‚è‚Ü‚·B“¯‚¶ƒ‰ƒCƒuƒ‰ƒŠ‚ª dlopen() ‚Å“ñ‰ñˆÈãƒ[ƒh‚³‚ê‚é‚ƁA
“¯‚¶ƒtƒ@ƒCƒ‹ƒnƒ“ƒhƒ‹‚ª•Ô‚³‚ê‚Ü‚·B

‚à‚µ‚àƒ‰ƒCƒuƒ‰ƒŠ‚ª _init ‚Æ‚¢‚¤–¼‘O‚̃‹[ƒ`ƒ“‚ðƒGƒNƒXƒ|[ƒg‚µ‚Ä‚¢‚ê‚΁A
‚»‚̃R[ƒh‚Í dlopen() ‚ª–ß‚é‘O‚ÉŽÀs‚³‚ê‚Ü‚·B‚ ‚È‚½‚̃‰ƒCƒuƒ‰ƒŠ‚Å‚àA
‰Šú‰»ƒ‹[ƒ`ƒ“‚ðŽÀ‘•‚·‚邽‚ß‚É‚±‚ê‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·BÚ×‚Í Section
5.2 ‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

4.2. dlerror()

dlerror() ‚ðŒÄ‚ׂ΁AƒGƒ‰[‚ð•ñ‚Å‚«‚Ü‚·Bdlerror() ‚́A dlopen(),
dlsym() ‚à‚µ‚­‚Í dlclose() ‚̍Ōã‚̌ďo‚µ‚É‚æ‚éƒGƒ‰[‚ɂ‚¢‚Ä‹Lq‚µ‚Ä‚ 
‚镶Žš—ñ‚ð•Ô‚µ‚Ü‚·Bˆê‚•ςí‚Á‚Ä‚¢‚é‚̂́Adlerror() ‚ðŒÄ‚яo‚·‚ƁAˆÈ~
‚Ì dlerror() ‚̌ďo‚µ‚́A‚Ù‚©‚̃Gƒ‰[‚ª”­¶‚·‚é‚Ü‚Å NULL ‚ð•Ô‚·‚Æ‚¢‚¤“_
‚Å‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

4.3. dlsym()

DL ƒ‰ƒCƒuƒ‰ƒŠ‚ªŽg‚¦‚È‚¯‚ê‚΁A‚»‚ê‚ðƒ[ƒh‚µ‚Ä‚àˆÓ–¡‚ª‚ ‚è‚Ü‚¹‚ñB DL ƒ‰
ƒCƒuƒ‰ƒŠ‚ðŽg‚¤‚½‚ß‚ÌŽå‚ƂȂ郋[ƒ`ƒ“‚́Adlsym(3) ‚Å‚·B‚±‚ê‚́A—^‚¦‚ç‚ê
‚½ (ƒI[ƒvƒ“Ï‚Ý‚Ì) ƒ‰ƒCƒuƒ‰ƒŠ“à‚É‚ ‚éƒVƒ“ƒ{ƒ‹‚Ì’l‚ðŒŸõ‚·‚é‚à‚Ì‚Å‚·B
‚±‚̊֐”‚ÍŽŸ‚̂悤‚É’è‹`‚³‚ê‚Ü‚·\\

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

handle ‚Í dlopen ‚Å•Ô‚³‚ꂽ’l‚ŁAsymbol ‚̓kƒ‹•¶Žš‚ŏI’[‚³‚ꂽ•¶Žš—ñ‚Å
‚·B‰ñ”ð‰Â”\‚È‚ç‚΁Adlsym() ‚ÌŒ‹‰Ê‚ð void* ƒ|ƒCƒ“ƒ^‚ÉŠi”[‚µ‚È‚¢‚Å‚­‚¾‚³
‚¢B‚Æ‚¢‚¤‚̂́A‚»‚ê‚ð—˜—p‚·‚邽‚тɃLƒƒƒXƒg‚µ‚È‚¯‚ê‚΂¢‚¯‚È‚­‚È‚é‚©‚ç
‚Å‚· (ƒvƒƒOƒ‰ƒ€‚ðƒƒ“ƒeƒiƒ“ƒX‚µ‚悤‚Æ‚µ‚Ä‚¢‚él‚½‚¿‚ɁA‚æ‚菭‚È‚¢î•ñ
‚µ‚©—^‚¦‚È‚¢‚±‚Æ‚É‚à‚È‚è‚Ü‚·) B

dlsym() ‚́AƒVƒ“ƒ{ƒ‹‚ªŒ©‚‚©‚ç‚È‚¯‚ê‚Î NULL ‚Æ‚¢‚¤Œ‹‰Ê‚ð•Ô‚µ‚Ü‚·BƒVƒ“
ƒ{ƒ‹‚ª NULL ‚à‚µ‚­‚̓[ƒ‚Æ‚¢‚¤’l‚ð‚Ƃ邱‚Æ‚Í‚ ‚肦‚È‚¢‚Æ•ª‚©‚Á‚Ä‚¢‚ê‚Î
A‚»‚ê‚ō\‚¢‚Ü‚¹‚ñB‚µ‚©‚µA‚»‚¤‚Å‚È‚¢ê‡‚͐öÝ“I‚ÉžB–†‚³‚ªŽc‚è‚Ü‚·B
‚à‚µ‚à NULL ‚ðŽó‚¯Žæ‚Á‚½ê‡A‚»‚ê‚́A‚»‚ñ‚ȃVƒ“ƒ{ƒ‹‚Í‘¶Ý‚µ‚È‚¢‚Æ‚¢‚¤
‚±‚Æ‚ðˆÓ–¡‚·‚é‚Ì‚Å‚µ‚傤‚©A‚à‚µ‚­‚Í‚»‚̃Vƒ“ƒ{ƒ‹‚Ì’l‚ª NULL ‚Å‚ ‚邱‚Æ
‚ðˆÓ–¡‚·‚é‚Ì‚Å‚µ‚傤‚©? •W€“I‚ȉ𓚂́Adlerror() ‚ð‚Í‚¶‚ß‚ÉŒÄ‚Ñ (‘¶Ý
‚µ‚Ä‚¢‚é‚©‚à‚µ‚ê‚È‚¢ƒGƒ‰[ðŒ‚ðƒNƒŠƒA‚·‚邽‚ß‚Å‚·)A‚»‚ê‚©‚çƒVƒ“ƒ{ƒ‹‚ð
—v‹‚·‚邽‚ß‚É dlsym() ‚ðŒÄ‚сAƒGƒ‰[‚ª”­¶‚µ‚Ä‚¢‚é‚©‚Ç‚¤‚©‚𒲂ׂ邽‚ß
‚ɍēx dlerror() ‚ðŒÄ‚яo‚·‚±‚Æ‚Å‚·BƒR[ƒh‚Ì’f•Ð‚ÍŽŸ‚̂悤‚É‚È‚é‚Å‚µ‚å
‚¤\\

 dlerror(); /* ƒGƒ‰[‚ðƒNƒŠƒA‚·‚é */                                   
 s = (actual_type) dlsym(handle, symbol_being_searched_for);           
 if ((err = dlerror()) != NULL) {                                      
  /* ƒnƒ“ƒhƒ‹ƒGƒ‰[BƒVƒ“ƒ{ƒ‹‚ðŒ©‚Â‚¯‚ç‚ê‚È‚©‚Á‚½ */                   
 } else {                                                              
  /* ƒVƒ“ƒ{ƒ‹‚ªŒ©‚‚©‚Á‚½B‚»‚Ì’l‚Í s ‚ÉŠi”[‚³‚ê‚Ä‚¢‚é */              
 }                                                                     

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

4.4. dlclose()

dlopen() ‚Ì‹t‚ª dlclose() ‚ŁA‚±‚ê‚Í DL ƒ‰ƒCƒuƒ‰ƒŠ‚ðƒNƒ[ƒY‚µ‚Ü‚·B dl
ƒ‰ƒCƒuƒ‰ƒŠ‚Í“®“I‚ȃtƒ@ƒCƒ‹ƒnƒ“ƒhƒ‹‚ւ̃Šƒ“ƒN”‚ðŠÇ—‚µ‚Ä‚¢‚é‚̂ŁA“¯ˆê
“®“Iƒ‰ƒCƒuƒ‰ƒŠ‚ɑ΂µ‚āAdlopen ‚ª¬Œ÷‚µ‚½‰ñ”‚Æ“¯‚¶”‚Ì dlclose ‚ªŒÄ‚Î
‚ê‚È‚¢ŒÀ‚èA“–ŠYƒ‰ƒCƒuƒ‰ƒŠ‚ÍŽÀÛ‚ɂ̓ƒ‚ƒŠã‚©‚çíœ‚³‚ê‚Ü‚¹‚ñB‚»‚Ì‚½
‚߁A“¯‚¶ƒvƒƒOƒ‰ƒ€‚ª“¯‚¶ƒ‰ƒCƒuƒ‰ƒŠ‚ð‰½‰ñƒ[ƒh‚µ‚Ä‚àA–â‘è‚É‚Í‚È‚è‚Ü‚¹
‚ñBƒ‰ƒCƒuƒ‰ƒŠ‚ÌŠ„“–‚Ä‚ª‰ðœ‚³‚ê‚éê‡‚́A(‚à‚µ‚à‘¶Ý‚·‚é‚È‚ç‚Î) _fini
ŠÖ”‚ªŒÄ‚΂ê‚Ü‚·BÚ×‚Í Section 5.2 ‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

4.5. DL ƒ‰ƒCƒuƒ‰ƒŠ‚Ì—á

dlopen(3) ‚Ì man ƒy[ƒW‚©‚ç‚Ì—á‚ð‚±‚±‚ɍڂ¹‚Ü‚·B‚±‚Ì—á‚́A”Šwƒ‰ƒCƒuƒ‰
ƒŠ‚ðƒ[ƒh‚µA2.0 ‚̃RƒTƒCƒ“‚ðo—Í‚µA‚Ü‚½A‘S‚ẴXƒeƒbƒv‚ŃGƒ‰[‚ðƒ`
ƒFƒbƒN‚µ‚Ä‚¢‚Ü‚· („§‚³‚ê‚Ä‚¢‚Ü‚·) \\

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

‚±‚̃vƒƒOƒ‰ƒ€‚ª "foo.c" ‚Æ‚¢‚¤–¼‘O‚̃tƒ@ƒCƒ‹‚¾‚Æ‚·‚é‚ƁAŽŸ‚̃Rƒ}ƒ“ƒh‚Å
ƒvƒƒOƒ‰ƒ€‚ðì¬‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

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

``-Wl,export-dynamic'' ƒIƒvƒVƒ‡ƒ“‚ÍŽÀÛ‚É‚Í•K—v‚ ‚è‚Ü‚¹‚ñ‚ªAŽžX–ð‚É—§
‚‚±‚Æ‚ª‚ ‚è‚Ü‚·Bld(1) ‚ÅŽŸ‚̂悤‚É–¾‹L‚³‚ê‚Ä‚¢‚Ü‚·\\``ELF ƒtƒ@ƒCƒ‹
‚ðì¬‚µ‚Ä‚¢‚é‚Æ‚«A‚±‚̃IƒvƒVƒ‡ƒ“‚ªA‘S‚ẴVƒ“ƒ{ƒ‹‚ð“®“IƒVƒ“ƒ{ƒ‹ƒe[
ƒuƒ‹‚ɉÁ‚¦‚Ü‚·B’ʏíA“®“IƒVƒ“ƒ{ƒ‹ƒe[ƒuƒ‹‚Í“®“IƒIƒuƒWƒFƒNƒg‚É‚æ‚Á‚ÄŽg
‚í‚ê‚éƒVƒ“ƒ{ƒ‹‚¾‚¯‚ðŠÜ‚ñ‚Å‚¢‚Ü‚·B‚±‚̃IƒvƒVƒ‡ƒ“‚Í dlopen ‚ÌŽg—p‚Ì‚½‚ß
‚É•K—v‚Æ‚È‚è‚Ü‚·'' Linux ƒVƒXƒeƒ€‚¾‚¯‚ōì‹Æ‚ð‚µ‚Ä‚¢‚é‚È‚ç‚΁A
``-Wl,export-dynamic'' ‚Ì‚©‚í‚è‚É ``-rdynamic'' ‚ðŽg‚¦‚邯‚ê‚Ç‚àAELF
ƒhƒLƒ…ƒƒ“ƒg‚É‚æ‚ê‚΁A”ñ Linux ƒVƒXƒeƒ€ã‚Ì gcc ‚Å‚Í ``-rdynamic'' ƒtƒ‰
ƒO‚Í•K‚¸‚µ‚à‹@”\‚µ‚È‚¢A‚Æ‚¢‚¤‚±‚Æ‚É‚Í’ˆÓ‚µ‚Ä‚¨‚¢‚Ä‚­‚¾‚³‚¢B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

5. ŽG˜^

5.1. nm ƒRƒ}ƒ“ƒh

nm(1) ƒRƒ}ƒ“ƒh‚́A—^‚¦‚ç‚ꂽƒ‰ƒCƒuƒ‰ƒŠ“à‚̃Vƒ“ƒ{ƒ‹‚̃ŠƒXƒg‚ð•ñ‚µ‚Ü‚·
BÃ“Iƒ‰ƒCƒuƒ‰ƒŠA‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚Ì‚Ç‚¿‚ç‚ɑ΂µ‚Ä‚à‹@”\‚µ‚Ü‚·B nm(1) ‚Í
—^‚¦‚ç‚ꂽƒ‰ƒCƒuƒ‰ƒŠ‚Å’è‹`‚³‚ê‚Ä‚¢‚éƒVƒ“ƒ{ƒ‹–¼AƒVƒ“ƒ{ƒ‹‚Ì’lAƒVƒ“ƒ{ƒ‹
‚̃^ƒCƒv‚ð•\Ž¦‚µ‚Ü‚·B‚Ü‚½A‚»‚̃‰ƒCƒuƒ‰ƒŠ“à‚ɏî•ñ‚ª‘¶Ý‚·‚é‚È‚ç‚Î (-l
ƒIƒvƒVƒ‡ƒ“‚ðŒ©‚Ä‚­‚¾‚³‚¢) AƒVƒ“ƒ{ƒ‹‚ªƒ\[ƒXƒR[ƒh“à‚Ì‚Ç‚±‚Å (ƒtƒ@ƒCƒ‹
–¼‚ƍs”ԍ†) ’è‹`‚³‚ê‚Ä‚¢‚é‚©‚Æ‚¢‚¤‚±‚Æ‚à“Á’è‚Å‚«‚Ü‚·B

ƒVƒ“ƒ{ƒ‹ƒ^ƒCƒv‚ɂ‚¢‚Ä‚Í‚à‚¤­‚µà–¾‚ª•K—v‚Å‚·Bƒ^ƒCƒv‚͈ꕶŽš‚Å•\Ž¦‚³
‚ê‚Ü‚·B¬•¶Žš‚Í‚»‚̃Vƒ“ƒ{ƒ‹‚ªƒ[ƒJƒ‹‚Å‚ ‚邱‚Æ‚ðˆÓ–¡‚µA‘啶Žš‚Í‚»‚Ì
ƒVƒ“ƒ{ƒ‹‚ªƒOƒ[ƒoƒ‹ (ŠO•”) ‚Å‚ ‚邱‚Æ‚ðˆÓ–¡‚µ‚Ü‚·B“TŒ^“I‚ȃVƒ“ƒ{ƒ‹‚Ì
ƒ^ƒCƒv‚ÍŽŸ‚Ì‚à‚Ì‚ðŠÜ‚Ý‚Ü‚·\\ T (ƒR[ƒhƒZƒNƒVƒ‡ƒ““à‚Ì•’Ê‚Ì’è‹`) D (‰
Šú‰»‚³‚ꂽƒf[ƒ^ƒZƒNƒVƒ‡ƒ“) B (‰Šú‰»‚³‚ê‚Ä‚¢‚È‚¢ƒf[ƒ^ƒZƒNƒVƒ‡ƒ“) U
(–¢’è‹`BƒVƒ“ƒ{ƒ‹‚̓‰ƒCƒuƒ‰ƒŠ‚É‚æ‚Á‚ÄŽg‚í‚ê‚Ä‚¢‚邪Aƒ‰ƒCƒuƒ‰ƒŠ“à‚Å‚Í’è
‹`‚³‚ê‚Ä‚¢‚È‚¢) W (weak. ‚à‚µ‚à‘¼‚̃‰ƒCƒuƒ‰ƒŠ‚à‚±‚̃Vƒ“ƒ{ƒ‹‚ð’è‹`‚µ‚Ä‚¢
‚½ê‡A‚»‚Ì’è‹`‚ªƒI[ƒo[ƒ‰ƒCƒh‚·‚é)

ŠÖ”‚Ì–¼‘O‚ÍŠo‚¦‚Ä‚¢‚邯‚ê‚Ç‚àA‚»‚ꂪ‚ǂ̃‰ƒCƒuƒ‰ƒŠ‚Å’è‹`‚³‚ê‚Ä‚¢‚é‚©
³Šm‚É‚ÍŽv‚¢o‚¹‚È‚¢ê‡Aƒ‰ƒCƒuƒ‰ƒŠ–¼‚ðŒ©‚Â‚¯‚邽‚߁Anm ‚Ì ``-o'' ƒIƒv
ƒVƒ‡ƒ“ (Šeƒ‰ƒCƒ“‚̃tƒ@ƒCƒ‹–¼‚Ì‘O‚É’u‚«‚Ü‚·) ‚É grep ‚𑱂¯‚ÄŽg‚¤‚±‚Æ‚ª
‚Å‚«‚Ü‚·B Bourne ƒVƒFƒ‹‚Å‚ ‚ê‚΁A/lib, /usr/lib, /usr/lib ‚Ì’¼‰º‚̃Tƒu
ƒfƒBƒŒƒNƒgƒŠA‚¨‚æ‚Ñ /usr/local/lib “à‚Ì‘Sƒ‰ƒCƒuƒ‰ƒŠ‚ð‘Ώۂɂµ‚Ä
``cos'' ‚ðŒŸõ‚·‚é‚ɂ́AŽŸ‚̂悤‚É‚µ‚Ü‚·\\

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

nm ‚ÉŠÖ‚·‚é‚à‚Á‚Æ‘½‚­‚̏î•ñ‚́A info:binutils#nm ‚Ƀ[ƒJƒ‹‚ɃCƒ“ƒXƒg[
ƒ‹‚³‚ê‚Ä‚¢‚é nm ‚Ì ``info'' ƒhƒLƒ…ƒƒ“ƒg‚Å“¾‚ç‚ê‚Ü‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

5.2. “Á•Ê‚Ȋ֐” _init ‚Æ _fini

“ñ‚‚̓Á•Ê‚Ȋ֐” _init ‚Æ _fini ‚́Aƒ‚ƒWƒ…[ƒ‹‚̏‰Šúˆ—‚ƏI—¹ˆ—‚ðŽx
‰‡‚µ‚Ü‚·B‚à‚µ‚àƒ‰ƒCƒuƒ‰ƒŠ“à‚Ŋ֐” ``_init'' ‚ªƒGƒNƒXƒ|[ƒg‚³‚ê‚Ä‚¢‚é‚Æ
A‚»‚̃‰ƒCƒuƒ‰ƒŠ‚̃I[ƒvƒ“Žž‚É dlopen() ‚ªŒÄ‚΂ê‚邽‚сA‚»‚̊֐”‚ªŒÄ‚Ñ
o‚³‚ê‚Ü‚·B C ‚̃vƒƒOƒ‰ƒ€‚ł́A_init ‚Æ‚¢‚¤–¼‘O‚̊֐”‚ð’è‹`‚·‚邱‚Æ‚ð
ˆÓ–¡‚µ‚Ü‚·B‚±‚ê‚ɑΉž‚·‚é _fini ‚ƌĂ΂ê‚éŠÖ”‚à‘¶Ý‚µA‚±‚ê‚́AƒNƒ‰ƒC
ƒAƒ“ƒg‚ªƒ‰ƒCƒuƒ‰ƒŠ‚̉ð•úŽž‚É dlclose() ‚ðŒÄ‚Ô‚½‚тɁAŒÄ‚яo‚³‚ê‚Ü‚· (‚»
‚µ‚ĉð•ú‚³‚ê‚Ü‚·) B‚±‚ê‚ç‚̊֐”‚Ì C ƒvƒƒgƒ^ƒCƒv‚ÍŽŸ‚̂悤‚É‚È‚Á‚Ä‚¢‚Ü
‚·B

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

Gcc ‚Ńtƒ@ƒCƒ‹‚ð ``.o'' ƒtƒ@ƒCƒ‹‚ւƃRƒ“ƒpƒCƒ‹‚·‚é‚Æ‚«‚́A–Y‚ꂸ‚É
``-nostartfiles'' ƒIƒvƒVƒ‡ƒ“‚ð•t‚¯‚Ä‚­‚¾‚³‚¢B‚±‚̃IƒvƒVƒ‡ƒ“‚́AC ƒRƒ“
ƒpƒCƒ‰‚ª .so ƒtƒ@ƒCƒ‹‚ɑ΂µ‚ăVƒXƒeƒ€ƒXƒ^[ƒgƒAƒbƒvƒ‰ƒCƒuƒ‰ƒŠ‚ðƒŠƒ“ƒN‚µ
‚È‚¢‚悤‚É‚µ‚Ü‚·B‚±‚̃IƒvƒVƒ‡ƒ“‚ð•t‚¯‚È‚¢‚ƁA``multiple-definition''
(d•¡’è‹`) ƒGƒ‰[‚É‚È‚Á‚Ä‚µ‚Ü‚¢‚Ü‚·B _init ‚Æ _fini ‚ÉŠÖ‚·‚é‹c˜_‚ð‰Á‚¦
‚邱‚Æ‚ð’ñˆÄ‚µ‚Ä‚­‚ꂽ‚±‚ƁA‚¨‚æ‚Ñ‚»‚̍쐬‚ðŽè“`‚Á‚Ä‚­‚ꂽ‚±‚Ƃɑ΂µ‚Ä
A Jim Mischel ‚Æ Tim Gentry ‚ÉŠ´ŽÓ‚µ‚Ü‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

5.3. ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚̓XƒNƒŠƒvƒg‰»‚Å‚«‚é

’ʏí‚̃‰ƒCƒuƒ‰ƒŠŒ`Ž®‚Ì‘ã‚í‚è‚ɁA“ÁŽê‚ȃXƒNƒŠƒvƒgŒ¾Œê‚ðŽg‚Á‚Ä‚¢‚éƒeƒLƒX
ƒgƒtƒ@ƒCƒ‹‚ð‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚Æ‚µ‚Ä GNU ƒ[ƒ_‚ª”F‚߂邱‚Ƃ́A’–Ú‚É’l‚µ‚Ü
‚·B‚±‚ê‚́A‘¼‚̃‰ƒCƒuƒ‰ƒŠ‚ðŠÔÚ“I‚ÉŒ‹‡‚³‚¹‚é‚̂ɖ𗧂¿‚Ü‚·B—Ⴆ‚΁A
Ž„‚ÌŽ‚‚ ‚éˆê‚‚̃VƒXƒeƒ€ã‚Ì /usr/lib/libc.so ‚ðƒŠƒXƒeƒBƒ“ƒO‚µ‚½‚à‚Ì
‚ÍŽŸ‚̂悤‚É‚È‚è‚Ü‚·B

/* GNU ld ƒXƒNƒŠƒvƒg                                                   
   ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ðŽg‚¤‚ªAŠô‚‚©‚̊֐”‚͐ÓIƒ‰ƒCƒuƒ‰ƒŠ“à‚É‚µ‚©        
   ‘¶Ý‚µ‚È‚¢B‚»‚Ì‚½‚߁A“ñ”Ô–Ú‚ÉŽŽ‚Ý‚éB */                           
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )                     

‚±‚ê‚ÉŠÖ‚·‚é‚æ‚èÚ‚µ‚¢î•ñ‚́Ald ƒŠƒ“ƒJƒXƒNƒŠƒvƒg (ld ƒRƒ}ƒ“ƒhŒ¾Œê) ‚É
‚‚¢‚Ä‚Ì texinfo ƒhƒLƒ…ƒƒ“ƒg‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢Bˆê”Ê“I‚ȏî•ñ‚́Ainfo:
ld#Options ‚Æ info:ld#Commands ‚É‚ ‚èA‚æ‚­Žg‚¤ƒRƒ}ƒ“ƒh‚Í info:ld#
Option Commands ‚Åà–¾‚³‚ê‚Ä‚¢‚Ü‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

5.4. GNU libtool

‘½‚­‚̃VƒXƒeƒ€‚ɈڐA‚³‚ê‚éƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ðì¬‚µ‚Ä‚¢‚é‚È‚ç‚΁Aƒ‰ƒCƒu
ƒ‰ƒŠ‚ð\’z‚µƒCƒ“ƒXƒg[ƒ‹‚·‚é‚̂ɁA GNU libtool <http://www.gnu.org/
software/libtool/libtool.html> ‚ðŽg—p‚·‚邱‚Æ‚ðl—¶‚µ‚½‚Ù‚¤‚ª‚æ‚¢‚©‚à‚µ
‚ê‚Ü‚¹‚ñB GNU libtool ‚́A”Ä—p“I‚ȃ‰ƒCƒuƒ‰ƒŠƒTƒ|[ƒgƒXƒNƒŠƒvƒg‚Å‚·B
Libtool ‚́A‹¤—Lƒ‰ƒCƒuƒ‰ƒŠŽg—p‚Ì•¡ŽG‚³‚ðˆêŠÑ«‚Ì‚ ‚éƒ|[ƒ^ƒuƒ‹‚ȃCƒ“ƒ^
[ƒtƒF[ƒX‚ʼnB‚µ‚Ü‚·BLibtool ‚́AƒIƒuƒWƒFƒNƒgì¬Aƒ‰ƒCƒuƒ‰ƒŠ‚̃Šƒ“ƒN
(Ã“I‚¨‚æ‚Ñ‹¤—L) AŽÀs‰Â”\ƒtƒ@ƒCƒ‹‚̃Šƒ“ƒNAŽÀs‰Â”\ƒtƒ@ƒCƒ‹‚̃fƒoƒbƒO
Aƒ‰ƒCƒuƒ‰ƒŠ‚̃Cƒ“ƒXƒg[ƒ‹AŽÀs‰Â”\ƒtƒ@ƒCƒ‹‚̃Cƒ“ƒXƒg[ƒ‹A‚ɂ‚¢‚ă|
[ƒ^ƒuƒ‹‚ȃCƒ“ƒ^[ƒtƒF[ƒX‚ð’ñ‹Ÿ‚µ‚Ü‚·B‚Ü‚½AƒvƒƒOƒ‰ƒ€‚ð“®“I‚Ƀ[ƒh
‚·‚邽‚߂̃|[ƒ^ƒrƒŠƒeƒBƒ‰ƒbƒp[‚Å‚ ‚é 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‚½‚¾‚µ‚¢ƒ`ƒ…
[ƒgƒŠƒAƒ‹v <http://www.muppetlabs.com/~breadbox/software/tiny/
teensy.html> ‚Æ‚¢‚¤•¶‘‚ªA‚æ‚¢ŽQl‚Æ‚È‚é‚Å‚µ‚傤B‚±‚ê‚́A–{“–‚ɏ¬‚³‚È
ŽÀs‰Â”\ƒvƒƒOƒ‰ƒ€‚ðì¬‚·‚é•û–@‚ɂ‚¢‚Ę_‚¶‚Ä‚¢‚Ü‚·B—¦’¼‚ÉŒ¾‚¦‚΁Aˆê
”Ê“I‚Ȋ‹«‚ł́A‚±‚ê‚ç‚̃gƒŠƒbƒN‚Ì‚Ù‚Æ‚ñ‚Ç‚ÍŽg‚¤‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ªA
‚»‚ê‚ç‚́AELF ‚ªŽÀÛ‚ɂǂ̂悤‚É‹@”\‚·‚é‚©‚ðŽ¦‚µ‚Ä‚¢‚é‚Æ‚¢‚¤“_‚É‚¨‚¢‚Ä
A‹É‚ß‚Ä—L‰v‚Å‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

6. ‚³‚ç‚É‘½‚­‚Ì—á

‰º‹L‚ɁA‘SŽO‚‚̃Aƒvƒ[ƒ` (Ã“IA‹¤—LA‚¨‚æ‚Ñ“®“I‚Ƀ[ƒh‚³‚ê‚郉ƒCƒu
ƒ‰ƒŠ) ‚Ì—á‚ð‚³‚ç‚É‹“‚°‚Ü‚·Bƒtƒ@ƒCƒ‹ libhello.c ‚Í•½–}‚ȃ‰ƒCƒuƒ‰ƒŠ‚ŁA
ƒwƒbƒ_ƒtƒ@ƒCƒ‹‚Æ‚µ‚Ä libhello.h ‚ðŽ‚¿‚Ü‚·Bƒtƒ@ƒCƒ‹ demo_use.c ‚́A‚»
‚̃‰ƒCƒuƒ‰ƒŠ‚Ì•½–}‚Ȍďo‚µ‚Å‚·BÃ“Iƒ‰ƒCƒuƒ‰ƒŠ‚â“®“Iƒ‰ƒCƒuƒ‰ƒŠ‚Æ‚µ‚Ä“–
ŠYƒ‰ƒCƒuƒ‰ƒŠ‚ðŽg‚¤•û–@‚ðŽ¦‚·‚½‚߁AƒRƒƒ“ƒg•t‚«‚̃XƒNƒŠƒvƒg
(script_static ‚Æ script_dynamic) ‚ª‚ ‚Æ‚É‘±‚«‚Ü‚·B‚³‚ç‚É
demo_dynamic.c ‚Æ script_dynamic ‚ª‚ ‚Æ‚É‘±‚«‚Ü‚·B‚±‚ê‚ç‚Í‹¤—Lƒ‰ƒCƒuƒ‰
ƒŠ‚ð“®“I‚Ƀ[ƒh‚³‚ê‚郉ƒCƒuƒ‰ƒŠ‚Æ‚µ‚ÄŽg‚¤•û–@‚ðŽ¦‚µ‚Ü‚·B

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

6.1. ƒtƒ@ƒCƒ‹ libhello.c

/* libhello.c - ƒ‰ƒCƒuƒ‰ƒŠŽg—p‚ÌŽÀ—á */                                
                                                                       
#include                                                               
                                                                       
void hello(void) {                                                     
  printf("Hello, library world.\n");                                   
}                                                                      

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

6.2. ƒtƒ@ƒCƒ‹ libhello.h

/* libhello.h - ƒ‰ƒCƒuƒ‰ƒŠŽg—p‚ÌŽÀ—á */                                
                                                                       
                                                                       
void hello(void);                                                      

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

6.3. ƒtƒ@ƒCƒ‹ demo_use.c

/* demo_use.c -- "hello" ƒ‹[ƒ`ƒ“‚𒼐ڎg—p‚·‚éŽÀ—á */                 
                                                                       
#include "libhello.h"                                                  
                                                                       
int main(void) {                                                       
 hello();                                                              
 return 0;                                                             
}                                                                      

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

6.4. ƒtƒ@ƒCƒ‹ script_static

#!/bin/sh                                                              
# Ã“Iƒ‰ƒCƒuƒ‰ƒŠ‚ÌŽÀ—á                                                 
                                                                       
# Ã“Iƒ‰ƒCƒuƒ‰ƒŠ‚̃IƒuƒWƒFƒNƒg libhello-static.o ‚ðì¬‚µ‚Ü‚·B        
# Ã“Iƒ‰ƒCƒuƒ‰ƒŠ‚Æ“®“Iƒ‰ƒCƒuƒ‰ƒŠ‚Ì—á‚𖾊m‚É‹æ•Ê‚·‚邽‚߁A             
# libhello-static ‚Æ‚¢‚¤–¼‘O‚ðŽg—p‚µ‚Ä‚¢‚Ü‚·B‚µ‚©‚µA‚ ‚È‚½‚Ì         
# ƒIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚âÃ“Iƒ‰ƒCƒuƒ‰ƒŠ‚Ì–¼‘O‚É "-static" ‚ðŽg‚¤        
# •K—v‚Í‚ ‚è‚Ü‚¹‚ñB                                                   
                                                                       
gcc -Wall -g -c -o libhello-static.o libhello.c                        
                                                                       
# Ã“Iƒ‰ƒCƒuƒ‰ƒŠ‚ðì¬‚µ‚Ü‚·B                                         
                                                                       
ar rcs libhello-static.a libhello-static.o                             
                                                                       
# ‚±‚±‚ŁAlibhello-static.a ‚ðŽg‚¤‚½‚ß‚É‚»‚ê‚ð‚Ç‚±‚©‘¼‚̏ꏊ‚Ö         
# ’P‚ɃRƒs[‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·Bƒfƒ‚‚ª–Ú“I‚Ȃ̂ŁAƒ‰ƒCƒuƒ‰ƒŠ‚Í         
# ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ“à‚É‚Æ‚Ç‚ß‚Ä‚¨‚«‚Ü‚·B                           
                                                                       
# demo_use ƒvƒƒOƒ‰ƒ€‚ðƒRƒ“ƒpƒCƒ‹‚µ‚Ü‚·B                              
                                                                       
gcc -Wall -g -c demo_use.c -o demo_use.o                               
                                                                       
# demo_use ƒvƒƒOƒ‰ƒ€‚ðì¬‚µ‚Ü‚·B-L. ‚É‚æ‚èAƒvƒƒOƒ‰ƒ€ì¬’†‚É      
# "." ‚ªŒŸõ‚³‚ê‚邱‚Æ‚É‚È‚è‚Ü‚·B‚±‚̃Rƒ}ƒ“ƒh‚́Alibhello-static.a    
# “à‚ÌŠÖŒW‚·‚éƒIƒuƒWƒFƒNƒg‚ð demo_use_static ‚É‘g‚ݍž‚Þ‚Æ‚¢‚¤‚±‚Æ      
# ‚É’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B                                                 
                                                                       
gcc -g -o demo_use_static demo_use.o -L. -lhello-static                
                                                                       
# ƒvƒƒOƒ‰ƒ€‚ðŽÀs‚µ‚Ü‚·B                                             
                                                                       
./demo_use_static                                                      

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

6.5. ƒtƒ@ƒCƒ‹ script_shared

#!/bin/sh                                                               
# ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ÌŽÀ—á                                                  
                                                                        
# ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚̃IƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹ libhello.o ‚ðì¬‚µ‚Ü‚·B        
                                                                        
gcc -fPIC -Wall -g -c libhello.c                                        
                                                                        
# ‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚ðì¬‚µ‚Ü‚·B                                          
# libhello ‚Í C ƒ‰ƒCƒuƒ‰ƒŠ‚Ɉˑ¶‚µ‚Ä‚¢‚é‚̂ŁAC ƒ‰ƒCƒuƒ‰ƒŠ‚Æ            
# ƒŠƒ“ƒN‚³‚¹‚邽‚ß‚É -lc ƒIƒvƒVƒ‡ƒ“‚ðŽg‚¢‚Ü‚·B                         
                                                                        
gcc -g -shared -Wl,-soname,libhello.so.0 \                              
    -o libhello.so.0.0 libhello.o -lc                                   
                                                                        
# ‚±‚±‚ŁAlibhello.so.0.0 ‚ð‚Ç‚±‚©‚̃fƒBƒŒƒNƒgƒŠA/usr/local/lib        
# ‚ȂǁA‚É’P‚ɃRƒs[‚Å‚«‚Ü‚·B                                          
                                                                        
# ƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚ðC³‚·‚邽‚߁Aldconfig ‚ðŒÄ‚яo‚·•K—v‚ª‚ ‚è‚Ü‚·B 
                                                                        
# soname ‚ðÝ’肵‚Ü‚·B’P‚ɁA                                           
#                                                                       
#   ln -sf libhello.so.0.0 libhello.so.0                                
#                                                                       
# ‚ðŽÀs‚·‚邾‚¯‚Å‚à‚æ‚¢‚Å‚·‚ªAldconfig ‚É‚â‚Á‚Ä‚à‚ç‚¢‚Ü‚µ‚傤B       
                                                                        
/sbin/ldconfig -n .                                                     
                                                                        
# linker name ‚ðÝ’肵‚Ü‚·B                                            
# ‚æ‚èô—û‚³‚ꂽÝ’è‚ð‚¨‚±‚È‚¤‚È‚çAŠù‚É linker name ‚ª‘¶Ý‚·‚é‚©‚ð     
# Šm”F‚µA‚à‚µ‘¶Ý‚·‚ê‚΁A‚»‚ê‚ðŽc‚µ‚Ä‚¨‚­‚ׂ«‚©”Û‚©‚𒲂ׂ܂·B        
                                                                        
ln -sf libhello.so.0 libhello.so                                        
                                                                        
# demo_use ƒvƒƒOƒ‰ƒ€‚ðƒRƒ“ƒpƒCƒ‹‚µ‚Ü‚·B                               
                                                                        
gcc -Wall -g -c demo_use.c -o demo_use.o                                
                                                                        
# demo_use ƒvƒƒOƒ‰ƒ€‚ðì¬‚µ‚Ü‚·B-L. ‚É‚æ‚èAƒvƒƒOƒ‰ƒ€ì¬’†‚É       
# "." ‚ªŒŸõ‚³‚ê‚邱‚Æ‚É‚È‚è‚Ü‚·B‚±‚ê‚́AƒvƒƒOƒ‰ƒ€ŽÀsŽž‚É "."        
# ‚ªŒŸõ‚³‚ê‚邱‚Æ‚ðˆÓ–¡ '‚µ‚È‚¢' ‚Æ‚¢‚¤‚±‚Æ‚É’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B        
                                                                        
gcc -g -o demo_use demo_use.o -L. -lhello                               
                                                                        
# ƒvƒƒOƒ‰ƒ€‚ðŽÀs‚µ‚Ü‚·BLD_LIBRARY_PATH ‚ðŽg‚Á‚āA‚Ç‚±‚É‹¤—L          
# ƒ‰ƒCƒuƒ‰ƒŠ‚ª‘¶Ý‚·‚é‚©‚ðƒvƒƒOƒ‰ƒ€‚É‹³‚¦‚é•K—v‚ª‚ ‚邱‚Æ‚É’          
# ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B                                                      
                                                                        
LD_LIBRARY_PATH="." ./demo_use                                          

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

6.6. ƒtƒ@ƒCƒ‹ demo_dynamic.c

/* demo_dynamic.c -- “®“Iƒ[ƒfƒBƒ“ƒO‚Æ "hello" ƒ‹[ƒ`ƒ“Žg—p‚ÌŽÀ—á */  
                                                                       
                                                                       
/* “®“I‚Ƀ‰ƒCƒuƒ‰ƒŠ‚ðƒ[ƒh‚·‚郋[ƒ`ƒ“—p‚É dlfcn.h ‚ª•K—v */          
#include                                                               
                                                                       
#include                                                               
                                                                       
/* "libhello.h" ‚ðƒCƒ“ƒNƒ‹[ƒh‚·‚é•K—v‚ª‚È‚¢‚±‚Æ‚É                     
   ’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B‚µ‚©‚µ‚È‚ª‚çAŠÖ˜A‚·‚é‚à‚Ì‚ð                      
   Žw’è‚·‚é•K—v‚Í‚ ‚è‚Ü‚·Bdlsym() ‚©‚瓾‚悤‚Æ‚µ‚Ä                    
   ‚¢‚é’l‚ð•ÛŽ‚·‚éƒ^ƒCƒv‚ðŽw’è‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B*/                  
                                                                       
/* "simple_demo_function" ƒ^ƒCƒv‚́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‚³‚ê‚郉ƒCƒuƒ‰ƒŠ‚ðƒ[ƒ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 ƒ‰ƒCƒuƒ‰ƒŠ“à‚̊֐”‚ðŒÄ‚яo‚· */                                 
 (*demo_function)();                                                   
                                                                       
 /* ‘S‚Ä‚ªI—¹‚µ‚½‚̂ŁA•¨Ž–‚ð‚«‚ê‚¢‚ɕЕt‚¯‚é */                      
 dlclose(module);                                                      
 return 0;                                                             
}                                                                      

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

6.7. ƒtƒ@ƒCƒ‹ script_dynamic

#!/bin/sh                                                              
# “®“I‚Ƀ[ƒh‚³‚ê‚郉ƒCƒuƒ‰ƒŠ‚ÌŽÀ—á                                   
                                                                       
# libhello.so ‚Æ‚»‚Ì’‡ŠÔ‚ªŠù‚ɍ쐬‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Æ‚µ‚Ü‚·               
# (‹¤—Lƒ‰ƒCƒuƒ‰ƒŠ‚Ì—á‚ðŒ©‚Ä‚­‚¾‚³‚¢)B                                 
                                                                       
# demo_dynamic ƒvƒƒOƒ‰ƒ€ƒtƒ@ƒCƒ‹‚ðƒIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚Ö              
# ƒRƒ“ƒpƒCƒ‹‚µ‚Ü‚·B                                                   
                                                                       
gcc -Wall -g -c demo_dynamic.c                                         
                                                                       
# demo_use ƒvƒƒOƒ‰ƒ€‚ðì¬‚µ‚Ü‚·B                                    
# ‚±‚̃vƒƒOƒ‰ƒ€‚ªŽg—p‚·‚é—Bˆê‚Ì“Á•Ê‚ȃ‰ƒCƒuƒ‰ƒŠ‚́AƒvƒƒOƒ‰ƒ€         
# ‹N“®Œã‚܂э[ƒh‚³‚ê‚È‚¢‚̂ŁADL ƒ‰ƒCƒuƒ‰ƒŠ‚ð‚Ç‚±‚É’T‚µ‚É‚¢          
# ‚¯‚΂悢‚©‚ð‹³‚¦‚é•K—v‚ª‚È‚¢‚±‚Æ‚É’–Ú‚µ‚Ä‚­‚¾‚³‚¢B‚µ‚©‚µ‚È         
# ‚ª‚çADL ƒ‰ƒCƒuƒ‰ƒŠ‚ðƒ[ƒh‚·‚郉ƒCƒuƒ‰ƒŠ‚ðŠÜ‚߂邽‚߁A-ldl          
# ƒIƒvƒVƒ‡ƒ“‚Í '•K—v' ‚Æ‚È‚è‚Ü‚·B                                     
                                                                       
gcc -g -o demo_dynamic demo_dynamic.o -ldl                             
                                                                       
# ƒvƒƒOƒ‰ƒ€‚ðŽÀs‚µ‚Ü‚·BLD_LIBRARY_PATH ‚ðŽg‚¢A“®“I‚Ƀ[ƒh         
# ‚³‚ê‚郉ƒCƒuƒ‰ƒŠ‚ð‚Ç‚±‚Å“¾‚ç‚ê‚é‚©‚ð‹³‚¦‚é•K—v‚ª‚ ‚è‚Ü‚·B           
                                                                       
LD_LIBRARY_PATH="." ./demo_dynamic                                     

„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

7. ‚»‚Ì‘¼‚̏î•ñŒ¹

‰º‹L‚Ì‚à‚̂́Aƒ‰ƒCƒuƒ‰ƒŠ‚ÉŠÖ‚µ‚Ä“Á‚É–ð‚É—§‚î•ñ‚ðŠÜ‚ñ‚Å‚¢‚Ü‚·B

 E Daniel Barlow ‚É‚æ‚é ``The GCC HOWTO''. “Á‚É‚±‚Ì HOWTO ‚́Aƒ‰ƒCƒuƒ‰
    ƒŠì¬—p‚̃IƒvƒVƒ‡ƒ“‚ƁA‚ǂ̂悤‚Ƀ‰ƒCƒuƒ‰ƒŠ‚É–â‚¢‡‚킹‚ð‚·‚é‚©‚É
    ‚‚¢‚Ę_‚¶‚Ä‚¢‚Ü‚·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‚»‚̃tƒH[ƒ}ƒbƒg‚ªˆê”Ê“I‚Å‚Í‚È‚¢
    ‚±‚Æ‚É’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B gunzip ‚Æ untar ‚ðŽÀs‚·‚é‚ƁA``hps'' ƒtƒ@
    ƒCƒ‹‚ª‚Å‚«‚Ü‚·Bƒtƒ@ƒ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 (–óŽÒ‚É‚æ‚é’ljÁ) ²–앐r‚³‚ñ‚É‚æ‚é ``Linux C Library (libc) ‚ɂ‚¢
    ‚Ä''. Linux C Library (libc) ‚ÌŠT—v‚ɂ‚¢‚āA‚»‚Ì–ðŠ„‚Æ—ðŽj‚È‚Ç‚ðŠÈ
    ’P‚É‚Ü‚Æ‚ß‚½‚à‚Ì‚Å‚·B http://www.linux.or.jp/JF/JFdocs/
    libc-intro.html ‚ÅŽQÆ‚Å‚«‚Ü‚·B
   
„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª„ª

8. ’˜ìŒ ‚ƃ‰ƒCƒZƒ“ƒX

‚±‚Ì•¶‘‚Ì’˜ìŒ ‚Í David A. Wheeler ‚É‚ ‚è (Copyright (C) 2000)A GNU
ˆê”ÊŒö—LŽg—p‹–‘ø (GPL) ‚É‚æ‚è•ÛŒì‚³‚ê‚Ü‚·B‘㉿‚È‚µ‚ōĔz•z‚µ‚Ä‚à\‚¢‚Ü
‚¹‚ñB•¶‘‚ÌŒ´•¶‚ð ``ƒvƒƒOƒ‰ƒ€'' ‚ƉðŽß‚µ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.
   
    –{ƒvƒƒOƒ‰ƒ€‚̓tƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Å‚·B‚ ‚È‚½‚́AFree Software
    Foundation ‚ªŒö•\‚µ‚½ GNU ˆê”ÊŒö—LŽg—p‹–‘ø‚́uƒo[ƒWƒ‡ƒ“ 2vˆ½‚¢‚Í
    ‚»‚êˆÈ~‚ÌŠeƒo[ƒWƒ‡ƒ“‚Ì’†‚©‚ç‚¢‚¸‚ê‚©‚ð‘I‘ð‚µA‚»‚̃o[ƒWƒ‡ƒ“‚ª’è
    ‚ß‚éð€‚ɏ]‚Á‚Ä–{ƒvƒƒOƒ‰ƒ€‚ðÄ”Е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.
   
    –{ƒvƒƒOƒ‰ƒ€‚Í—L—p‚Æ‚ÍŽv‚¢‚Ü‚·‚ªA”Еz‚É‚ ‚½‚Á‚ẮAŽsê«‹y‚Ñ“Á’è
    –Ú“I“K‡«‚ɂ‚¢‚Ă̈Öق̕ۏ؂ðŠÜ‚߂āA‚¢‚©‚È‚é•ÛØ‚às‚È‚¢‚Ü‚¹‚ñ
    BÚ×‚ɂ‚¢‚Ä‚Í GNU ˆê”ÊŒö—LŽg—p‹–‘ø‘‚ð‚¨“Ç‚Ý‚­‚¾‚³‚¢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–{ƒvƒƒOƒ‰ƒ€‚ƈꏏ‚É GNU ˆê”ÊŒö—LŽg—p‹–‘ø‚ÌŽÊ‚µ‚ðŽó‚¯Žæ‚Á
    ‚Ä‚¢‚é‚Í‚¸‚Å‚·B‚»‚¤‚Å‚È‚¢ê‡‚́AFree Software Foundation, Inc.,
    59 Temple Place, Suite 330, Boston, MA 0211-1307, USA ‚֎莆‚ð‘‚¢
    ‚Ä‚­‚¾‚³‚¢B
   
‚±‚ê‚ç‚Ìð€‚ÍA‘¼‚̃EƒFƒuƒTƒCƒg‚ªƒ~ƒ‰[ƒŠƒ“ƒO‚ð‚·‚é‚±‚Æ‚ð‹–‰Â‚·‚é‚à‚Ì
‚Å‚·‚ªA

 E ‚ ‚È‚½‚̃~ƒ‰[ƒTƒCƒg‚ªƒ}ƒXƒ^[ƒTƒCƒg‚©‚çÅVî•ñ‚ðŽ©“®“I‚Ɏ擾‚·‚é
    ‚悤‚É‚µA
   
 E ƒ}ƒXƒ^[ƒTƒCƒg‚ւ̃nƒCƒp[ƒŠƒ“ƒN‚Æ‹¤‚Ƀ}ƒXƒ^[ƒTƒCƒg‚̃ƒP[ƒVƒ‡ƒ“ 
    http://www.dwheeler.com/program-library ‚𖾎¦‚µA‚»‚µ‚Ä
   
 E ’˜ŽÒ‚Æ‚µ‚āAŽ„ (David A. Wheeler) ‚ÉŽÓŽ«‚ð‚¨Šè‚¢‚µ‚Ü‚·B
   
‚Í‚¶‚ß‚Ì“ñ‚‚́A‘æˆê‚ɁAŽ„‚ª‰ß‹Ž‚̃oƒO‚ɂ‚¢‚ÄŒJ‚è•Ô‚µ˜b‚ð•·‚©‚³‚ê‚邱
‚Æ‚ð–h‚¬‚Ü‚·B’P‚É‚ ‚È‚½‚ª•¶‘‚ð“KØ‚Ƀ~ƒ‰[ƒŠƒ“ƒO‚µ‚Ä‚¢‚È‚¢‚Æ‚¢‚¤Œ´ˆö
‚Ì‚½‚߂ɁAŽ„‚͈ê”N‘O‚É’¼‚µ‚½ƒoƒO‚ÉŠÖ‚·‚é˜b‚ð•·‚«‚½‚­‚Í‚ ‚è‚Ü‚¹‚ñBƒ}ƒX
ƒ^[ƒTƒCƒg‚ÖƒŠƒ“ƒN‚𒣂邱‚Æ‚É‚æ‚èAƒ†[ƒU‚Í‚ ‚È‚½‚̃TƒCƒg‚ªÅV‚Ì‚à‚Ì
‚Å‚ ‚é‚©‚Ç‚¤‚©‚ðŠm”F‚Å‚«‚Ü‚·B”ñí‚ÉŒµ‚µ‚¢ƒZƒLƒ…ƒŠƒeƒB—v‹‚ª‚ ‚èA‚»‚Ì
‚½‚߂ɃCƒ“ƒ^[ƒlƒbƒg‚֒ʏí‚ɐڑ±‚·‚郊ƒXƒN‚ðŽæ‚邱‚Æ‚ª‚Å‚«‚È‚¢ƒTƒCƒg‚Ì
–â‘è‚ɑ΂µ‚āAŽ„‚Í•qŠ´‚Å‚·B‚±‚Ì‚±‚Æ‚ª‚ ‚È‚½‚̏󋵂ɂ ‚Ä‚Í‚Ü‚é‚È‚ç‚΁A
­‚È‚­‚Æ‚àA‘¼‚̃|ƒCƒ“ƒg‚ւ̐ڑ±‚ðŽŽ‚Ý‚½‚èAŽžÜ‚ ‚È‚½‚̊‹«‚ւ̃Xƒj[
ƒJ[ƒlƒbƒgEƒAƒbƒvƒf[ƒg (–󒍁FƒXƒj[ƒJ[ƒlƒbƒg (sneakernet) \\ FD
“™‚ðŽ‚¿‰^‚Ñ‚·‚邱‚Æ‚É‚æ‚èî•ñ‚ð‹¤—L‚·‚éƒlƒbƒgƒ[ƒN) ‚ðŽŽ‚Ý‚é‚È‚Ç‚µ‚Ä
‚­‚¾‚³‚¢B

‚±‚̃‰ƒCƒZƒ“ƒX‚É‚æ‚ê‚΁A‚ ‚È‚½‚̓hƒLƒ…ƒƒ“ƒg‚ð•ÏX‚µ‚Ä‚à\‚¢‚Ü‚¹‚ñ‚ªA
‚ ‚È‚½‚ª‘‚¢‚½‚à‚Ì‚Å‚Í‚È‚¢‚à‚Ì‚ð‚ ‚È‚½‚Ì‚à‚Ì‚Å‚ ‚é‚ÆŽå’£‚µ‚½‚è (‚‚܂è
“—p‚Å‚·) A•ÏX‚³‚ꂽƒo[ƒWƒ‡ƒ“‚ªŒ´ì‚Å‚ ‚é‚©‚̂悤‚È‚Ó‚è‚ð‚·‚é‚±‚Æ‚Í
‚Å‚«‚Ü‚¹‚ñB’˜ì•¨‚̕ύX‚́A’˜ì•¨‘S‘Ì‚Ì’˜ìŒ ‚ð‚ ‚È‚½‚ɏ÷“n‚·‚é‚à‚Ì‚Å
‚Í‚ ‚è‚Ü‚¹‚ñB‚±‚ê‚́A’˜ìŒ –@‚Ì—pŒê‚Å‚¢‚¤‚Æ‚±‚ë‚Ì ``public domain'' ‚Ì
’˜ì•¨‚Å‚Í‚ ‚è‚Ü‚¹‚ñBƒ‰ƒCƒZƒ“ƒX‚ðÚ×‚ÉŒ©‚Ä‚­‚¾‚³‚¢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•ÏX‚µ‚½ƒtƒ@ƒCƒ‹ã‚É–¾Šm‚É•\Ž¦‚·‚邱‚Æ'' ‚Æ‚¢‚¤‚±
‚Æ‚É‚Í’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢Bƒ‰ƒCƒZƒ“ƒX‚ª‚ǂ̂悤‚È‚±‚Æ‚ð‹–‰Â‚µ‚Ä‚¢‚é‚©‚É‚Â
‚¢‚ÄŽ¿–₪‚ ‚éê‡‚́AŽ„‚ɘA—‚ðŽæ‚Á‚Ä‚­‚¾‚³‚¢B‚½‚¢‚Ä‚¢‚̏ꍇ‚ɂ́A‚ 
‚È‚½‚̕ύX‚ª‘¼‚Ì‚Ý‚È‚³‚ñ‚̕ύX‚Æ‹¤‚Ƀ}ƒXƒ^[ƒRƒs[‚Ö“‡‚³‚ê‚é‚悤A‚ 
‚È‚½‚̕ύX‚𓝍‡ŽÒ (Œ»Ý‚Í David A. Wheeler) ‚Ö‘—‚é‚Ì‚ª‚æ‚¢‚Å‚µ‚傤B