The Linux GCC HOWTO¤¤Ä¶ª©V0.2 : ³sµ²
Previous: °£¿ù»PºÊºÞ
Next: °ÊºA¸ü¤J

6. ³sµ²

¥Ñ©óÀ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´y­z¦¨*°ÊºA³sµ²*¡A¤£¹L¤£·|¬O¦b³o¤@³¹¸`¤¤¡C´«¥y¸Ü»¡¡A³o¤@³¹¸`©Ò½Íªº¡A¥þ³¡¬O«üµo¥Í¦b½s͵²§ô«áªº³sµ²¡C

6.1. ¦@¨Éµ{¦¡®w vsÀRºAµ{¦¡®w

«Ø¥ßµ{¦¡ªº³Ì«á¤@­Ó¨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¥u­nLinux¯à§ä¨ì³o¨Ç¦@¨Éµ{¦¡®wªº¸Ü¡A´N¨S¤°»ò°ÝÃD¡F¤£µM,Linux´N·|³sµ²ÀRºAªº¤F¡C¦pªG§A·Q­n¦@¨Éµ{¦¡®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¡C­Y¬Y¤äµ{¦¡¯Ê¥F¿W¥ß©Ê¡A ldd´N·|»¡¡¥statically linked¡¦©Î¬O¡¥statically linked (ELF)¡¦¡C

6.2. ²×·¥¼f§P¡]¡¥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

6.3. XÀɮסH

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

6.4. «Ø¥ß§A¦Û¤vªºµ{¦¡®w

6.4.1. ±±¨îª©¥»

»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*¥D­n*ªºÅܧó¤Àªù§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ªº¥D­nª©¥»¬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®æ¦¡³Ì¥D­nªº®t§O¤§¤@´N¬O¦b³]¸m¦@¨Éµ{¦¡®w³o¥ó¨Æ¤W¡F§Ú­Ì¥ý¬ÝELF¡A¦]¬°¥¦¤ñ¸û²³æ¤@¨Ç¡C

6.4.2. ELF¡H¥¦¨ì©³¬O¤°»òªFªF£z£°¡H

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

6.4.2.1. «ç»ò¤S¨Ó¤F¡H

³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³Ì¥D­nªº®¦´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¾úªººØºØµh­W¡A¤w¦bELF-HOWTO¤º½×¤Î¡F§Ú¨Ã¤£¥´ºâ¦b³o¨à¶î¼ß½k¡CELF HOWTOÀ³¸Ó»P³o¥÷¤å¥ó¦³¦P¼Ëªº¥DÃD¤~¬O¡C

6.4.2.2. ELF¦@¨Éµ{¦¡®w

­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µ²¡C­n¬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 )

6.4.2.3. ª©¥»½s¸¹¡Bsoname»P²Å¸¹³sµ²

¨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¥D­nªºª@¯Å·|¯}Ã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

6.4.3. a.out---ªº®æ¦¡¡\

«Ø¥ß¦@¨Éµ{¦¡®wªº«K§Q©Ê¬Oª@¯Å¦ÜELFªº¥D­n­ì¦]¤§¤@¡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:-)

6.4.3.1. ZMAGIC vs QMAGIC

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

6.4.3.2. ÀÉ®×°t¸m

¤@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

6.4.3.3. ``libc-lite''?

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

6.4.4. ³sµ²¡G±`¨£ªº°ÝÃD

§â§A³sµ²®É©Ò¾D¹Jªº°ÝÃD±Hµ¹§Ú¡I§Ú¥i¯à¤°»ò¨Æ¤]¤£·|°µ¡A¦ý¬O¥u­n²Ö¿n¤F¨¬°÷ªº¼Æ¶q¡A§Ú·|§â¥¦­Ì¼g°_¨Ó*¡C

§A·Q¦@¨É¡A°¾°¾µ{¦¡«o³sµ²¦¨ÀRºAªº¡I

Àˬ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

DLLªº¤u¨ãµ{¦¡¡¥mkimage¡¦§ä¤£¨ìlibgcc¡H

¦Û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

``Assertion failure'' message when rebuilding a DLL ?

³o¤@±ø¯«¯µªº°T®§³Ì¦³¥i¯àªº­ì¦]¬O¡A¦b­ì©lªºjump.varsÀɮפº¡A¥Ñ©ó«O¯dªºªÅ¶¡¤Ó¤Ö¡A¥H­P©ó³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¥D­nªºª©¥»½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


The Linux GCC HOWTO¤¤Ä¶ª©V0.2 : ³sµ²
Previous: °£¿ù»PºÊºÞ
Next: °ÊºA¸ü¤J