¥Ñ©óÀRºA»P¦@¨Éµ{¦¡®w¨âªÌ¶¡¤£¬Û®eªº®æ¦¡ªº®t²§©Ê»P°Êµü*link*¹L¶q¨Ï¥Î©ó«üºÙ*½sͧ¹¦¨«áªº¨Æ±¡*»P*·í½sͦnªºµ{¦¡¨Ï¥Î®É©Òµo¥Íªº¨Æ±¡*³o¨â¥ó¨Æ¤WÀY¡A¨Ï±o³o¤@³¹¸`Åܱo½ÆÂø¤F³\¦h¡C¡] and, actually, the overloading of the word `load' in a comparable but opposite sense¡^¤£¹L¡A¦A½ÆÂø¤]´N¬O³o¼Ë¤F¡A©Ò¥H»Õ¤U¤£¥²¹L©ó¾á¤ß¡C
¬°¤Fµy·L´î»´ÅªªÌªº§x´b¡A§Úٰ̺õ¦æ´Á¶¡©Òµo¥Íªº¨Æ¬°*°ÊºA¸ü¤J*¡A³o¤@¥DÃD·|¦b¤U¤@³¹¸`¤¤½Í¨ì¡C§A¤]·|¦b§Oªº¦a¤è¬Ý¨ì§Ú§â°ÊºA¸ü¤J´yz¦¨*°ÊºA³sµ²*¡A¤£¹L¤£·|¬O¦b³o¤@³¹¸`¤¤¡C´«¥y¸Ü»¡¡A³o¤@³¹¸`©Ò½Íªº¡A¥þ³¡¬O«üµo¥Í¦b½s͵²§ô«áªº³sµ²¡C
«Ø¥ßµ{¦¡ªº³Ì«á¤@Ó¨BÆJ«K¬O³sµ²¡F¤]´N¬O±N©Ò¦³¤À´²ªº¤pµ{¦¡²Õ¦X°_¨Ó¡A¬Ý¬Ý¬O§_¿òº|¤F¨Ç¤°»ò¡CÅãµM¡A¦³¤@¨Ç¨Æ±¡¬O«Ü¦hµ{¦¡³£·|·Q°µªº---¨Ò¦p¡A¶}±ÒÀɮסA±µµÛ©Ò¦³»P¶}Àɦ³Ãöªº¤pµ{¦¡´N·|±NÀx¦sµ{¦¡®wªº¬ÛÃöÀÉ®×´£¨Ñµ¹§Aªºµ{¦¡¨Ï¥Î¡C¦b¤@¯ëªºLinux¨t²Î¤W¡A³o¨Ç¤pµ{¦¡¥i¥H¦b/lib
»P/usr/lib/
¥Ø¿ý©³¤U§ä¨ì¡C
·í§A¥Îªº¬OÀRºAªºµ{¦¡®w®É¡A³sµ²¾¹·|§ä¥Xµ{¦¡©Ò»Ýªº¼Ò²Õ¡AµM«á¹ê»Ú±N¥¦Ì«þ¨©¨ì°õ¦æÀɤº¡CµM¦Ó¡A¹ï¦@¨Éµ{¦¡®w¦Ó¨¥¡A´N¤£¬O³o¼Ë¤F¡C¦@¨Éµ{¦¡®w·|¦b°õ¦æÀɤº¯d¤U¤@Ó°O¸¹¡A«ü©ú*·íµ{¦¡°õ¦æ®É¡Aº¥ý¥²¶·¸ü¤J³oÓµ{¦¡®w*¡CÅãµM¡A¦@¨Éµ{¦¡®w¬O¸Õ¹Ï¨Ï°õ¦æÀÉÅܱo§ó¤p¡Aµ¥¦P©ó¨Ï¥Î§ó¤Öªº°O¾ÐÅé»PºÏºÐªÅ¶¡¡CLinux¤º©wªº¦æ¬°¬O³sµ²¦@¨Éµ{¦¡®w¡A¥unLinux¯à§ä¨ì³o¨Ç¦@¨Éµ{¦¡®wªº¸Ü¡A´N¨S¤°»ò°ÝÃD¡F¤£µM,Linux´N·|³sµ²ÀRºAªº¤F¡C¦pªG§A·Qn¦@¨Éµ{¦¡®wªº¸Ü¡AÀˬd³o¨Çµ{¦¡®w¡]*.sa
for a.out, *.so
for ELF¡^¬O§_¦í¦b¥¦Ì¸Ó¦bªº¦a¤è¡A¦Ó¥B¬O¥iŪ¨úªº¡C
¦bLinux¤W¡AÀRºAµ{¦¡®w·|¦³Ãþ¦ülibname.a
³o¼Ëªº¦WºÙ¡F¦Ó¦@¨Éµ{¦¡®w«hºÙ¬°libname.so.x.y.z
¡A¦¹³Bªºx.y.z
¬O«üª©¥»§Ç¸¹ªº¼Ë¦¡¡C¦@¨Éµ{¦¡®w³q±`³£·|¦³³sµ²²Å¸¹«ü¦VÀRºAµ{¦¡®w¡]«Ü«nªº¡^»P¬ÛÃöÁpªº.sa
ÀɮסC¼Ð·Çªºµ{¦¡®w·|¥]§t¦@¨É»PÀRºAµ{¦¡®w¨âºØ®æ¦¡¡C
§A¥i¥H¥Îldd
¡]List Dynamic Dependencies¡^¨Ó¬d¥X¬Y¤äµ{¦¡»Ýnþ¨Ç¦@¨Éµ{¦¡®w¡C
$ ldd /usr/bin/lynx
libncurses.so.1 => /usr/lib/libncurses.so.1.9.6
libc.so.5 => /lib/libc.so.5.2.18
³o¬O»¡¦b§Úªº¨t²Î¤W¡AWWWÂsÄý¾¹*lynx*·|¨Ì¿àlibc.so.5
(the C library)»Plibncurses.so.1
¡]²×ºÝ¾÷¿Ã¹õªº±±¨î¡^ªº¦s¦b¡CY¬Y¤äµ{¦¡¯Ê¥F¿W¥ß©Ê¡A ldd
´N·|»¡¡¥statically linked
¡¦©Î¬O¡¥statically linked (ELF)
¡¦¡C
sin()
¦bþÓµ{¦¡®w¸Ì¡H¡¦¡^
nm
µ{¦¡®w¦WºÙÀ³¸Ó·|¦C¥X¦¹µ{¦¡®w¦WºÙ©Ò°Ñ¦Ò¨ìªº©Ò¦³²Å¸¹¡C³oÓ«ü¥O¥i¥HÀ³¥Î¦bÀRºA»P¦@¨Éµ{¦¡®w¤W¡C°²³]§A·Qª¾¹Dtcgetattr()
¬O¦bþ¨à©w¸qªº¡G§A¥i¥H¦p¦¹°µ¡A
$ nm libncurses.so.1 |grep tcget
U tcgetattr
*U
*«ü¥X*¥¼©w¸q*---¤]´N¬O»¡ncursesµ{¦¡®w¦³¥Î¨ìtegetattr()¡A¦ý¬O¨Ã¨S¦³©w¸q¥¦¡C§A¤]¥i¥H³o¼Ë°µ¡A
$ nm libc.so.5 | grep tcget
00010fe8 T __tcgetattr
00010fe8 W tcgetattr
00068718 T tcgetpgrp
*W
*»¡©ú¤F*®zºA(weak)*¡A·N«ü²Å¸¹Áö¤w©w¸q¡A¦ý¥i¥Ñ¤£¦Pµ{¦¡®w¤¤ªº¥t¤@©w¸q©Ò´À¥N¡C³Ì²³æªº*¥¿±`*©w¸q¡]¹³¬Otcgetpgrp
¡^¬O¥Ñ*T
*©Ò¼Ð¥Ü¡G
¼ÐÃD©Ò½Íªº°ÝÃD¡A³Ì²©úªºµª®×«K¬Olibm.(so|a)
¤F¡C©Ò¦³©w¸q¦b<math.h>
ªº¨ç¼Æ³£«O¯d¦bmathsµ{¦¡®w¤º¡F¦]¦¹¡A·í§A¥Î¨ì¨ä¤¤¥ô¦ó¤@Ó¨ç¼Æ®É¡A³£»Ýn¥H-lm
ªº°Ñ¼Æ³sµ²¦¹µ{¦¡®w¡C
ld: Output file requires shared library `libfoo.so.1`
ld»P¨ä¬ÛÃþ¦üªº©R¥O¦b·j´MÀɮתºµ¦²¤¤W¡A·|¨Ì¾Úª©¥»ªº®t²§¦Ó¦³©Ò¤£¦P¡A¦ý¬O°ß¤@¤@Ó§A¥i¥H¦X²z°²³]ªº¤º©w¥Ø¿ý«K¬O/usr/lib
¤F¡C¦pªG§A§Æ±æ¨³B¥¦³Bªºµ{¦¡®w¤]¦C¤J·j´Mªº¦æ¦C¤¤¡A¨º»ò§A´N¥²¶·¥H-L
¿ï¶µ§iª¾gcc©Î¬Old¡C
n¬O§Aµo²{¤@ÂI®ÄªG¤]¨S¦³¡A´N»°ºò¹î¬Ý¬Ý¨ºÀɮ׬O¤£¬OÁ٨ĨĪº½ö¦bì¦a¡C´Na.out¦Ó¨¥¡A¥H-lfoo
°Ñ¼Æ¨Ó³sµ²¡A·|ÅX¨Ïld¥h´M§älibfoo.sa
¡]shared stubs¡^¡F¦pªG¨S¦³¦¨¥\¡A´N·|´«¦¨´M§älibfoo.a
¡]static¡^¡C´NELF¦Ó¨¥¡A ld·|¥ý§älibfoo.so
¡AµM«á¬Olibfoo.a
¡Clibfoo.so
³q±`¬O¤@Ó³sµ²²Å¸¹¡A³sµ²¦Ülibfoo.so.x
¡C
»P¨ä¥¦¥ô¦óªºµ{¦¡¤@¼Ë¡Aµ{¦¡®w¤]¦³×¥¿¤£§¹ªºbugsªº°ÝÃD¦s¦b¡C¥¦Ì¤]¥i¯à²£¥Í¥X¤@¨Ç·sªº¯SÂI¡A§ó§ï¥Ø«e¦s¦bªº¼Ò²Õªº¥\®Ä¡A©Î¬O±Nªº²¾°£±¼¡C³o¹ï¥¿¦b¨Ï¥Î¥¦Ìªºµ{¦¡¦Ó¨¥¡A¥i¯à·|¬O¤@Ó¤j°ÝÃD¡C¦pªG¦³¤@¤äµ{¦¡¬O®Ú¾Ú¨º¨Çªº¯SÂI¨Ó°õ¦æªº¸Ü¡A¨º«ç»ò¿ì¡H
©Ò¥H¡A§Ṳ́޶i¤Fµ{¦¡®wª©¥»½s¸¹ªºÆ[©À¡C§Ú̱Nµ{¦¡®w*¦¸n*»P*¥Dn*ªºÅܧó¤Àªù§OÃþ¡A¦P®É³W©w*¦¸n*ªºÅܧó¬O¤£¤¹³\¥Î¨ì³oµ{¦¡®wªºÂµ{¦¡µo¥Í¤¤Â_ªº²{¶H¡C§A¥i¥H±qµ{¦¡®wªºÀɦW¤À¿ë¥X¥¦ªºª©¥»¡]¹ê»Ú¤W¡AÄY®æ¨ÓÁ¿¡A¹ïELF¦Ó¨¥¶È¶È¬O¤@³õ¤Ñ¤jªºÁÀ¨¥¡FÄ~ÄòŪ±N¤U¥h¡A«K¥i©ú¥Õ¬°¤°»ò¤F¡^¡G libfoo.so.1.2
ªº¥Dnª©¥»¬O1¡A¦¸nª©¥»¬O2¡C¦¸nª©¥»ªº½s¸¹¥i¯à¯u¦³¨ä¨Æ¡A¤]¥i¯à¤°»ò³£¨S¦³---libc¦b³o¤@ÂI¤W¥Î¤F*×¥¿µ{«×*ªºÆ[©À¡A¦Óq¥X¤F¹³libc.so.5.2.18
³o¼Ëªºµ{¦¡®w¦WºÙ¡C¦¸nª©¥»ªº½s¸¹¤ºY¬O©ñ¤@¨Ç¦r¥À¡B©³½u¡B©Î¬O¥ô¦ó¥i¥H¦C¦LªºASCII¦r¤¸¡A¤]¬O«Ü¦X²zªº¡C
ELF»Pa.out®æ¦¡³Ì¥Dnªº®t§O¤§¤@´N¬O¦b³]¸m¦@¨Éµ{¦¡®w³o¥ó¨Æ¤W¡F§ÚÌ¥ý¬ÝELF¡A¦]¬°¥¦¤ñ¸û²³æ¤@¨Ç¡C
ELF¡]Executable and Linking Format¡^³Ìªì¬O¥ÑUSL¡]UNIX System Laboratories¡^µo®i¦Ó¦¨ªº¤G¶i¦ì®æ¦¡¡A¥Ø«e¥¿À³¥Î©óSolaris»PSystem V Release 4¤W¡C¥Ñ©óELF©Ò¼Wº¦ªº¼u©Ê»·»·¶W¹LLinux¹L¥h©Ò¥Îªºa.out®æ¦¡¡A¦]¦¹GCC»PCµ{¦¡®wªºµo®i¤H¤h©ó1995¦~¨M©w§ï¥ÎELF¬°Linux¼Ð·Çªº¤G¶i¦ì®æ¦¡¡C
³o¤@¸`¬O¨Ó¦Û©ó¡¥/news-archives/comp.sys.sun.misc¡¦ªº¤å¥ó¡C
ELF¡]¡§Executable Linking Format¡¨¡^¬O©óSVR4©Ò¤Þ¶iªº·s¦¡§ï¨}¥ØªºÀɮ榡¡CELF¤ñ°_COFF¥i¬O¦h¥X¤F¤£¤Öªº¥\¯à¡C¥HELF¦Ó¨¥¡A¥¦*¬O*¥i¥Ñ¨Ï¥ÎªÌ¦Û¦æ©µ¦ùªº¡CELFµø¤@¥ØªºÀɬ°¸`°Ï¡]sections¡^¡A¦p¦ê¦C¯ëªº²Õ¦X¡F¦Ó¥B¦¹¦ê¦C¥i¬°¥ô·Nªºªø«×¡]¦Ó¤£¬O¤@©T©w¤j¤pªº°}¦C¡^¡C³o¨Ç¸`°Ï»PCOFFªº¤£¤@¼Ë¡A¨Ã¤£»Ýn©T©w¦b¬YÓ¦a¤è¡A¤]¤£»Ýn¥H¬YºØ¶¶§Ç±Æ¦C¡C¦pªG¨Ï¥ÎªÌ§Æ±æ¸É®»¨ì·sªº¸ê®Æ¡A«K¥i¥H¥[¤J·sªº¸`°Ï¨ì¥ØªºÀɤº¡CELF¤]¦³¤@Ó§ó±j¦Ó¦³¤Oªº°£¿ùªk¦¡¡AºÙ¬°DWARF¡]Debugging With Attribute Record Format¡^¡X¥Ø«eLinux¨Ã¤£§¹¥þ¤ä´©¡CDWARF DIEs¡]Debugging Information Entries¡^ªº³sµ²¦ê¦C·|¦bELF¤º§Î¦¨ .debugªº¸`°Ï¡CDWARF DIEsªº¨C¤@Ó .debug¸`°Ï¨Ã«D¤@¨Ç¤Ö¶q¥B©T©w¤j¤pªº¸ê°T°O¿ýªº¶°¦X¡A¦Ó¬O¤@¥ô·Nªø«×ªº¦ê¦C¡A¾Ö¦³½ÆÂøªºÄݩʡA¦Ó¥Bµ{¦¡ªº¸ê®Æ·|¥H¦³½d³ò¨îªº¾ðª¬¸ê®Æµ²ºc¼g¥X¨Ó¡CDIEs©Ò¯à¸É®»¨ìªº¤j¶q¸ê°T¬OCOFFªº .debug¸`°ÏµLªk±æ¨ä¶µIªº¡C¡]¹³¬OC++ªºÄ~©Ó¹Ï¡C¡
ELFÀɮ׬O±qSVR4¡]Solaris 2.0 ¡H¡^ELF¦s¨úµ{¦¡®w¡]ELF access library¡^¤º¦s¨úªº¡C¦¹µ{¦¡®w¥i´£¨Ñ¤@²«K§Ö³tªº¤¶±¤©ELF¡C¨Ï¥ÎELF¦s¨úµ{¦¡®w³Ì¥Dnªº®¦´f¤§¤@«K¬O¡A§A¤£¦A»Ýn¥h¹î¬Ý¤@ÓELFÀɪºqua¤F¡C´NUNIXªºÀɮצӨ¥¡A¥¦¬O¥HElf*ªº«¬¦¡¨Ó¦s¨ú¡F©I¥self_open()¤§«á¡A±q¦¹®É¶}©l¡A§A¥u»Ý©I¥self_foobar()¨Ó³B²zÀɮתº¬Y¤@³¡¥÷§Y¥i¡A¨Ã¤£»Ýn§âÀÉ®×¹ê»Ú¦bºÏºÐ¤Wªºimage·d±o¤@¹Î¶Ã¡C
ELFªºÀu¯ÊÂI»Pª@¯Å¦ÜELFµ¥¯Å©Ò»Ý¸g¾úªººØºØµhW¡A¤w¦bELF-HOWTO¤º½×¤Î¡F§Ú¨Ã¤£¥´ºâ¦b³o¨à¶î¼ß½k¡CELF HOWTOÀ³¸Ó»P³o¥÷¤å¥ó¦³¦P¼Ëªº¥DÃD¤~¬O¡C
Y·QÅýlibfoo.so
¦¨¬°¦@¨Éµ{¦¡®w¡A°ò¥»ªº¨BÆJ·|¹³¤U±³o¼Ë¡G
$ gcc -fPIC -c *.c
$ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o
$ ln -s libfoo.so.1.0 libfoo.so.1
$ ln -s libfoo.so.1 libfoo.so
$ LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH ; export LD_LIBRARY_PATH
³o·|²£¥Í¤@Ó¦W¬°libfoo.so.1.0
ªº¦@¨Éµ{¦¡®w¡A¥H¤Îµ¹¤©ld¾A·íªº³sµ²¡]libfoo.so
¡^ÁÙ¦³¨Ï±o°ÊºA¸ü¤Jµ{¦¡¡]dynamic loader¡^¯à§ä¨ì¥¦¡]libfoo.so.1
¡^¡C¬°¤F¶i¦æ´ú¸Õ¡A§Ú̱N¥Ø«eªº¥Ø¿ý¥[¨ìLD_LIBRARY_PATH
¸Ì¡C
·í§A¬z¬z¼Ö¹D©óµ{¦¡®w»s°µ¦¨¥\¤§®É¡A§O§Ñ¤F§â¥¦²¾¨ì¦p/usr/local/lib
ªº¥Ø¿ý©³¤U¡A¨Ã¥B«·s³]©w¥¿½Tªº³sµ²¸ô®|¡Clibfoo.so.1
»Plibfoo.so.1.0
ªº³sµ²·|¥Ñldconfig
¨Ì¤é´Á¤£Â_ªº§ó·s¡A´N¤j³¡¥÷ªº¨t²Î¨Ó»¡¡Aldconfig·|¦b¶}¾÷¹Lµ{¤¤°õ¦æ¡Clibfoo.so
ªº³sµ²¥²¶·¥Ñ¤â°Ê¤è¦¡§ó·s¡C¦pªG§A¹ïµ{¦¡®w©Ò¦³²Õ¦¨¥÷¤l¡]¦p¼ÐÀYÀɵ¥¡^ªºª@¯Å¡AÁ`¬O©ê«ùµÛ¤@µ·¤£ÎAªººA«×¡A¨º»ò³Ì²³æªº¤èªk´N¬OÅýlibfoo.so -> libfoo.so.1
¡F¦p¦¹¤@¨Ó¡Aldconfig«K·|´À§A¦P®É«O¯d³Ì·sªº³sµ²¡Cn¬O§A¨S¦³³o»ò°µ¡A§A¦Û¦æ³]©wªºªFªF´N·|¦b¼Æ¤é«á³y¦¨¤d©_¦Ê©Çªº°ÝÃD¥X²{¡C¨ì®ÉÔ¡A¥i§O»¡§Ú¨S´£¿ô§A°Ú¡I
$ su
# cp libfoo.so.1.0 /usr/local/lib
# /sbin/ldconfig
# ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so )
¨C¤@Óµ{¦¡®w³£¦³¤@Ósoname¡C·í³sµ²¾¹µo²{¥¦¥¿¦b·j´Mªºµ{¦¡®w¤¤¦³³o¼Ëªº¤@Ó¦WºÙ¡A³sµ²¾¹«K·|±Nsonameºã¤J³sµ²¤¤ªº¤G¶i¦ìÀɤº¡A¦Ó¤£¬O¥¦¥¿¦b¹B§@ªº¹ê»ÚªºÀɦW¡C¦bµ{¦¡°õ¦æ´Á¶¡¡A°ÊºA¸ü¤Jµ{¦¡·|·j´M¾Ö¦³soname³o¼ËªºÀɦWªºÀɮסA¦Ó¤£¬Oµ{¦¡®wªºÀɦW¡C¦]¦¹¡A¤@Ó¦W¬°libfoo.so
ªºµ{¦¡®w¡A´N¥i¥H¦³¤@Ólibbar.so
ªºsoname¤F¡C¦Ó¥B©Ò¦³³sµ²¨ìlibbar.so
ªºµ{¦¡¡A·íµ{¦¡¶}©l°õ¦æ®É¡A·|´M§äªº«K¬Olibbar.so
¤F¡C
³oÅ¥°_¨Ó¦n¹³¤@ÂI·N¸q¤]¨S¦³¡A¦ý¬O³o¤@ÂI¡A¹ï©óÁA¸Ñ¼ÆÓ¤£¦Pª©¥»ªº¦P¤@Óµ{¦¡®w¬O¦p¦ó¦b³æ¤@¨t²Î¤W¦@¦sªºì¦]¡A«o¬OÃöÁ䤧Æ_¡CLinuxµ{¦¡®w¼Ð·Çªº©R¦W¤è¦¡¡A¤ñ¦p»¡¬Olibfoo.so.1.2
¡A¦Ó¥Bµ¹³oÓµ{¦¡®w¤@Ólibfoo.so.1
ªºsoname¡C¦pªG¦¹µ{¦¡®w¬O¥[¨ì¼Ð·Çµ{¦¡®wªº¥Ø¿ý©³¤U¡]e.g. /usr/lib
¡^¡Aldconfig
·|«Ø¥ß²Å¸¹³sµ²libfoo.so.1 -> libfoo.so.1.2
¡A¨Ï¨ä¥¿½Tªºimage¯à©ó°õ¦æ´Á¶¡§ä¨ì¡C§A¤]»Ýn³sµ²libfoo.so -> libfoo.so.1
¡A¨Ïld¯à©ó³sµ²´Á¶¡§ä¨ì¥¿½Tªºsoname¡C
©Ò¥HÅo¡A·í§A×¥¿µ{¦¡®w¤ºªºbugs¡A©Î¬O²K¥[¤F·sªº¨ç¼Æ¶i¥h¡]¥ô¦ó¤£·|¹ï²{¦sªºµ{¦¡³y¦¨¤£§Qªº¼vÅTªº§ïÅÜ¡^¡A§A·|««Ø¦¹µ{¦¡®w¡A«O¯d쥻¤w¦³ªºsoname¡AµM«á§ó§ïµ{¦¡®wÀɦW¡C·í§A¹ïµ{¦¡®wªºÅܧó·|¨Ï±o²{¦³ªºµ{¦¡¤¤Â_¡A¨º»ò§A¥u»Ý¼W¥[soname¤¤ªº½s¸¹---¦¹¨Ò¤¤¡AºÙ·sª©¥»¬°libfoo.so.2.0
¡A¦ÓsonameÅܦ¨libfoo.so.2
¡Cºò±µµÛ¡A¦A±Nlibfoo.so
ªº³sµ²Âà¦V·sªºª©¥»¡F¦Ü¦¹¡A¥@¬É¤S¦A«×«ì´_¤F©M¥¡I
¨ä¹ê§A¤£¶·n¥H¦¹ºØ¤è¦¡¨Ó´Àµ{¦¡®w©R¦W¡A¤£¹L³oªº½T¬OÓ¦nªº¶Ç²Î¡CELF½á¤©§A¦bµ{¦¡®w©R¦W¤Wªº¼u©Ê¡A·|¨Ï±o¤H®ð³Ý©I©Iªº·d¤£²M·¡ª¬ªp¡F¦³³o¼Ëªº¼u©Ê¦b¡A¤]¨Ã¤£ªí¥Ü§A´N±o¥h¥Î¥¦¡C
ELFÁ`µ²¡G°²³]¸g¥Ñ§AºÍ´¼ªºÆ[¹îµo²{¦³ÓºD¨Ò»¡¡Gµ{¦¡®w¥Dnªºª@¯Å·|¯}Ãa¬Û®e©Ê¡F¦Ó¦¸nªºª@¯Å«h¥i¯à¤£·|¡F¨º»ò¥H¤U±ªº¤è¦¡¨Ó³sµ²¡A©Ò¦³ªº¤@¤Á´N³£·|¬Û¦wµL¨Æ¤F¡C
gcc -shared -Wl,-soname,libfoo.so.major -o libfoo.so.major.minor
«Ø¥ß¦@¨Éµ{¦¡®wªº«K§Q©Ê¬Oª@¯Å¦ÜELFªº¥Dnì¦]¤§¤@¡C¨º¤]¬O»¡,a.out¥i¯àÁÙ¬O¦³¥Î³B¦bªº¡C¤Wftp¯¸¥h§ìftp://tsx-11.mit.edu/pub/linux/packages/GCC/src/tools-2.17.tar.gz¡F¸ÑÀ£ÁY«á§A·|µo²{¦³20¶ªº¤å¥ó¥i¥HºCºCªºÅªù¡C§Ú«Ü¤£³ßÅw¦Û¤vÄÒ¬£ªº°¾¨£ªí²{±o¨º»òªº²O¼þºÉP¡A¥i¬O±q¤W¤U¤å¶¡¡AÀ³¸Ó¤]¥i¥H«Ü²M·¡ªº¶å¥X§Ú±q¨Ó¤£®³¥ÛÀY¯{¦Û¤vªº¸}ªºµÊ®ð§a¡I:-)
QMAGIC¬O¤@ºØÃþ¦ü®榡ªºa.out¡]¥çºÙ¬°ZMAGIC¡^ªº¥i°õ¦æÀÉ ®æ¦¡¡A³oºØ®æ¦¡·|¨Ï±o²Ä¤@Ó¤À¶µLªkmap¡C·í0-4096ªº½d³ò¤º¨S¦³mapping¦s¦b®É¡A«h¥i¤¹³\NULL dereference trapping§ó¥[ªº®e©ö¡C©Ò²£¥ÍªºÃä¬É®ÄÀ³¬O§Aªº°õ¦æÀÉ·|¤ñ¸û¤p¡]¤j¬ù¤Ö1K¥ª¥k¡^¡C
¥u¦³§Y±N§@¼oªº³sµ²¾¹¦³¤ä´©ZMAGIC¡A¤@¥b¤w®I¤J´Ã§÷ªº³sµ²¾¹¦³¤ä´©³o¨âºØ®æ¦¡¡F¦Ó¥Ø«eªºª©¥»¶È¤ä´©QMAGIC¦Ó¤w¡C¨Æ¹ê¤W¡A³o¨Ã¨S¦³¦h¤jªº¼vÅT¡A¨º¬O¦]¬°¥Ø«eªº®Ö¤ß¨âºØ®æ¦¡³£¯à°õ¦æ¡C
*file*©R¥OÀ³¸Ó¥i¥H½T»{µ{¦¡¬O¤£¬OQMAGICªº®æ¦¡ªº¡C
¤@a.out(DLL)ªº¦@¨Éµ{¦¡®w¥]§t¨âÓ¯u¹êªºÀÉ®×»P¤@Ó³sµ²²Å¸¹¡C´N*foo*³oӥΩó¾ã¥÷¤å¥ó°µ¬°½d¨Òªºµ{¦¡®w¦Ó¨¥¡A³o¨ÇÀÉ®×·|¬Olibfoo.sa
»Plibfoo.so.1.2
¡F³sµ²²Å¸¹·|¬Olibfoo.so.1
¡A¦Ó¥B·|«ü¦Vlibfoo.so.1.2
¡C³o¨Ç¬O°µ¤°»ò¥Îªº¡H
¦b½sͮɡAld
·|´M§älibfoo.sa
¡C³o¬Oµ{¦¡®wªº*stub*ÀɮסC¦Ó¥B§t¦³©Ò¦³°õ¦æ´Á¶¡³sµ²©Ò»Ýªºexportedªº¸ê®Æ»P«ü¦V¨ç¼Æªº«ü¼Ð¡C
°õ¦æ´Á¶¡¡A°ÊºA¸ü¤Jµ{¦¡·|´M§älibfoo.so.1
¡C³o¶È¶È¬O¤@ӲŸ¹³sµ²¡A¦Ó¤£¬O¯u¹êªºÀɮסC¬Gµ{¦¡®w¥i§ó·s¦¨¸û·sªº¥B¤w×¥¿¿ù»~ªºª©¥»¡A¦Ó¤£·|·l·´¥ô¦ó¦¹®É¥¿¦b¨Ï¥Î¦¹µ{¦¡®wªºÀ³¥Îµ{¦¡¡C¦b·sª©---¤ñ¦p»¡libfoo.so.1.3
---¤w§¹¾ã§e²{®É¡Aldconfig·|¥H¤@·¥·L¤pªº¾Þ§@¡A±N³sµ²«ü¦V·sªºª©¥»¡A¨Ï±o¥ô¦ó쥻¨Ï¥Îª©ªºµ{¦¡¤£·|·P¨ìµ·²@ªº¤£®®¡C
DLLµ{¦¡®w¡]§Úª¾¹D³o¬OµL¿×ªº¤ÏÂÐ---©Ò¥H¹ï§Ú´£¥X¶D³^§a¡I¡^³q±`·|¤ñ¥¦ÌªºÀRºA°Æ¥»n¨Ó±o¤j¦h¡C¥¦Ì¬O¥H*¬}¡]holes¡^*ªº§Î¦¡¨Ó«O¯dªÅ¶¡¥H«K¤é«áªºÂX¥R¡C³oºØ*¬}*¥i¥H¤£¦û¥Î¥ô¦óªººÏºÐªÅ¶¡¡C¤@Ó²³æªºcp
©I¥s¡A©Î¬O¨Ï¥Îmakehole
µ{¦¡¡A´N¥i¥H¹F¨ì³o¼Ë®ÄªG¡C¦]¬°¥¦Ìªº¦ì§}¬O©T©w¦b¦P¤@¦ì¸m¤W¡A©Ò¥H¦b«Ø¥ßµ{¦¡®w«á¡A§A¥i¥H§â¥¦Ì®³±¼¡C¤£¹L¡A¤d¸U¤£n¸ÕµÛ®³±¼ELFªºµ{¦¡®w¡C
libc-lite¬O»´¶q¯Åªºlibcª©¥»¡C¥i¥Î¨Ó¦s©ñ¦bºÏºÐ¤ù¤W¡A¤]¥i¥H´À¤j³¡¥÷§C·LªºUNIX¥ô°È¦¬§À¡C¥¦¨S¦³¥]§tcurses, dbm, termcapµ¥µ¥ªºµ{¦¡½X¡C¦pªG§Aªº/lib/libc.so.4
¬O³sµ²¨ì¤@Óliteªºlibc¡A¨º»ò«ØÄ³§A¥H§¹¾ãªºª©¥»¨ú¥N¥¦¡C
§â§A³sµ²®É©Ò¾D¹Jªº°ÝÃD±Hµ¹§Ú¡I§Ú¥i¯à¤°»ò¨Æ¤]¤£·|°µ¡A¦ý¬O¥un²Ö¿n¤F¨¬°÷ªº¼Æ¶q¡A§Ú·|§â¥¦Ì¼g°_¨Ó*¡C
Àˬd§A´£¨Ñµ¹ld
ªº³sµ²¬O§_¥¿½T¡A¨Ïld¯à§ä¨ì¨C¤@Ó¹ïÀ³ªº¦@¨Éµ{¦¡®w¡A´NELF¦Ó¨¥¡A³o¬O«ü¤@ӲŸ¹³sµ²libfoo.so
¡A³sµ²¦Üimage¡F´Na.out¦Ó¨¥¡A´N¬Olibfoo.sa
ÀɤF¡C«Ü¦h¤H±NELF binutils 2.5ª@¯Å¦Ü2.6¤§«á¡A´N²£¥Í¤F³oÓ°ÝÃD---¦´Áªºª©¥»·j´M¦@¨Éµ{¦¡®w®É¸û¦³´¼¼z¡A©Ò¥H¨Ã¨S¦³±N©Ò¦³ªº³sµ²«Ø¥ß°_¨Ó¡C«á¨Ó¡A¬°¤F»P¨ä¥¦ªº¬[ºc¬Û®e¡A³o¶µ¥Rº¡´¼¼zªº¦æ¬°³Q¤Hµ¹§R°£±¼¤F¡A¥t¥~¡A³o¼Ëªº*´¼¼z*§PÂ_¿ù»~ªº¾÷²v¬Û·í°ª¡A©Ò³y¦¨ªº³Â·Ð¤ñ¥¦©Ò¸Ñ¨Mªº°ÝÃDÁÙ¦h¡A©Ò¥H¯dµÛ¤]¬O®`¤Hºë¡F¤£¦pÂk¥h¤¼¡I
¦Ûlibc.so.4.5.x
¤§«á¡Alibgcc¤w¤£¦A¬O¦@¨Éªº®æ¦¡¡C¦]¦¹¡A§A¥²¶·¦b*-lgcc
*¥X²{¤§³B¥H`gcc -print-libgcc-file-name`
´À¥N¡]§¹¾ãªºË³æ¤Þ¸¹¡]back-quotes¡^¡^¡C¥t¥~¡A§R°£©Ò¦³/usr/lib/libgcc*
ªºÀɮסC³oÂI«Ü«nù¡C
__NEEDS_SHRLIB_libc_4 multiply defined
messages ¬O¦P¼Ëªº°ÝÃD©Ò³y¦¨ªº¥t¤@ºØµ²ªG¡C
³o¤@±ø¯«¯µªº°T®§³Ì¦³¥i¯àªºì¦]¬O¡A¦bì©lªºjump.vars
Àɮפº¡A¥Ñ©ó«O¯dªºªÅ¶¡¤Ó¤Ö¡A¥HP©ó³y¦¨¨ä¤¤¤@Ójump table slots·¸º¡¡C§A¥i¥H°õ¦æ¤u¨ãµ{¦¡¡X¥Ñ2.17.tar.gz®M¥ó©Ò´£¨Ñªº¡¥getsize
¡¦©R¥O¡A©w¥X©Ò¦³¶ûºÃ¥ÇªºÂܸñ¡C¥i¯à°ß¤@ªº¸Ñ¨M¤èªk¬O¡A¸Ñ°£¦¹µ{¦¡®w¥Dnªºª©¥»½s¸¹¡A±j¢¥¦¦^¨ì¤£¬Û®eªº¦~¥N¡C
ld: output file needs shared library libc.so.4
³q±`³o¬Oµo¥Í¦b·í§A³sµ²ªºµ{¦¡®w¤£¬Olibc¡]¦pXµ{¦¡®w¡^¡A¦Ó¥B¦b©R¥O¦C¥Î¤F-g
ªº°Ñ¼Æ¡A«o¨S¦³¤@¨Ö¨Ï¥Î-static
¡A©Òµo¥Xªº¿ù»~°T®§¡C
¦@¨Éµ{¦¡®wªº.sa
stubs³q±`¦³¤@Ó¥¼©w¸qªº²Å¸¹_NEEDS_SHRLIB_libc_4
¡F³o¤@ÂI¥iÂÇ¥Ñlibc.sa
stub¨Ó¸Ñ¨M¡AµM¦Ó¡A¥H-g
¨Ó½sͮɡA·|¨Ï±o³sµ²¥Hlibg.a
©Îlibc.a
¨Óµ²§ô¡F¦]¦¹³oӲŸ¹¤@ª½´N¨S¦³¸Ñ¨M¡A¤]´N·|¾ÉP¤W±ªº¿ù»~°T®§¤F¡C
Á`¤§¡A¥H-g
ªººX¸¹½sͮɧO§Ñ¤F¥[¤W-static
¡A¤£µM´N§O¥Î-g
¨Ó³sµ²¡C³q±`¡A¥H-g
½sͦUÓ¿W¥ßªºÀɮ׮ɡA©ÒÀò±oªº°£¿ù¸ê°T¤w¸g¨¬°÷¡A³sµ²®É´N¥i¥H¤£»Ýn¥¦¤F¡C