Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > f8eb492b80dedd2f6cd33cf45dfc65b6 > files > 22

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


                         The Linux GCC HOWTO¤¤Ä¶ª©V0.2
                                       
§@ªÌ: Daniel Barlow <dan@detached.demon.co.uk>
ĶªÌ: ³¯«Ø¾±(Frank J.S. Chen)<frank63@ms5.hinet.net>

   v1.17, 28 February 1996
     _________________________________________________________________
   
   ¥»¤åÄÄ­z¦w¸ËGNU C½sĶ¾¹©Mµ{¦¡À]ªº¤èªk¡A¦P®É·§Æ[¦a»¡©úµ{¦¡ªº½sĶ¡B³sµ²¡B
   °õ¦æ¡B°£¿ùªº¹Lµ{¥H¤Î¥i¯à­±Á{ªº½Ñ¦h°ÝÃD¡C¼g§@ªº°Ñ¦Ò¸ê®Æ®õ¥b¨Ó¦Û©óMitch
   D'Souza¥ý¥Í©Ò¦¬¶°ªºGCC-FAQ¡F¦Ó¥t¤@­Ó¨Ó·½¬OELF-HOWTO¡C¦¹¥÷HOWTO¥i¥H»¡¤w
   ¥N´À¤FGCC-FAQ¡A¦Ó¥B§Y±N­n¥Ã¤[´À¥NELF-HOWTO¤F¡C¦¹¤DGCC-HOWTO²Ä¤@¥÷¤½¶}µo
   ¦æªºª©¥»¡]¤£¶·²z·|ª©¥»§Ç¸¹¡F¨º¬ORCSªº³Ç§@¡^¡A¦³¥ô¦ó«ü¥¿»P«Øijªº¡A¥»¤H³£
   «ÜÅwªï¡C
     _________________________________________________________________
   
1. ¦æ»·¥²¦ÛÂâ¡I

     * 1.1 ĶªÌªº¸Ü
     * 1.2 °Ê»PÀR
     * 1.3 §@ªÌªº¨p»y
     * 1.4 ¦L¨ê»P±Æª©
       
2. ªFªF¦b­þ¨à¡H

     * 2.1 GCC-HOWTO¦b­þ¨à¡H
     * 2.2 GCC¬ÛÃöªº¸ê®Æ¤S¦b­þ¨à¡H
     * 2.3 GCC 
     * 2.4 Cµ{¦¡À]»P¼ÐÀYÀÉ
     * 2.5 ¦³ÃöÁpªº¤u¨ã (as, ld, ar, strings etc)
       
3. GCCªº¦w¸Ë»PGCCªº³]©w

     * 3.1 GCCªºª©¥»
     * 3.2 ªFªF¸Ë¦n«á³£¨ì­þ¨à¥h¤F?
     * 3.3 ¼ÐÀYÀÉ£z£°?¼ÐÀYÀÉ£z£°?
     * 3.4 «Ø¥ß¥æ¤e½sĶ¾¹(Building cross compilers)
       
4. ²¾´Óµ{¦¡»P½sĶµ{¦¡

     * 4.1 gcc¦Û¦æ©w¸qªº²Å¸¹
     * 4.2 ½u¤W¨D§U»¡©ú
     * 4.3 ²¾´Ó¯à¤O
       
5. °£¿ù»PºÊºÞ

     * 5.1 ¹w¨¾­«©óªvÀø¡]lint¡^
     * 5.2 °£¿ù
     * 5.3 ºÊºÞ
       
6. ³sµ²

     * 6.1 ¦@¨Éµ{¦¡®w vsÀRºAµ{¦¡®w
     * 6.2 ²×·¥¼f§P¡]¡¥sin() ¦b­þ­Óµ{¦¡®w¸Ì¡H¡¦¡^
     * 6.3 XÀɮסH
     * 6.4 «Ø¥ß§A¦Û¤vªºµ{¦¡®w
       
7. °ÊºA¸ü¤J

     * 7.1 °ò¥»·§©À
     * 7.2 ¿ù»~°T®§
     * 7.3 ±±¨î°ÊºA¸ü¤J¾¹ªº¹B§@
     * 7.4 ¥H°ÊºA¸ü¤J¼¶¼gµ{¦¡
       
8. »Pµo®i¤H¤hÁpµ¸

     * 8.1 Bug³øªí
     * 8.2 ¨ó§Uµo®i
       
9. µ²»y

     * 9.1 ¦W¤Hº]
     * 9.2 ½Ķ
     * 9.3 Åwªï¥ô¦óªº¦^õX
     * 9.4 ¦Xªkªº¦æ³w³W©w
       
10. ¯Á¤Þ
     _________________________________________________________________
   
1. ¦æ»·¥²¦ÛÂâ¡I

1.1 ĶªÌªº¸Ü

     * ³o¥÷Ķ¤å¬°Linux document projects(LDP)¤¤¤å½Ķ­pµe¨t¦C¤§¤@¡C¥Ø«e¤§
       ºô§}¬° [1]http://www.linux.org.tw/CLDP/¡AÅwªï¦U¦ìºô¤Í¿ãÅD§ë¤J¦¹¤@­p
       µe¡C
     * §Ú¨Ã¨S¦³§¹¥þ«ö·Ó­ì¤å³v¦r½Ķ¡C¬°¤F¤O¨DĶ¤å³qºZ¥iŪ¡A§Ú·|µyµyªº­«²Õ
       ¤@³¡¥÷ªº¤å¦r¡A¥[ªo²K¾L¡A©Î¬Oºë²­ì¤å¡F³o¼Ë°µªº¸Ü¡A¥i¥HÀ±¸É¤¤­^¤å¶¡
       »yªkµ²ºcªº®t²§©Ê¡A¥B»y®ð¥i¥H³e³qµLê¡C
     * ¤@¨ÇÃöÁä¦r»P±M·~µü·Jµ¥¡A·|ªþ¥[¤W­ì¤å³æ¦r¡C
     * ¹J¦³ÂàĶ§xÃø¡A°ß­ì¤å±`¨£ªº¦r·J¦pbugs¡Bshadow password¡Bpadding
       ¡Bimage¤§Ãþªº¡A«h«O¯d­ì¤å¤£ÅÜ¡C­Y»Õ¤U¹ï³o¨Ç¦r·J¦³¾A·íĶÃ㪺¡A½Ð¤£§[
       «ü±Ð¡C
     * ¤º¤å¤¤­Y¹J¦³"[ĶªÌµù:**]"¤§¼Ð°O¡A«h¬°¥»¤HÃB¥~¤§µù¸Ñ¡C
     * ¹ï³o½gĶ¤å¦³¥ô¦ó«Øij»PºÃ°Ýªº¡A½Ðemail¦Üfrank63@ms5.hinet.net¡C
     * WWW Home Page¡G [2]http://linux.ntcic.edu.tw/~jsfrank/¡C
     * ¦¹¤¤Ä¶¤å¥ó¤§Â½Ä¶Åv¤w¨ú±o­^Äy¤§­ì§@ªÌDaniel Barlow ¥ý¥Í¤§¦P·N¡F¥t¡A
       ³¯«Ø¾±¥ý¥Í«O¦³¦¹¥÷¤¤Ä¶ª©¤å¥ó©Ò¦³ªºÅv§Q¡A§A¥i¥H¥ô·Nªº«þ¨©¡A¥H¦UºØ´C
       Åé´²§G³o¥÷¤¤Ä¶¤å¥ó¡A°ß¦¹¸`¸É¥R»¡©ú»Ý­ì«Ê¤£°Êªþ¤W¡A¥B¤£¥i¥ô·N§ó°ÊĶ
       ¤å¡C
     * v0.1ª©ªºÄ¶¤å¬Û·í²ÊÁW¡A³s¤å¥yªº»yªkµ²ºc³£¶û¤Ó¹L©óÃP´²¡Av0.2ª©°w¹ï¤¤
       ¤åªº¥Î¦r²ßºD¨Ó­×¥¿¡A¨Ã±N¤W¤@ª©Ä¶ªº¤£§´·íªº¦a¤è­×¥¿¹L¨Ó¡A¨Ò¦peither
       ³o­Ó¦r¡A­^°ê¤H±`§âeither·í¦Wµü¥Î¡A«ü¨âªÌ¤¤¥ô·N¤@­Ó¡F³o¥÷HOWTO´N¥R¥÷
       ¤ÏÀ³¥X³o­Ó¥Î¦r²ß©Ê¡A¸ò¬ü»y¦³°ò¥»¤Wªº®t²§¡C
     * ¤å¤¤¦³´X¥y¸Ü¨S¦³Ä¶¥X¨Ó¡A¤@¤è­±¬O¬Ý¤£À´¡A¥t¤è­±¬Oª½Ä¶¤]Ķ¤£¥X¨Ó¡A©Ò
       ¥H¥u¦n«O¯d­ì¤å¤F¡A­n¬O»Õ¤U¦³·sªº»â®©ªº¡AµL½×¦p¦ó½Ð§i¶D§Ú¡C
     * v0.1ª©Â½Ä¶°_©l¤é´Á¬°¡G11/7/97¡FºI¤î¤é´Á¬°¡G11/19/97¡C
     * v0.2ª©­×¥¿°_©l¤é´Á¡G5/13/98¡FºI¤î¤é´Á¬°¡G6/3/98¡C
       
1.2 °Ê»PÀR

   ¥Ø«eLinuxªºµo®i¥¿ªiÀܬ¤´éªº¶i¦æµÛ¡C²³æ¤@ÂIÁ¿¡ALinux¦³¨âºØ°õ¦æÀɪº®æ¦¡
   ¥i¥Î¡A¨ú¨M©ó§Aªº¨t²Î¬O«ç»ò¾ã¦X°_¨Óªº¡F§AªºLinuxÀ³¸Ó¬O¨ä¤¤¤@ºØ§a¡I¾\Ū³o
   ¥÷¤å¥ó¡A¥i¥HÀ°§U§AÂç²M°õ¦æÀɪºÃþ§O¡C
   
   ­n¦p¦ó°Ï§O©O¡H°õ¦æ¤½¥Îµ{¦¡¡¥file¡¦¡]¨Ò¦p¡Afile /bin/bash¡^´N¹ï¤F¡C
   ´NELFªºµ{¦¡¦Ó¨¥¡A¿Ã¹õ¤WÅã¥Ü¥X¨Óªº°T®§·|§t¦³ELFªº¦r²´¡F¦pªG»¡¬Oa.outªº¡A
   °T®§¤º·|ºã¦³ Linux/i386ªº¦r¼Ë¡C
   
   ELF»Pa.out®æ¦¡ªº®t²§¤§³B·|¦b«áÄòªº³¹¸`¤¤°Q½×¡]«Ü¼sªx³á¡I¡^¡CELF¬O¤ñ¸û·s
   ªº®æ¦¡¡A¤@¯ë¦Ó¨¥¡A±µ¨üªºµ{«×¸û¨Î¡C
   
1.3 §@ªÌªº¨p»y

   ª©Åv»¡©ú»P¦Xªkªº¦æ³w³W©w¡A´NÂ\¦b³o¥÷¤å¥óªº§ÀºÝ¡C°£¦¹¤§¥~¡A§ÚÁÙ¦³¤@¨Ç¤£
   ±o¤£´£¿ô§Aªº¸Ü­nÁ¿¡C´Nºâ§A¶¢µÛ¨S¨Æ·F¡A¤]¤£­n¦bUsenet¤W¥á¤@¨Ç§b¥Ê°Ýªº°Ý
   ÃD¡FÁÙ¦³¡A¤£­n¦Ñ¥H¬°¦Û¤vC»y¨¥ªº¥\¤O²`«p¡A±Mªùµoªí¤@¨Ç¤£¬Obugsªºbugs¥X¨Ó
   ¥á¤H²{²´¡A³o¤£´Nµ¥©ó§i¶D§O¤H§A¤£¾ÇµL³N¡A¦bÃö¦Ñ·Ý­±«e­A¤j¤M¤F¶Ü¡H©Ò¥H»¡
   ¦Û¥H¬°¬Oªº­^¶¯¥D¸q¬O±o¤£Àv¥¢ªº¡C
   
1.4 ¦L¨ê»P±Æª©

   ¦pªG§A²{¦bŪªº¬OPostscript¡Bdvi©Î¬Ohtml®æ¦¡¡A¨º»ò§A©Ò¬Ý¨ìªº¦r«¬ÅܤƴN·|
   ¤ñ¥uŪ¯Â¤å¦r®æ¦¡ªº¤H¦h¤@¨Ç¡C¯S§O¬OÀɮצWºÙ¡B©R¥O¡B©R¥Oªº¿é¥X»PºK¿ý¥X¨Ó
   ªº­ì©l½Xµ¥¡A²Î²Î³£¬O¥´¦r¾÷ªº¦r«¬¡C³o¼Ë°µªº¸Ü¡A¹ï©ó¬Y¨Ç»Ý­n±j½Õªº¡¥ÅܼÆ
   ¡¦ÁÙ¦³¨º¨Ç¨S¦³©T©wµ²ªGªº½d¨Ò¦Ó¨¥¡A´N¥i¥H¹F¨ì±j½Õªº®ÄªG¤F¡C
   
   Ū³o¥÷¤å¥óªº¦P®É¡A§A¤]·|±o¨ì¤@®MÆZ¦³¥Îªº¯Á¤Þ¡C°²­Y¬Odvi¡B postscript¤§
   Ãþªºª©¥»¡A¯Á¤Þªº¼Æ¦r´N¬O³¹¸`(section)ªº½s¸¹¡F¦pªG¬OHTMLªº¸Ü¡A³o¨Ç¼Æ¦r·|
   «ö¶¶§Ç±Æ¦C¡A§A¥i¥H¥Î·Æ¹«¥ªÁä¥h³sµ²¬Û¹ïªº¯Á¤Þ¤º®e¡F¦pªG§A¬Ýªº¬O¯Â¤å¦rª©
   ¥»ªº¸Ü, ¼Æ¦r´N¥u¬O¼Æ¦r¡A¨S§Oªº§t·N¡F«Øij§A»°§Öª@¯Å¬°§®­ù¡I
   
   §Ú¥Îªºshell¬OBourne shell¡]¤£¬OC shell¡^¡AÁ|ªº¨Ò¤l¦ÛµM¬OBourne shellªº
   »yªk¡C¦pªG§A¥Îªº¬OC shellªº¸Ü¡A³]©wÀô¹ÒÅܼƪº»yªk·|¹³¤U­±³o¼Ë¡G
   
% setenv FOO bar

   ­n¬O¥ÎBourne shellªº¸Ü¡A§Ú·|³o¼Ë¤l¼g¡G
   
$ FOO=bar; export FOO

   ¦pªG´£¥Ü²Å¸¹Åã¥Üªº¬O¤«¦r²Å¸¹#¦Ó¤£¬O¿ú¦r²Å¸¹ $ªº¸Ü¡A«Ü¦³¥i¯à³o­Ó©R¥O¬O¥u
   ¾A¥Î©óroot¦Ó¤w¡C·íµM°Õ¡A­n¬O§A¸Õ¤F³o¨Ç½d¨Ò¡Aµ²ªG§Ë±o§Aªº¨t²Îµo¥Í¨aÅÜ¡A
   §Ú¥i¬O¤@ÂI³d¥ô¤]¤£·|­tªº³á¡I¯¬¦n¹B¡I:-)
   
   11/8/97Ķ. 5/13/98­×­q
   
2. ªFªF¦b­þ¨à¡H

2.1 GCC-HOWTO¦b­þ¨à¡H

   ³o¥÷¤å¥ó¬OLinux HOWTO¨t¦C¤§¤@¡A´«¥y¸Ü»¡¡A§A¥i¥H¦b©Ò¦³¦s©ñLinux HOWTO¤å
   ¥óªººô¯¸¤W­±§ä¨ì¦oªºªÚÂÜ¡A¨Ò¦p
   [3]http://sunsite.unc.edu/pub/linux/docs/HOWTO/¡CHTMLªºª©¥»¡]¥i¯à·|¬O¸û
   ·sªºª©¥»¡^¥i¥H±q
   [4]http://ftp.linux.org.uk/~barlow/howto/gcc-howto.html¤W­±§ì¤U¨Ó¡C
   
2.2 GCC¬ÛÃöªº¸ê®Æ¤S¦b­þ¨à¡H

   ¼Ð·Çªºgcc»¡©ú¤å¥ó¬OÀHªþ¦bµo¦æªº­ì©l½X(source distribution)¤º¡]©¹¤U¬Ý´N
   ¦³¤F¡I¡^¡A¸ÌÀY¦³textinfo»P.info¨âºØÀɮסC­n¬O§Aªººô¸ô³s±µ³t²v°÷§Ö¡A©Î¬O
   ¦³¤@¤ùcdrom¡A¤£µM¡A¦³°ª«×ªº­@¤ß¤]¦¨¡A§A¥i¥H¦Û¤v§â¥¦untar¡AµM«á¦A§â¬Û¹ï
   À³ªº¦ì¤¸¤@¤@«þ¨©¨ì/usr/infoªº¥Ø¿ý©³¤U¡C°²¦p§Aªº±ø¥ó»P¤W­zªº¤£²Å¡A¤£§«¨ì
   [5]tsx-11¯¸¤W¥h°ÑÆ[°ÑÆ[¡C¤£¹L¡A§Ú·Q¡A¨S¦³¥²­n¦Ñ¬O±}°OµÛ³Ì·sªºª©¥»§a¡I
   
   libcªº¤å¥ó»¡©ú¦³¨âºØ¨Ó·½¡C¤@ºØ¬OGNU libc¡A¥H.infoªº®æ¦¡Àx¦s¡A°£¤Fstdio
   ¤§¥~¡A¨ä¾lLinux libcªº»¡©ú³£¬Û·íªº¸ÔºÉºë½T¡C¥t¤@ºØ¥i¥H¦bLinuxªºarchive
   [6]manpages¤W§ä¨ì¨t²Î©I¥s¡]system call¡^¡]²Ä2¸`¡^»Plibc¨ç¼Æ¡]function¡^
   ¡]²Ä3¸`¡^ªº¤å¥ó»¡©ú¡C
   
2.3 GCC

   ¸Ñµª¦³¤G:
   
   (a)§A¥i¥H¦b [7]ftp://tsx-11.mit.edu:/pub/linux/packages/GCC/ªººô¯¸¤W§ä
   ¨ì ¥¿¦¡ªºLinux GCCµo¦æ¨t²Î(distribution)¡A¦Ó¥B¬O¤w¸g½sĶ¦nªº¥i°õ¦æÀÉ¡C
   ·í§Ú¦b¼g³o¥÷¤å¥ó®É¡A2.7.2(gcc-2.7.2.bin.tar.gz)¬O³Ì·sªºª©¥»¡C
   
   (b)¦Û¥Ñ³nÅé°òª÷·|¡]Free Software Foundation¡^©Òµo§GªºGCC³Ì·s­ì©l½X¥i¥H
   ±qºô¯¸ [8]GNU archives¤W¨ú±o¡C¨S¦³¥²­n«D±o»P¤W­zªºª©¥»¤@­P¤~¦æ¡A¤£¹L³o
   ­Óª©¥»ªº½T¬O¥Ø«e³Ì·sªº¡CLinux GCCªººûÅ@ºô¤Í(maintainers)Åý§A¥i¥H«Ü»´ÃP
   ªº¦Û¦æ½sĶ³o­Ó³Ì·sªºª©¥»¡Cconfigure©R¥O½Z(script)·|À°§A¦Û°Ê³]©w¦n©Ò¦³¸Ó
   °µªº¨Æ±¡¡C«Øij§A¦³ªÅ¤£§«¨ì [9]tsx-11¬Ý¬Ý¡A»¡¤£©w·|¦³­×¥¿ªºª©¥»¬O§A·|·Q
   ­n¥Îªº¡C
   
   ¦pªG·Q­n½s¼g¥X¤@¨Ç¦³¥Îªº³nÅé¡]¤£¬O§ÚÅo­ö¡AÁÙ¬O¦³¤£¤Ö¨SÔ£¥Î³~ªº³nÅé¦bºô
   ¸ô¤W¥|³B¬y«¡C¡^¡A¤U­±³o¤@¤p¸`©Ò½Íªº¤]¬O§A»Ý­nªº¡G
   
2.4 Cµ{¦¡À]»P¼ÐÀYÀÉ

   ¸Ó¿ï­þ¤@®Mµ{¦¡À]¬O¨ú¨M©ó(i)§Aªº¨t²Î¬OELFªº©Î¬Oa.outªº¡F(ii)§A§Æ±æ§Aªº¨t
   ²ÎÅܦ¨­þ¤@ºØ¡H¦pªG§A¬O±qlibc 4ª@¯Å¨ìlibc 5¡A¨º»òµ¹§A¤@­Ó¨}¤ßªº«Øij¡A¥ý
   ¥h¬Ý¬ÝELF-HOWTO¦A»¡¡C§A¤@©w·|°Ý¡A¦bELF¤å¥óªº­þ¨à©O¡H¼K¡I¼K¡I¤£°¾¤£­Ê¡A
   ´N®t¤£¦h¸ò³o¥÷¤å¥ó¬Û¦Pªº¦ì¸m¡Cºô¯¸ [10]tsx-11¤W­±¥i¥H§ä¨ì§A·Q­nªº¡C
   
   libc-5.2.18.bin.tar.gz
          --- ELF¦@¨Éµ{¦¡À]¡]ELF shared library images¡^¡AÀRºAµ{¦¡À]
          ¡]static libraries¡^»P¼ÐÀYÀÉ¡]°w¹ïC»y¨¥»P¼Æ¾Çµ{¦¡À]¡^¡C
          
   libc-5.2.18.tar.gz
          ---libc-5.2.18.bin.tar.gzªº­ì©l½X¡C³o­ÓÀɮקA¤]»Ý­n¡A¦]¬°.bin.®M
          ¥ó(package)§t¦³¥²»Ýªº¼ÐÀYÀÉ¡C¦pªG¦¹®É§A¥¿µS¿Ý¤£¨M¡A¤£¾å±o¬O¦Ñ¨­
          ¿Ë¦Û¤U®ü¡A°Ê¤â½sĶCµ{¦¡®w¤ñ¸û¦n¡FÁÙ¬Oª½±µ¥Î¤H®a½sĶ¦nªº¤G¶i¦ì
          ÀÉ(binaries)´N¥i¥H¤F¡C¦³³oºØ§xÂZªº¤H¡A¨Ó¡A¬Ý§Úªº¼L§Î¡G¥Î¤H®a½sĶ
          ¦nªº¤G¶i¦ìÀɤ£´N¸Ñ¨M¤F¹À¡I¥u¦³¦b§A·Q­nNYS©Î¬Oshadow passwordªº±¡
          ªp¤U¡A¤~»Ý­n¦Û¤vªº¤â¨Ó±À°Ê·nÄx¡C
          
   libc-4.7.5.bin.tar.gz
          --- ³o­ÓÀɮ׬Oa.outªº¦@¨Éµ{¦¡®w(shared library images)»PÀRºAµ{¦¡
          ®w¡A¥Î³~¬O¬°¤F»P«e­zªºlibc 5®M¥ó¦@¦s¦@ºa¦Ó³]­pªº¡A¤£¹L°£«D§A·Q­n
          Ä~Äò¨Ï¥Îa.outªºµ{¦¡©Î¬OÄ~Äòµo®ia.outªºµ{¦¡¡A¤£µMªº¸Ü¡A¬O¤£»Ý­n¥¦
          ªº¡C
          
2.5 ¦³ÃöÁpªº¤u¨ã (as, ld, ar, strings etc)

   ¨ì¥Ø«e¬°¤î¡A»P¤§«e©Ò½Íªº³£¤@¼Ë¡A±qºô¯¸ [11]tsx-11¤W¡A´N¥i¥H§ä¨ì³o¨Ç¤u¨ã
   µ{¦¡¡C¥Ø«eªºª©¥»¬Obinutils-2.6.0.2.bin.tar.gz¡C
   
   »Ý­nª`·Nªº¬Obinutils¥u¾A¥Î©óELF¡A¦Ó¥B¥Ø«elibcªºª©¥»¤]³£¬OÄÝ©óELFªº¡F·í
   µM°Õ¡A²ßºDa.outªº¤H¦pªG¦³­ÓELFªºlibc»Pa.outªºlibcÁp¦X°_¨Ó¤@°_¨Ï¥Î¡A³o¹ï
   ¥L­Ì¨ÓÁ¿¬O¦A¦n¤£¹Lªº¬ü¨Æ¤F¡C¤£¥i§_»{ªº¡ACµ{¦¡À]ªºµo®i¥¿¥H°í¨Mªº¸}¨BÁÚ
   ¦VELFªº®æ¦¡¡A°£«D§A¯uªº¦³«Ü¦nªº²z¥Ñ¡A»Ý­na.outªºªFªF¡A¤£µM°Ú¡A¤j®a³£·|
   ¹ªÀy§A«i©ó¬ð¯}¡A¶X¦­¥[¤J¾U¤£¥i¾×ªº¤j¼é¬y¡C
   
   11/9/97Ķ
   
3. GCCªº¦w¸Ë»PGCCªº³]©w

3.1 GCCªºª©¥»

   ¦bshellªº´£¥Ü²Å¸¹¤UÁä¤Jgcc -v¡A¿Ã¹õ¤W´N·|Åã¥Ü¥X§A¥Ø«e¥¿¦b¨Ï¥ÎªºGCCªºª©
   ¥»¡C¦P®É³o¤]¬O¤@­Ó¬Û·í¥i¾aªº¤èªk¡A¥i¥H½T©w§A²{¦b©Ò¥Îªº¬OELF©Î¬Oa.out¡C
   ¦b§Úªº¨t²Î¤W¡A°õ¦ægcc -vªºµ²ªG¬O¡G
   
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2

   ¤W­±ªº°T®§«ü¥X¤F´X¥ó­«­nªº¨Æ±¡¡G
     * i486 ³o¬O«ü©ú§A²{¦b¥¿¦b¥Îªºgcc¬O¬°¤F486ªº·L³B²z¾¹¦Ó¼gªº---§Aªº¹q¸£
       ¥i¯à¬O386©Î¬O586¡C³o3ºØ·L³B²z¾¹ªº´¹¤ù©Ò½sĶ¦Ó¦¨ªºµ{¦¡½X¡A©¼¦¹¶¡¬O¥i
       ¥H¬Û®e¨Ï¥Îªº¡C®t§O¤§³B¬O486ªºµ{¦¡½X¦b¬Y¨Ç¦a¤è¦³¥[¤Wpaddingªº¥\¯à¡A
       ©Ò¥H¥i¥H¦b486¤W­±¶]±o¤ñ¸û§Ö¡C³o¹ï386ªº¾÷¾¹¦Ó¨¥¡A°õ¦æµ{¦¡ªº®Ä¯à¨Ã¤£
       ·|¦³¤°»ò¤£¨}ªº¼vÅT¡A¥u¤£¹L¯uªº·|Åýµ{¦¡½XÅܱoµyµyªº¤j¤F¤@¨Ç¡C
     * box ³o¥i¥H»¡¤@ÂI¤]¤£­«­n¡F¤£¹L¤]¥i¯à¥t¦³©Ò«ü¡]¹³¬Oslackware©ÎªÌ
       ¬Odebian¡^¡A©ÎªÌ®Ú¥»¤°»ò¤]¤£¬O¡]©Ò¥HÅo¡I§¹¾ãªº¥Ø¿ý¦WºÙ¬Oi486-linux
       ¡^¡C°²¦p§A¬O¹ê°È¬£ªºË³Ë³ªÌ¡A¿Ë¦Û°Ê¤â«Ø¥ßÄÝ©ó¦Û¤vªºgcc¡A¨º»ò§A¥i¥H¦b
       «Ø¥ßªº¹Lµ{¤¤³]©w³o¤@¶µ¡A¥H¸ËÂIªù­±¡C´N¹³§Ú°µªº¤@¼Ë:-)¡C
     * linux ¨ä¹ê³o¬O«ülinuxelf©Î¬Olinuxaout¡C³o¤@¶µ·|¥O¤H¤Þ°_¤£¥²­nªº§x´b
       ¡A¨s³º¬O«ü­þ¤@ºØ·|®Ú¾Ú§A©Ò¥Îªºª©¥»¦Ó²§¡C
          + linux ·N«üELF­Yª©¥»§Ç¸¹¬O2.7.0.¡]©Î¬O§ó·sªºª©¥»¡^¡F§_«hªº¸Ü¡A
            ´N¬Oa.outªº¤F¡C
          + linuxaout ·N«üa.outªº®æ¦¡¡C·ílinuxªº©w¸q±qa.out§ó´«¨ìELF®É
            ¡Alinuxaout´N·|¶¶¤ô±À¦à¡A·n¨­¤@ÅÜ¡A¦¨¤F¤@­Ó¥Ø¼Ðª«¡C¦]¦¹¡A§A¤£
            ·|¬Ý¨ì¥ô¦óª©¥»·s©ó2.7.0.ªºgcc¦³linuxaoutªº¡C
          + linuxelf ¤w¸g¹L®É¤F¡C³q±`³o¬O«ü2.6.3ª©ªºgcc¡A¦Ó¥B³o­Óª©¥»¤]¥i
            ¥H¥Î¨Ó²£¥ÍELFªº¥i°õ¦æÀÉ¡C­nª`·Nªº¬O¡Agcc 2.6.3ª©¦b²£¥ÍELFµ{¦¡
            ½X®É·|¦³bugs¡A©Ò¥H¦pªG§A¥Ø«e¥Îªº«ê¦n¬O³o­Óª©¥»¡A«Øij§A»°§Öª@¯Å
            ¡C
     * 2.7.2 ª©¥»ªº§Ç¸¹¡C
       
   ©Ò¥H¡AÁ`µ²°_¨Ó¡A§Ú¦³2.7.2ª©ªºgcc¡A¥i¥H²£¥ÍELF®æ¦¡ªºµ{¦¡½X¡C´N³o»ò²³æ¡A
   Åå³Y§a¡Ieh¡H
   
3.2 ªFªF¸Ë¦n«á³£¨ì­þ¨à¥h¤F?

   ¦pªG¦w¸Ëgcc®É¨S¦³¥J²Óªº¬ÝµÛ¿Ã¹õ¡A©ÎªÌ§A¬O±q¤@­Ó§¹¾ãªºµo¦æ¨t²Î¸Ì§âgcc³æ
   ¿W§ì¥X¨Ó¦w¸Ëªº¸Ü¡A¨º»ò¤]³\§A·|·Qª¾¹D¨ì©³³o¨ÇªFªF¸Ë¦n«á¬O¦í¦b¾ã­ÓÀɮרt
   ²Îªº¨º¨Ç¦a¤è¡C´X­Ó­«ÂI¦p¤U¡G
   
     * /usr/lib/gcc-lib/target/version/ ¡]»P¤l¥Ø¿ý¡^¤j³¡¥÷ªº½sĶ¾¹´N¬O¦í¦b
       ³o­Ó¦a¤èªº¡C¦b³o¨à¦³¥i°õ¦æªºµ{¦¡¡A¹ê»Ú¦b°µ½sĶªº¤u§@¡F¥t¥~¡AÁÙ¦³¤@
       ¨Ç¯S©wª©¥»ªºµ{¦¡®w»P¼ÐÀYÀɵ¥¤]·|Àx¦s¦b¦¹¡C
     * /usr/bin/gcc «üªº¬O½sĶ¾¹ªºÅX°Êµ{¦¡---¤]´N¬O§A¹ê»Ú¦b©R¥O¦C(command
       line)¤W°õ¦æªºµ{¦¡¡C³o­Ó¥Ø¿ý¥i¨Ñ¦UºØª©¥»ªºgcc¨Ï¥Î¡A¥u­n§A¥Î¤£¦Pªº½s
       Ķ¾¹¥Ø¿ý¡]¦p¤W©Ò­z¡^¨Ó¦w¸Ë´N¥i¥H¤F¡C­nª¾¹D¤º©wªºª©¥»¬O¨º¤@­Ó¡A
       ¦bshell´£¥Ü²Å¸¹¤U¥´gcc -v¡C­n¬O·Q±j­¢°õ¦æ¬Y­Óª©¥»¡A´N´«¥´gcc -V
       version¡C¨Ò¦p¡G
       
# gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
# gcc -V 2.6.3 -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.6.3/specs
gcc driver version 2.7.2 executing gcc version 2.6.3

     * /usr/target/(bin|lib|include)/ ¦pªG§A¸Ë¤F¼ÆºØªº¥Ø¼Ðª«¥ó¡A¨Ò¦pa.out
       »Pelf¡A©Î¬O¬Y¤@ºØªº¥æ¤e½sĶ¾¹(cross-compiler)µ¥µ¥¡A¨º¨ÇÄÝ©ó«D¥D¬y¥Ø
       ¼Ðª«¥ó¡]non-native target(s)¡^ªºµ{¦¡®w¡Abinutils¡]as¡Bldµ¥µ¥¡^¤u¨ã
       »P¼ÐÀYÀɵ¥³£¥i¥H¦b³o¨à§ä¨ì¡C§Y¨Ï§A¥u¦w¸Ë¤F¤@ºØgcc¡AÁÙ¬O¥i¥H¦b³o¨à§ä
       ¨ì³o¨Ç­ì¥»´N¬O´À¥¦­Ì·Ç³ÆªºªFªF¡C¦pªG¤£¬O¦b³o¨à¡A¨º»ò´NÀ³¸Ó¬O
       ¦b/usr/(bin|lib|include)¤F¡C
     * /lib/¡A/usr/lib »P¨ä¥¦ªº¥Ø¿ýµ¥³£¬O¥D¬y¨t²Î¡]native-system¡^ªºµ{¦¡À]
       ¥Ø¿ý¡C³\¦hªºÀ³¥Îµ{¦¡³£·|¥Î¨ì/lib/cpp¡A¦]¦¹§A¤]»Ý­n¥¦---§@ªk¤W¡A¤£¬O
       ±q/usr/lib/gcc-lib/target/version/ ¥Ø¿ý¸Ì«þ¨©¡A´N¬O§Ë­Ó²Å¸¹³sµ²
       ¡]symlink¡^«ü¦V¨º¨à¡C [ĶªÌµù:©Ò¿×ªºnative¡A¬O«ü¥Ø«e§Aªº¨t²Î¬O
       ¥Ha.out©Îelfªº®æ¦¡¬°¥D¡A©ÎªÌ¤º©wªºgcc¬O­þ¤@ºØª©¥»µ¥µ¥¡Cnativeªº·N«ä
       ¬O¡¥¥»¤gªº¡¦¡B¡¥¥»°êªº¡¦»P¡¥¤Ñ¥Íªº¡¦¡K¡Kµ¥µ¥¡F·í§A®³¨ì¤@¤ùCD-ROM­«
       ÀY¦Ü§À±NLinux¦w¸Ë§¹¦¨¡AÅýLinux¥X¥Í¡A¦¨¬°§A­Ó¤H¯S¦â¿@«pªº§@·~¥­¥x«á
       ¡A¦pªG¦A¥[¸Ë¤@¨Ç¤£¤@¼Ëªº¥Ø¼Ðª«¥ó¡A¦ÛµM´N¦³¡¥¥»¤g¡¦»P¡¥¥~¬Ù¡¦¡} µLÃö
       ¬Fªv¡~¡A¡¥¥»°ê¡¦»P¡¥¥~°ê¡¦¡B¡¥¤Ñ¥Í¡¦»P¡¥¤H¬°¡¦µ¥µ¥ªº°Ï§O¡A¦P®É¤]§t
       ¦³¤º©w¡]default¡^ªº·N«ä¦b¡C°²­Y¦Aªþ¥[¤W§A­Ó¤Hªº»ù­ÈÆ[§PÂ_©M³ß¦n¡A§Ú
       ·Q¥Î¥D¬y¡]native¡^»P«D¥D¬y¡]non-native¡^¨Ó½ĶÀ³¸ÓÁÙºâ«ê·í¡C]
       
3.3 ¼ÐÀYÀÉ£z£°?¼ÐÀYÀÉ£z£°?

   °²¦p§â§A¦Û¦æ¦w¸Ë¦b/usr/local/include¥Ø¿ý©³¤Uªº¼ÐÀYÀɱư£¦b¥~ªº¸Ü
   ¡ALinuxÁÙ¦³¥t¥~3ºØ¥D­nªº¼ÐÀYÀÉ¡G
   
     * /usr/include/»P¨ä¤l¥Ø¿ý©³¤Uªº¼ÐÀYÀÉ¡A¤j³¡¥÷³£¬O¥ÑH.J.Luµo®iªºlibc®M
       ¥ó(libc binary package)©Ò´£¨Ñªº¡C§Ú·|¥u»¡¡¥¤j³¡¥÷¡¦ªº­ì¦]¡A¬O¦]¬°§A
       ¥i¯à¦³¨ä¥¦¨Ó·½ªº¼ÐÀYÀÉ¡]¹³¬Ocurses»Pdbmµ{¦¡®wµ¥µ¥¡^Â\¦b³o¨à¡F¤×¨ä¬O
       ¡A¦pªG§A²{¦b¥Îªº¬O³Ì·sªºlibcµo¦æ¨t²Îªº¸Ü¡]·sª©¥»¤£¹³Âª©¨º¼Ë¡A¤w¸g
       ¤£¦A¤ä´©curses©Îdbm¤F¡C¡^¡A¨ºªFªF¤§¦h¬O¤H¤H¬°¤§©Q¦Þªº¡I [ĶªÌ
       µù:libc binary package·N«ü¥H¤G¶i¦ì§Î¦¡(machine code)Àx¦s¤§®M¥ó¡A¨Ã
       «D­ì©l½X¡]text¡^¡A­Y­n¥H¤¤¤å¥þºÙĶ¥X¡A«h¦¨¡¥libc¤G¶i¦ìÀÉ®M¥ó¡¦¡A¦ü
       ¦³Ám¤ú¤§¶û¡A¬G²¤¥hbinary¡A¥Hlibc®M¥ó³qºÙ¡C]
     * ¦b®Ö¤ß­ì©l½Xªºµo¦æ¨t²Î¤º(kernel source distribution)
       ¡A/usr/include/linux »P /usr/include/asm ¡]¸ÌÀY¦³³o¨ÇÀÉ®×
       ¡G<linux/*.h> »P <asm/*.h>¡^À³¸Ó¦³²Å¸¹³sµ²¡]symbolic links¡^¥i¥H³s
       µ²¦Ü¥Ø¿ýlinux/include/linux »P linux/include/asm¡C¦pªG§A¦³ÂEÃ[¤§§Ó
       ªº¸Ü¡A¦w¸Ë³o¨ÇªFªF«á¡A´N¤£À³¸Ó¥u¬O®³¨Ó½sĶ®Ö¤ß¡]kernel¡^¦Ó¤w¡C §â­ì
       ©l½X¸ÑÀ£ÁY¡]unpacking¡^«á¡A¥i¯à§A¤]·|µo²{¡A»Ý­n¦b®Ö¤ßªº¥Ø¿ý
       ¡]kernel directory¡^©³¤U°µmake configªº°Ê§@¡C«Ü¦hªºÀɮ׳£·|¨Ì
       ¿à<linux/autoconf.h>ªºÀ°¦£¡A¥i¬O³o­ÓÀɮ׫o¦³¥i¯à¦]ª©¥»¤£¦P¦Ó¤£¦s¦b
       ¡C­Y¤z®Ö¤ßª©¥»¸Ì¡Aasm´N¥u¬O¥¦¦Û¤vªº¤@­Ó²Å¸¹³sµ²¡A¶È¶È¬O¦bmake
       config®É¤~«Ø¥ß¥X¨Ó¦Ó¤w¡C [ĶªÌµù:­ì¤å´£¤Îautoconf.h®É¬O¡¥Many
       files depend on <linux/autoconf.h>,which otherwise may not exist,*
       ¡¦¡C¦¹³B¤§otherwise¤§µü©ÊÀ³¬°§Î®eµü(adj)¡A«ü¡¥¥t¤@±¡ªp¡¦¡B¡¥¥t¤@ºØ
       ¡¦¡B¡¥¤£¦Pªº¡¦¤§·N¡A±N­ì¤å§Î®eµü¤l¥y©î¶}¨ÓÀ³¬°¡G(i) Many files
       depend on <linux/autoconf.h>. (ii)<linux/autoconf.h> of other
       condition may not exist. »P¤U¤@¥y¤¬¬Û¤ñ¹ï¡A¦¹³BÀ³¦P«ü¦b¤£¦Pª©¥»¤§±¡
       ªp¤U¡C] ©Ò¥H¡A·í§A¦b¥Ø¿ý/usr/src/linux©³¤U¡A¸Ñ¶}®Ö¤ßªºµ{¦¡½X®É¡A´N
       ·ÓµÛ¤U­±«ü¥Üªº°µ§a¡I
       
$ cd /usr/src/linux
$ su
# make config
(¦^µª±µ¤U¨Óªº°ÝÃD¡C³q±`¦^µª±o¥¿¤£¥¿½T¨Ã¤£­«­n¡A°£«D§A¥´ºâÄ~Äò¿v³y®Ö¤ß¡C)
# cd /usr/include
# ln -s ../src/linux/include/linux .
# ln -s ../src/linux/include/asm .

     * ½Ñ¦p<float.h>¡B<limits.h>¡B<varargs.h>¡B<stdarg.h> »P<stddef.h>¤§Ãþ
       ªºÀɮסA·|ÀHµÛ¤£¦Pªº½sĶ¾¹ª©¥»¦Ó²§¡AÄÝ©ó§A¡¥­Ó¤Hªº¡¦ÀɮסA¥i¥H¦b
       /usr/lib/gcc-lib/i486-box-linux/2.7.2/include/»P¨ä¥¦¬ÛÃþ¦ü¡]¬Û¦P¡^
       ªº¥Ø¿ý¦WºÙªº¦a¤è§ä¨ì¡C 11/11/97Ķ 5/14/98­×¥¿
       
3.4 «Ø¥ß¥æ¤e½sĶ¾¹(Building cross compilers)

  ±NLinux·í§@¼Ðªº§@·~¥­¥x(target platform)
  
   °²³]§A¤w¸g®³¨ìgccªº­ì©l½X¡A³q±`§A¥u­n¨Ì´`INSTALLÀɪº«ü¥Ü«K¥i§¹¦¨¤@¤Áªº
   ³]©w¡C make«á­±¦A±µconfigure --target=i486-linux --host=XXX on
   platform XXX¡A´N¯àÀ°§AÅܧâÀ¸¤F¡C­nª`·Nªº¬O¡A§A·|»Ý­nLinuxÁÙ¦³®Ö¤ßªº¼ÐÀY
   ÀÉ¡F¦P®É¤]»Ý­n«Ø¥ß¥æ¤e²ÕĶ¾¹(cross assembler)»P¥æ¤e³sµ²¾¹(cross
   linker)¡A¨Ó·½¬O [12]ftp://tsx-11.mit.edu/pub/linux/packages/GCC/¡C
   
  Linux·í¦¨­ì©l§@·~¥­¥x(source platform)¦ÓMSDOS§@¬°¼Ðªº§@·~¥­¥x
  
   Ugh¡C«Ü©úÅ㪺¡A³o­Ó¤j·§»Ý­n¥Î¨ì®M¥ó¡§emx¡¨©Î¬O©µ¦ù®M¥ó¡§go¡¨¡C½Ð¦Û¦æ¥h
   [13]ftp://sunsite.unc.edu/pub/Linux/devel/msdos¬Ý¬Ý¡C§Ú¨Ã¨S¦³´ú¸Õ¹L³o¨Ç
   ­ÓªF¦è¡A©Ò¥H¨S¦³¿ìªk«OÃÒ¤°»ò¡C
   
4. ²¾´Óµ{¦¡»P½sĶµ{¦¡

4.1 gcc¦Û¦æ©w¸qªº²Å¸¹

   ¥u­n°õ¦ægcc®É¡Aªþ¥[ -v³o­Ó°Ñ¼Æ¡A´N¯à§ä¥X§A©Ò¥Îªº³oª©gcc¡A¦Û°ÊÀ°§A©w¸q¤F
   ¤°»ò²Å¸¹¡C¨Ò¦p¡A§Úªº¾÷¾¹¬Ý°_¨Ó·|¹³³o¼Ë¡G
   
$ echo 'main(){printf("hello world\n");}' | gcc -E -v -
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
 /usr/lib/gcc-lib/i486-box-linux/2.7.2/cpp -lang-c -v -undef
-D__GNUC__=2 -D__GNUC_MINOR__=7 -D__ELF__ -Dunix -Di386 -Dlinux
-D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__i386
-D__linux -Asystem(unix) -Asystem(posix) -Acpu(i386)
-Amachine(i386) -D__i486__ -

   °²­Y§A¥¿¦b¼gªºµ{¦¡½X·|¥Î¨ì¤@¨ÇLinux¿W¦³ªº¯S©Ê¡A¨º»ò§â¨º¨ÇµLªk²¾´Óªºµ{¦¡
   ½X¡A¥H±ø¥ó¦¡½sĶªº«e¸m©R¥O«Ê¬A°_¨Ó¡A¥i¬O­Ó¤£¿ùªº¥D·N©O¡I¦p¤U©Ò¥Ü¡J
   
#ifdef __linux__
/* ... funky stuff ... */
#endif /* linux */

   ¥Î__linux__´N¥i¥H¹F¦¨¥Øªº¡F¬Ý¥J²Ó¤@ÂI¡A¤£¬Olinux³á¡C¾¨ºÞlinux¤]¦³©w¸q¡A
   ²¦³º¡A³o­Ó¤´µM¤£¬OPOSIXªº¼Ð·Ç¡C
   
4.2 ½u¤W¨D§U»¡©ú

   gcc½sĶ¾¹°Ñ¼Æªº»¡©ú¤å¥ó¬Ogcc info page¡]¦bEmacs¤º¡A«ö¤UC-h i¡AµM«á¿ï
   ¡¥gcc¡¦ªº¿ï¶µ¡^¡C­n¬O§Ë¤£¥X¨Ó¡A¤£¬O½æ§ACD-ROMªº¤H¨S§â³o­ÓªFªFÀ£µ¹§A¡A¤£
   µM´N¬O§A²{¦b¥Îªº¬Oª©ªº¡C¹J¨ì³oºØ±¡ªp¡A³Ì¦nªº¤èªk¬O²¾°Ê´LÁv¨ìarchive
   [14]ftp://prep.ai.mit.edu/pub/gnu©Î¬O¥¦ªºmirrors¯¸¥x¡A¥h§âgccªº­ì©lÀÉ®×
   §ì¦^®a¡A­«·s²i¶¹¤@µf¡C
   
   gcc manual page¡]gcc.1¡^ ¥i¥H»¡¬O¤w¸g¹L®É¤F¡A­n¬O§A¦Y¹¡¤F¼µµÛ¨S¨Æ·Fµw¬O
   ·Q¬Ý¡A¥¦´N·|§i¶D§A»¡§OµL²á¤F¡C
   
  ºX¥¿ÄÆÄÆ
  
   ¦b©R¥O¦C¤W°õ¦ægcc®É¡A¥u­n¦b¥¦ªº§¾ªÑ«á­±¥[¤W-Onªº¿ï¶µ¡A´N¯àÅýgcc¨Ä¨Äªº´À
   §A¥Í¥X³Ì¨Î½s½Xªº¾÷¾¹½X¡C³o¸Ìªºn¬O¤@­Ó¥i¦³¥iµLªº¤p¾ã¼Æ¡A¤£¦Pª©¥»ªºgcc
   ¡Anªº·N¸q»P¨ä¥¿½Tªº¥\®Ä³£¤£¤@¼Ë¡A¤£¹L¡A¨å«¬ªº½d³ò¬O±q0¡]¤£­nÂû±C¡A§Ú¤£
   ­n³Ì¨Î½s½X¡C¡^Åܤƨì2¡]³Ì¨Î½s½X­n¦h¤@ÂI¡C¡^¡A¦Aª@¯Å¨ì3¡]³Ì¨Î½s½X­n¦A¦h
   ¤@ÂI¡A¦h¤@ÂI¡^¡C
   
   gcc¦b¨ä¤º³¡·|±N³o¨Ç¼Æ¦rÂàĶ¦¨¤@¨t¦Cªº-f»P-mªº¿ï¶µ¡C°õ¦ægcc®É±a¤WºX¸¹-v
   »P-Q¡A§A´N¯à«Ü²M·¡ªº¬Ý¥X¨C¤@ºØµ¥¯Åªº-O¬O¹ïÀ³¨ì¨º¨Ç¿ï¶µ¡C¦n¤ñ»¡¡A´N-O2¨Ó
   Á¿¡A§Úªºgcc§i¶D·|§Ú»¡¡G
   
enabled: -fdefer-pop -fcse-follow-jumps -fcse-skip-blocks
-fexpensive-optimizations
         -fthread-jumps -fpeephole -fforce-mem -ffunction-cse -finline
         -fcaller-saves -fpcc-struct-return -frerun-cse-after-loop
         -fcommon -fgnu-linker -m80387 -mhard-float -mno-soft-float
         -mno-386 -m486 -mieee-fp -mfp-ret-in-387

   ­n¬O§A¥Îªº³Ì¨Î½s½Xµ¥¯Å°ª©ó§Aªº½sĶ¾¹©Ò¯à¤ä´©ªº¡]e.g. -O6¡^¡A¨º»ò¥¦ªº®Ä
   ªG´N¸ò§A¥Î§Aªº½sĶ¾¹©Ò¯à´£¨Ñªº³Ì°ªµ¥¯Åªº®ÄªG¬O¤@¼Ëªº¡C»¡¹ê¦bªº¡Aµo¦æ¥X
   ¥hªºgccµ{¦¡½X¡A¥Î¦b½sĶ®É³º¬O¦p¦¹³B²z³oµ¥°ÝÃD¡A¯uªº¤£¬O¤°»ò¦nªººc·Q¡C¤é
   «á­Y¬O¦³§ó¶i¨Bªº³Ì¨Î½s½X¤èªk¨ãÅé¾ã¦X¨ì·sªºª©¥»¸Ì¡A¦Ó§A¡]©Î¬O§Aªºusers¡^
   ÁÙ¬O¸ÕµÛ³o¼Ë°µªº¸Ü¡A¥i¯à´N·|µo²{gcc·|¤¤Â_§Aªºµ{¦¡¤F¡C
   
   ±qgcc 2.7.0ª@¯Å¨ì2.7.2ªºusersÀ³¸Óª`·N¤@ÂI¡A¨Ï¥Î-O2®É·|¦³¤@­Óbug¡C§óÁV¿|
   ªº¬O¡A±j«×§é´î°Ñ¼Æ(strength reduction)©~µM¨S¦³¥Î¡I­n¬O§A³ßÅw­«·s½s
   Ķgccªº¸Ü¡A¬O¦³¨º»ò¤@­Ó­×¥¿ªºª©¥»¥i¥H§ó¥¿³o¶µ¿ù»~¡F¤£µMªº¸Ü¡A¤@©w­n½T©w
   ¨C¦¸½sĶ®É³£¦³¥[¤W-fno-strength-reduce³á¡I
   
   11/12/97Ķ
   
  ¦³­Ó©Êªº·L³B²z¾¹
  
   ¦³¤@¨Ç-mªººX¸¹¤Q¤À¦³¥Î³B¡A¦ý¬O«oµLªkÂǥѦUºØµ¥¯Åªº-O¥´¶}¨Ó¨Ï¥Î¡C³o¤§¤¤
   ³Ì­«­nªº¦³¬O-m386©M-m486³o¨âºØ¡A¥Î¨Ó§i¶Dgcc¸Ó§â¥¿¦b½sĶªºµ{¦¡½Xµø§@±M
   ¬°386©Î¬O486¾÷¾¹©Ò¼gªº¡C¤£½×¬O¥Î­þ¤@ºØ-m¨Ó½sĶµ{¦¡½X¡A³£¥i¥H¦b©¼¦¹ªº¾÷
   ¾¹¤W°õ¦æ¡A-m486½sĶ¥X¨Óªº½X·|¤ñ¸û¤j¡A¤£¹L®³¨Ó¦b386ªº¾÷¾¹¤W¶]¤]¤£·|¤ñ¸û
   ºC´N¬O¤F¡C
   
   ¥Ø«e©|µL-mpentium©Î¬O-m586ªººX¸¹¡CLinus«Øij§Ú­Ì¥i¥H¥Î-m486
   -malign-loops=2 -malign-jumps=2 -malign-functions=2¨Ó±o¨ì³Ì¨Î½s½Xªº486
   µ{¦¡½X¡A³o¼Ë°µ¥¿¦n´N¥i¥HÁקKalignment¡]Pentium¨Ã¤£»Ý­n¡^¦³¹L¤jªºgapsµo
   ¥Í¡CMichael Meissner»¡¡G
   
     §Úªº²Ä¤»·P§i¶D§Ú¡A-mno-strength-reduce¡]¼K¡I­n¾å±o§Ú¥i¤£¬O¦b½Í±j«×§é
     ´î°Ñ¼Æªºbug§r¡A¨º¤w¸g¬O¥t¥~¤@­Óª§½×ªº¾Ô³õ¤F¡C¡^¤@¼Ë¤]¥i¥H¦bx86ªº¾÷¾¹
     ¤W²£¥Í¸û§Öªºµ{¦¡½X¡A³o¬O¦]¬°x86ªº¾÷¾¹¹ï¼È¦s¾¹¦³µÛ¤£¥i¿i·ÀªºÄÈ´÷¦b¡A
     ¦Ó¥BGCC's method of grouping registers into spill registers vs.
     other registers doesn't help either¡C¶Ç²Î¤W¡A±j«×§é´îªºµ²ªG·|¨Ï±o½s
     Ķ¾¹¥h§Q¥Î¥[ªk¼È¦s¾¹¥H¥[ªk¹Bºâ¨Ó¨ú¥N­¼ªk¹Bºâ¡C¨Æ¹ê¤W¡A§Ú¦bÃh
     ºÃ-fcaller-saves¥i¯à¤]¥u¬O­Óº|¬}¤]»¡¤£©w¡C
     
     ¦Ó§Úªº²Ä¤C·P«h¦A«×ªº§i¶D§Ú»¡¡A-fomit-frame-pointer¥i¯à·|¤]¥i¯à¤£·|¦³
     ¥ô¦óªºÁÈÀY¡C±q³oÂI¨Ó¬Ý¡A´N¬O·N¿×µÛ¦³¥t¤@­Ó¼È¦s¾¹¥i¥H¥Î¨Ó³B²z°O¾ÐÅé¤À
     °tªº°ÝÃD¡C¥t¤è­±¡A­Y¯Âºé±qx86ªº¾÷¾¹¦bÂà´«¥¦ªº«ü¥O¶°¦¨¬°¾÷¾¹½Xªº¤èªk
     ¤W¨Ó¬Ý¡A«K·N¿×µÛ°ïÅ|©Ò¥Î¨ìªº°O¾ÐÅéªÅ¶¡­n¤ñframe©Ò¥Î¨ìªºÁÙ­n¨Ó±o¦h¡F
     ´«¥y¸Ü»¡¡AIcache¹ïµ{¦¡½X¦Ó¨¥¨Ã¨S¦³¹ê½è¤WªºÀ°§U¡A­Y¬O»Õ¤U¥Î
     ¤F-fomit-frame-pointerªº¸Ü¡A¦P®É¤]¬O§i¶D½sĶ¾¹¦b¨C¦¸©I¥s¨ç¼Æ¤§«á¡A´N
     ¥²¶·­×¥¿°ïÅ|ªº«ü¼Ð¡FµM¦Ó¡A´Nframe¨ÓÁ¿¡A­Y©I¥sªº¦¸¼Æ¤£¦hªº¸Ü¡A«h¤¹³\
     °ïÅ|¼È®É°ï¿n°_¨Ó¡C
     
   ¦³Ãö³o¤è­±¥DÃDªº³Ì«á¤@¬q¸Ü¤´¬O¨Ó¦Û©óLinus¡G
   
     ­nª`·Nªº¬O¡A¦pªG§A·Q­n±o¨ì³Ì¨Îª¬ªpªº°õ¦æ®Ä¯à¡A¥i¤d¸U§O¬Û«H§Úªº¸Ü¡CµL
     ½×¦p¦ó¡A¤@©w­n¶i¦æ´ú¸Õ¡Cgcc½sĶ¾¹ÁÙ¦³³\¦hªº°Ñ¼Æ¥i¥Î¡A¨ä¤¤¥i¯à´N¦³¤@
     ºØ³Ì¯S§Oªº²Õ¦X¡A¥i¥Hµ¹§A³Ì¨Î½s½Xªºµ²ªG¡C
     
   11/14/97Ķ 5/15/98­×¥¿
   
  Internal compiler error: cc1 got fatal signal 11
  
   Signal 11¬O«ü SIGSEGV¡A©ÎªÌ ¡¥segmentation violation¡¦¡C³q±`³o¬O«ü
   »¡gcc¹ï¦Û¤v©Ò¥Îªº«ü¼Ð·P¨ì§x´b¡A¦Ó¥BÁÙ¹Á¸ÕµÛ§â¸ê®Æ¼g¤J¤£Äݩ󥦪º°O¾ÐÅé¸Ì
   ¡C©Ò¥H¡A³o¥i¯à¬O¤@­Ógccªºbug¡C µM¦Ó¡A¤jÅé¦Ó¨¥¡Agcc¬O¤@¤ä¸g¹LÄY±K´ú¸Õ¥B
   ¥i¾a«×¨}¦nªº³nÅé¨Î§@¡C¥¦¤]¥Î¤F¤j¶q½ÆÂøªº¸ê®Æµ²ºc»PÅå¤Hªº«ü¼Ð¼Æ¶q¡C²¨¥
   ¤§¡A­Y¬O­nµû¿ï¥»¥@¬ö³Ì¬D±§»P³Ì¤@µ·¤£ÎAªºRAM´ú¸Õµ{¦¡¡Agccµ´¹ï¥i¥H¤@ºK¦Z
   «a¡C°²¦p§AµLªk­«·s½Æ»s³o°¦bug---·í§A­«·s¶}©l½sĶ®É¡A¿ù»~ªº°T®§¨Ã¨S¦³¤@
   ª½¥X²{¦b¦P¤@­Ó¦a¤è---¨º´X¥G¥i¥H½T©w,¬O§AªºµwÅ饻¨­¦³°ÝÃD(CPU,°O¾ÐÅé,¥D
   ¾÷ªO©Î¬O§Ö¨ú°O¾ÐÅé).¤d¸U¤£­n¦]¬°§Aªº¹q¸£¥i¥H³q¹L¶}¾÷µ{§Çªº´ú¸Õ¡B©Î
   ¬OWindows¥i¥H¶]±o«Ü¶¶¡B©ÎªÌ¨ä¥¦¤°»òªº¡A´N¦^¹LÀY¨Ó¤j¸v«Å¶Ç»¡³o¬Ogccªº¤@
   ­Óbug¡F§A©Ò°µªº³o¨Ç´ú¸Õ°Ê§@¡A³q±`¨S¦³¤°»ò¹ê»Ú¤Wªº»ù­È¡A³o¬O«Ü¦X²zªºµ²½×
   ¡C¥t¥~¡A¤]¤£­n¦]¬°½sĶ®Ö¤ß®É¡AÁ`¬O°±¯d¦b¡¥make zImage¡¦ªº¶¥¬q¡A´N­n¤j½|
   ³o¬Ogccªºbug---·íµM¥¦·|°±¦b¨º¨à°Ú¡I°µ¡¥make zImage¡¦®É¡A»Ý­n½sĶªºÀÉ®×
   ¥i¯à´N¶W¹L200ÀɮסF§Ú­Ì¥¿¦b¬ãÀÀ¤@­Ó´À¥Nªº¤è®×¡C
   
   ¦pªG§A¥i¥H­«Âв£¥Í³o­Óbug¡A¦Ó¥B¡]³Ì¦n¬O³o¼Ë°Õ¡I¡^¥i¥H¼g¤@­Óµu¤pªºµ{¦¡¨Ó
   ®i¥Ü³o°¦bugªº¸Ü¡A§A´N¥i¥H§â¥¦°µ¦¨bug³ø§i¡AµM«áemailµ¹FSF¡A©ÎªÌ
   ¬Olinux-gcc³q«H½×¾Â¡C§A¥i¥H¥h°Ñ¦Ògccªº»¡©ú¤å¥ó¡A¬Ý¬Ý¦³¤°»ò¸Ô²Óªº¸ê°T,¬O
   ¥L­Ì©Ò»Ý­nªº¡C
   
4.3 ²¾´Ó¯à¤O

   ¾Ú³ø¡Aªñ¤é¨Ó³\¦h¥¿­±ªº®ø®§«ü¥X¡A­Y¬O¦³¬Y¥óªFªF¨ì²{¦b³£ÁÙ¨S²¾´Ó¨ìLinux¤W
   ¥h¡A¨º»ò¥i¥HªÖ©wªº¬O¡A¥¦¤@©w¤@ÂI»ù­È¤]¨S¦³¡C:-)
   
   ¶â¡I¥¿¸g¤@ÂI¡C¤@¯ë¦Ó¨¥¡A­ì©l½X¥u»Ý­n°µ¤@¨Ç§½³¡ªº­×§ï¡A´N¥i¥H§JªALinux
   100%»PPOSIX¬Û®eªº¯S½è¡C¦pªG§A°µ¤F¥ô¦óªº­×§ï¡A¦Ó±N¦¹³¡¥÷¶Ç¦^µ¹­ì§@ªÌ¡A·|
   ¬O«Ü¦³«Ø³]©ÊªºÁ|°Ê¡C³o¼Ë¤é«á´N¥u»Ý­n¥Î¨ì¡¥make¡¦¡A´N¯à±o¨ì¤@­Ó¥i°õ¦æªº
   ÀɮפF¡C
   
  BSD±Ð®{ (¦³ bsd_ioctl¡Bdaemon »P <sgtty.h>)
  
   ½sĶµ{¦¡®É¡A¥i¥H°t¦X-I/usr/include/bsd»P³sµ²-lbsdªºµ{¦¡®w¡C¡]¨Ò¦p¡G¦b§A
   ªºMakefileÀɤº¡A§â-I/usr/include/bsd¥[¨ìCFLAGS¨º¤@¦æ¡F§â-lbsd¥[
   ¨ìLDFLAGS¨º¤@¦æ¡^¡C¦pªG§A¯uªº¨º»ò·Q­nBSD«¬ºAªº«H¸¹¦æ¬°¡A¤]¤£»Ý­n¦A¥[
   ¤W-D__USE_BSD_SIGNAL¤F¡C¨º¬O¦]¬°·í§A¥Î¤F-I/usr/include/bsd»P§t¬A¤F¼ÐÀY
   ÀÉ<signal.h>¤§«á¡Amake®É´N·|¦Û°Ê¥[¤J¤F¡C
   
  ¥¢¸¨ªº«Ê¦L(SIGBUS, SIGEMT, SIGIOT, SIGTRAP, SIGSYS etc)
  
   Linux»PPOSIX¬O§¹¥þ¬Û®eªº¡C¤£¹L¡A¦³¨Ç«H¸¹¨Ã¤£¬OPOSIX©w¸qªº---ISO/IEC
   9945-1:1990 (IEEE Std 1003.1-1990), paragraph B.3.3.1.1 sez:
   
     ¡§¦bPOSIX.1¤¤¬Ù²¤¤FSIGBUS¡BSIGEMT¡BSIGIOT¡BSIGTRAP»PSIGSYS«H¸¹¡A¨º¬O
     ¦]¬°¥¦­Ìªº¦æ¬°»P¹ê§@ªº¤è¦¡®§®§¬ÛÃö¡A¦Ó¥B¤]µLªk¶i¦æ¾A·íªº¤ÀÃþ¡C½T»{¹ê
     §@¤è¦¡«á¡A«K¥i¥Hµo°e³o¨Ç«H¸¹¡A¥i¬O¥²¶·¥H¤å¥ó»¡©ú¥¦­Ì¬O¦b¤°»ò¼ËªºÀô¹Ò
     ©³¤Uµo°e¥X¨Óªº¡A¥H¤Î«ü¥X¥ô¦ó»P¥¦­Ìªºµo®i¬ÛÃöªº­­¨î¡C¡¨
     
   ·Q­n­×¥¿³o­Ó°ÝÃD¡A³Ì²³æ¤]¬O³Ì²Âªº¤èªk´N¬O¥ÎSIGUNUSED­«·s©w¸q³o¨Ç«H¸¹¡C
   ¥¿½Tªº¤èªkÀ³¸Ó¬O¥H±ø¥ó¦¡ªº½sĶ#ifdef¨Ó³B²z³o¨Ç°ÝÃD¤~¹ï¡G
   
#ifdef SIGSYS
/* ... non-posix SIGSYS code here .... */
#endif

   11/15/97Ķ 5/22/98­×¥¿
   
  K & R
  
   gcc¬O¤@­Ó»PANSI¬Û®eªº½sĶ¾¹¡F©_©Çªº¬O¡A¥Ø«e¤j¦h¼Æªºµ{¦¡½X³£¤£²Å¦XANSI©Ò
   ©wªº¼Ð·Ç¡C¦pªG§A¼ö·RANSI¡A³ßÅw¥ÎANSI´£¨Ñªº¼Ð·Ç¨Ó¼¶¼gCµ{¦¡¡A¦ü¥G°£¤F¥[
   ¤W-traditionalªººX¸¹¤§¥~¡A´N¨S¦³¨ä¥¦¤°»ò¥i¥H¦h½Íªº¤F¡CThere is a
   certain amount of finer-grained control over which varieties of brain
   damage to emulate;½Ð¦Û¦æ¬d¾\gcc info page¡C
   
   ­nª`·Nªº¬O¡A¾¨ºÞ§A¥Î¤F-traditional¨Ó§ïÅÜ»y¨¥ªº¯S©Ê¡A¥¦ªº®ÄªG¤]¶È«]­­
   ©ógcc©Ò¯à°÷±µ¨üªº½d³ò¡C¨Ò¦p, -traditional·|¥´¶}-fwritable-strings¡A¨Ï±o
   ¦r¦ê±`¼Æ²¾¦Ü¸ê®Æ°O¾ÐÅéªÅ¶¡¤º(±qµ{¦¡½X°O¾ÐÅéªÅ¶¡²¾¥X¨Ó¡A³o­Ó¦a¤è¬O¤£¯à¥ô
   ·N¼g¤Jªº)¡C³o¼Ë°µ·|Åýµ{¦¡½Xªº°O¾ÐÅéªÅ¶¡µL§Î¤¤¼W¥[ªº¡C
   
  «e¸m³B²z¾¹ªº²Å¸¹¥f¤W¨ç¼Æ­ì«¬«Å§i
  
   ³Ì±`¨£ªº°ÝÃD¬O¡A¦p²³©Ò¬Òª¾¡ALinux¤¤¦³³\¦h±`¥Îªº¨ç¼Æ³£©w¸q¦¨¥¨¶°¦s©ñ¦b¼Ð
   ÀYÀɤº¡A¦¹®É­Y¦³¬Û¦üªº¨ç¼Æ­ì«¬«Å§i¥X²{¦bµ{¦¡½X¤º¡A«e¸m³B²z¾¹·|©Úµ´¶i¦æ
   »yªk¤ÀªRªº«e¸m§@·~¡C±`¨£ªº¦³atoi()»Patol()¡C
   
  sprintf()
  
   ¦b¤j³¡¥÷ªºUnix¨t²Î¤W¡Asprintf(string, fmt, ...)¶Ç¦^ªº¬Ostringªº«ü¼Ð¡AµM
   ¦Ó¡A³o¤è­±Linux¡]¿í´`ANSI¡^¶Ç¦^ªº«o¬O©ñ¤Jstring¤ºªº¦r¤¸¼Æ¥Ø.¶i¦æ²¾´Ó®É
   ¡A¤×¨ä¬O°w¹ïSunOS¡A»Ý¦³ÄµÄ±ªº¤ß¡C
   
  fcntl »P¬ÛÃöªº¨ç¼Æ¡FFD_*®a±Úªº©w¸q¨ì©³Â\¦b­þ¸Ì?
  
   ´N¦b<sys/time.h>¸ÌÀY¡C ¬°¤F¯u¥¿ªº­ì«¬«Å§i¡A·í§A¥Î¤Ffcntl¡A¥i¯à§A¤]·Q§t
   ¬A¼ÐÀYÀÉ<unistd.h>¶i¨Ó¡C
   
   ¤@¯ë¦Ó¨¥¡A¨ç¼Æªºmanual page·|¦bSYNOPSIS³¹¸`¤º¦C¥X»Ý­nªº¼ÐÀYÀÉ¡C
   
  select()ªº­p®É---µ{¦¡°õ¦æ®É·|³B©ó¦£¸L-µ¥«Ýªºª¬ºA
  
   «Ü¤[«Ü¤[¥H«e,¡Aselect()ªº­p®É°Ñ¼Æ¥u¦³°ßŪªº©Ê¦Ó¤w¡C§Y¨Ï¨ì¤F³Ìªñ
   ¡Amanual pages¤´µM¦³¤U­±³o¬qªºÄµ§i¡G
   
     select()À³¸Ó¬OÂǥѭץ¿®É¶¡ªº¼Æ­È¡]¦pªG¦³ªº¸Ü¡^¡A¦A¶Ç¦^¦Û­ì©l­p®É¶}©l
     «á©Ò³Ñ¾lªº®É¶¡¡C¥¼¨Óªºª©¥»¥i¯à·|¨Ï³o¶µ¥\¯à¹ê²{¡C¦]¦¹¡A´N¥Ø«e¦Ó¨¥¡A­Y
     ¥H¬°©I¥sselect()¤§«á¡A­p®É«ü¼Ð¤´µM¤£·|³Q­×¥¿¹L¡A¥i¬O¤@ºØ«D±`¤£©ú´¼ªº
     ·Qªk³á¡I
     
   ¥¼¨Ó´N¦b§Ú­Ìªº²´«e¤F¡I¦Ü¤Ö¡A¦b³o¨à§Aµ´¹ï¥i¥H¬Ý¨ì¡C¨ç¼Æselect()¶Ç¦^ªº¡A
   ¬O¦©°£µ¥«Ý©|¥¼¨ì¹Fªº¸ê®Æ©Ò¯Ó¶Oªº®É¶¡«á¡A¨ä³Ñ¾lªº®É¶¡¼Æ­È¡C¦pªG¦b­p®Éµ²
   §ô®É¡A³£¨S¦³¸ê®Æ¶Ç°e¶i¨Ó¡A­p®É¤Þ¼Æ«K·|³]¬°0¡F¦pªG±µµÛÁÙ¦³¥ô¦ó
   ªºselect()¡A¥H¦P¼Ëªº­p®Éstructure¨Ó©I¥s¡A¨º»òselect()«K·|¥ß¨èµ²§ô¡C
   
   ­Y­n­×¥¿³o¶µ°ÝÃD¡A¥u­n¨C¦¸©I¥sselect()«e¡A³£§â­p®É¼Æ­È©ñ¨ì­p®É
   structure¤º¡A´N¨S¦³°ÝÃD¤F¡C§â¤U­±ªºµ{¦¡½X¡A
   
      struct timeval timeout;
      timeout.tv_sec = 1; timeout.tv_usec = 0;
      while (some_condition)
            select(n,readfds,writefds,exceptfds,&timeout);

   §ï¦¨¡A
   
      struct timeval timeout;
      while (some_condition) {
            timeout.tv_sec = 1; timeout.tv_usec = 0;
            select(n,readfds,writefds,exceptfds,&timeout);
      }

   ³o­Ó°ÝÃD¡A¦b¦³¨Çª©¥»ªºMosaic¸Ì¬O¬Û·íµÛ¦Wªº¡A¥u­n¤@¦¸ªºµ¥«Ý¡AMosaic´N±¾
   ¦b¨º¸Ì¤F¡CMosaicªº¿Ã¹õ¥k¤W¨¤¡A¬O¤£¬O¦³­Ó¶ê¶êªº¡B·|±ÛÂ઺¦a²y°Êµe¡C¨ºÁû
   ²yÂà±o·U§Ö¡A´Nªí¥Ü¸ê®Æ±qºô¸ô¤W¶Ç°e¹L¨Óªº³t²v·UºC¡I
   
  ²£¥Í¤¤Â_ªº¨t²Î©I¥s
  
  ¯S¼x¡G
  
   ·í¤@¤äµ{¦¡¥HCtrl-Z¤¤¤î¡BµM«á¦A­«·s°õ¦æ®É¡X©ÎªÌ¬O¨ä¥¦¥i¥H²£¥ÍCtrl-C¤¤Â_
   «H¸¹ªº±¡ªp¡A¦p¤lµ{§Çªº²×µ²µ¥¡X¨t²Î´N·|©ê«è»¡"interrupted system call"©Î
   ¬O"write: unknown error"¡A©ÎªÌ½Ñ¦p¦¹Ãþªº°T®§¡C
   
  °ÝÃDÂI¡G
  
   POSIXªº¨t²ÎÀˬd«H¸¹ªº¦¸¼Æ¡A¤ñ°_¤@¨Çª©ªºUnix¬O­n¦h¨º»ò¤@ÂI¡C¦pªG
   ¬OLinux¡A¥i¯à´N·|°õ¦æsignal handlers¤F¡X
   
     * «D¦P¨B¦a(­p®É¾¹ªººwµªÁn)
     * ¨t²Î©I¥sªº¶Ç¦^­È
     * ¦b¤U¦C¨t²Î©I¥sªº°õ¦æ´Á¶¡¡J select(), pause(), connect(),accept(),
       read() on terminals, sockets, pipes or files in /proc, write() on
       terminals, sockets, pipes or the line printer, open() on FIFOs,
       PTYs or serial lines,ioctl() on terminals, fcntl() with command
       F_SETLKW, wait4(), syslog(), any TCP or NFS operations.
       
   ´N¨ä¥¦ªº§@·~¨t²Î¦Ó¨¥¡A§A»Ý­nªº¥i¯à´N¬O¤U­±³o¨Ç¨t²Î©I¥s¤F¡G creat(),
   close(), getmsg(), putmsg(), msgrcv(), msgsnd(), recv(), send(),
   wait(), waitpid(), wait3(), tcdrain(), sigpause(), semop() to this
   list.
   
   ¦b¨t²Î©I¥s´Á¶¡¡A­Y¦³¤@«H¸¹¡]¨º¤äµ{¦¡¥»¨­À³·Ç³Æ¦nhandler¦]À³¤F¡^²£¥Í
   ¡Ahandler´N·|³Q©I¥s¡C·íhandler±N±±¨îÅvÂಾ¦^¨t²Î©I¥s®É¡A¥¦·|°»´ú¥X¥¦¤w
   ¸g²£¥Í¤¤Â_¡A¦Ó¥B¶Ç¦^­È·|¥ß¨è³]©w¦¨-1¡A¦Óerrno³]©w¦¨EINTR¡Cµ{¦¡¨Ã¨S¦³·Q
   ¨ì·|µo¥Í³oºØ¨Æ¡A©Ò¥H´N±¾¤F¡C
   
   ¦³¨âºØ­×¥¿ªº¤èªk¥i¥H¿ï¾Ü¡G
   
   (1) ¹ï¨C­Ó§A¦Û¦æ¦w¸Ëªºsignal handler¡A³£¶·¦bsigactionªººX¸¹¥[
   ¤WSA_RESTART¡C¨Ò¦p¡A§â¤U¦Cªºµ{¦¡¡A
   
  signal (sig_nr, my_signal_handler);

   §ï¦¨¡A
   
  signal (sig_nr, my_signal_handler);
  { struct sigaction sa;
    sigaction (sig_nr, (struct sigaction *)0, &sa);
#ifdef SA_RESTART
    sa.sa_flags |= SA_RESTART;
#endif
#ifdef SA_INTERRUPT
    sa.sa_flags &= ~ SA_INTERRUPT;
#endif
    sigaction (sig_nr, &sa, (struct sigaction *)0);
  }

   ­nª`·Nªº¬O¡A·í³o³¡¥÷ªºÅܧó¤j¶qÀ³¥Î¨ì¨t²Î©I¥s¤§«á¡A©I¥sread()¡Bwrite()
   ¡Bioctl()¡B select()¡B pause() »P connect()®É¡A§A¤´µM±o¦Û¦æÀˬdEINTR¡C
   ¦p¤U©Ò¥Ü¡G
   
   (2) §A¦Û¤v±o«Ü©ú½T¦aÀˬdEINTR¡G
   
   ³o¸Ì¦³¨â­Ó°w¹ïread()»Pioctl()ªº¨Ò¤l¡C
   
   ­ì©lªºµ{¦¡¤ù¬q¡A¨Ï¥Îread()¡G
   
int result;
while (len > 0) {
  result = read(fd,buffer,len);
  if (result < 0) break;
  buffer += result; len -= result;
}

   ­×§ï¦¨,
   
int result;
while (len > 0) {
  result = read(fd,buffer,len);
  if (result < 0) { if (errno != EINTR) break; }
  else { buffer += result; len -= result; }
}

   ­ì©lªºµ{¦¡¤ù¬q¡A¨Ï¥Îioctl()¡G
   
int result;
result = ioctl(fd,cmd,addr);

   ­×§ï¦¨¡A
   
int result;
do { result = ioctl(fd,cmd,addr); }
while ((result == -1) && (errno == EINTR));

   ª`·N¤@ÂI¡A¦³¨Çª©¥»ªºBSD Unix¡A¨ä¤º©wªº¦æ¬°¬O­«·s°õ¦æ¨t²Î©I¥s¡C­Y­nÅý¨t
   ²Î©I¥s¤¤Â_¡A±o¨Ï¥Î SV_INTERRUPT©ÎSA_INTERRUPTºX¸¹¡C
   
  ¥i¥H¼g¤Jªº¦r¦ê
  
   gcc¹ï¨äusersÁ`Ãh©êµÛ¼ÖÆ[ªº·Qªk¡A¬Û«H·í¥L­Ì¥´ºâÅý¬Y­Ó¦r¦ê·í§@±`¼Æ¨Ó¥Î
   ®É---¨º¥¦´N¯uªº¥u¬O¦r¦ê±`¼Æ¦Ó¤w¡C¦]¦¹¡A³oºØ¦r¦ê±`¼Æ·|Àx¦s¦bµ{¦¡½Xªº°O¾Ð
   Åé°Ï¬q¤º¡C³o¶ô°Ï°ì¥i¥Hpage¨ìºÏºÐ¾÷ªºimage¤W¡AÁקK¯Ó±¼swapªº°O¾ÐÅéªÅ¶¡¡A
   ¦Ó¥B¥ô¦ó¹Á¸Õ¼g¤JªºÁ|°Ê³£·|³y¦¨¤À­¶ªº¿ù»~(segmentation fault)¡C³o¥i¬O¤@
   ºØ¯S¦â©O¡I
   
   ¹ï¦Ñ¤@ÂIªºµ{¦¡¦Ó¨¥¡A³o¥i¯à·|²£¥Í¤@­Ó°ÝÃD¡C¨Ò¦p¡A©I¥smktemp()¡A¶Ç»¼ªº
   ¤Þ¼Æ(arguments)¬O¦r¦ê±`¼Æ¡C mktemp()·|¹Á¸ÕµÛ¦b*¾A·íªº¦ì¸m*­«·s¼g¤J¥¦ªº
   ¤Þ¼Æ¡C
   
   ­×¥¿ªº¤èªk¤£¥~¥G(a)¥H-fwritable-strings½sĶ¡A­¢¨Ïgcc±N¦¹±`¼Æ¸m©ñ¦b¸ê®Æ
   °O¾ÐÅéªÅ¶¡¤º¡F©ÎªÌ(b)±N«I¥Ç¦aÅvªº³¡¥÷­«·s§ï¼g¡A°t¸m¤@­Ó¤£¬°±`¼Æªº¦r¦ê¡A
   ¦b©I¥s«e¡A¥ý¥Hstrcpy()±N¸ê®Æ«þ¨©¶i¥h¡C
   
  ¬°¤°»ò©I¥sexecl()·|¥¢±Ñ¡H
  
   ¨º¬O¦]¬°§A©I¥sªº¤è¦¡¤£¹ï¡Cexeclªº²Ä¤@­Ó¤Þ¼Æ¬O§A·Q­n°õ¦æªºµ{¦¡¦W.²Ä¤G­Ó
   »P±µÄòªº¤Þ¼Æ·|Åܦ¨§A©Ò©I¥sªºµ{¦¡ªºargv°}¦C¡C°O¦í¡G¶Ç²Î¤W¡Aargv[0]¬O¥u¦³
   ·íµ{¦¡¨S¦³±aµÛ¤Þ¼Æ°õ¦æ®É¡A¤~·|¦³³]©w­È¡C©Ò¥HÅo¡A§AÀ³¸Ó³o¼Ë¼g¡G
   
execl("/bin/ls","ls",NULL);

   ¦Ó¤£¬O¥u¦³¡A
   
execl("/bin/ls", NULL);

   °õ¦æµ{¦¡¦Ó¤£±a¥ô¦ó¤Þ¼Æ¡A¥i¸ÑÄÀ¦¨¬O¤@ºØÁܽШç¡A¥Øªº¬O§â¦¹µ{¦¡ªº°ÊºAµ{¦¡
   ®w¿W¥ßªº¯S©Ê¦L¥X¨Ó¡C¦Ü¤Ö¡Aa.out¬O³o¼Ëªº¡C´NELF¦Ó¨¥¡C¨Æ±¡´N¤£¬O³o¼Ë¤F.
   
   ¡]¦pªG§A·Q±oª¾¦¹µ{¦¡®wªº¸ê°T¡A¦³¤@¨Ç§ó²³æªº¤¶­±¥i¥Î¡F°Ñ¦Ò°ÊºA¸ü¤J¨º¤@
   ³¹¸`¡A©Î¬Olddªºmanual page¡C¡^
   
   11/16/97Ķ 6/2/98­×¥¿
   
5. °£¿ù»PºÊºÞ

5.1 ¹w¨¾­«©óªvÀø¡]lint¡^

   lint¹ïLinux¦Ó¨¥¨Ã¨S¦³«Ü¼sªxªº¥Î³~¡A¥D­n¬O¦]¬°¤j³¡¥÷ªº¤H³£¯àº¡¨¬©ógcc©Ò
   ´£¨ÑªºÄµ§i°T®§¡C¥i¯à³Ì¦³¥Îªº´N¬O-Wall°Ñ¼Æ¤F---³o­Ó°Ñ¼Æªº¥Î³~¬O­n¨Dgcc±N
   ©Ò¦³ªºÄµ§i°T®§Åã²{¥X¨Ó¡Fbut probably has more mnemonic value if
   thought of as the thing you bang your head against.
   
   ºô¸ô¤W¦³¤@­Ó¹ê¥Îªºpublic domain lint¡A¦ì©ó
   [15]ftp://larch.lcs.mit.edu/pub/Larch/lclint¡C§Ú¨Ã¤£ª¾¹D³o­Ó¯¸¨ì©³¦³¦h
   ¦n´N¬O¤F¡C
   
5.2 °£¿ù

  §Ú­n«ç¼Ë°µ¤~¯à±N°£¿ù¸ê°T©ñ¨ì¤@¤äµ{¦¡¸ÌÀY¡H
  
   §A»Ý­n²K¥[-gªº°Ñ¼Æ¨Ó½sĶ»P³sµ²µ{¦¡¡A¦Ó¥B¤£¥i¥H¥Î-fomit-frame-pointer°Ñ
   ¼Æ¡C¨Æ¹ê¤W¡A§A¤£»Ý­n­«·s½sĶ©Ò¦³ªºµ{¦¡¡A¥u»Ý­«·s½sĶ¥Ø«e§A¥¿¦b°£¿ùªº³¡
   ¥÷§Y¥i¡C
   
   ´Na.outªº²ÕºA¦Ó¨¥¡A¦@¨Éµ{¦¡®w¬O¥H-fomit-frame-pointer½sĶ¦Ó¦¨¡A³o­Ó®É­Ô
   ¡Agdb´NÅܱo­^¶¯µL¥ÎªZ¤§¦a¤F¡C³sµ²®Éµ¹©w-gªº¿ï¶µ¡AÀ³¸Ó´NÁô§tµÛÀRºA³sµ²ªº
   ·N¸q¤F¡F³o´N¬O¬°¤°»ò­n¥[-gªº­ì¦]¤F¡C
   
   ¦pªG³sµ²¾¹³sµ²¥¢±Ñ¡A§i¶D§A§ä¤£¨ìlibg.a¡A¨º´N¬O¦b/usr/lib/ªº¥Ø¿ý©³¤U¡A¤Ö
   ¤Flibg.a¡Clibg.a¬O¤@­ÓC»y¨¥«Ü¯S§Oªº°»¿ùµ{¦¡®w¡C¤@¯ë¦blibcªº®M¥ó¤º´N·|´£
   ¨Ñlibg.a¡F¤£µMªº¸Ü¡]·sª©¬O³o¼Ëªº¡^¡A§A¥i¯à»Ý­n®³libcªº­ì©l½X¦Û¤v³]¸m¤F
   ¡A¤£¹L¡A¹ê»Ú¤W§AÀ³¸Ó¤£»Ý­n¤~¹ï¡C¤£ºÞ¬O¤°»ò¥Øªº¡A¤j³¡¥÷ªº±¡ªp¤U¡A¥u»Ý
   ±Nlibg.a³sµ²¨ì/usr/lib/libc.a¡A§A´N¯à±o¨ì¨¬°÷ªº¸ê°T¤F¡C
   
  ¨º¡A¯à¤£¯à§â°£¿ù¸ê°Tµ¹®³±¼¡H
  
   «Ü¦hªºGNU³nÅé¦b½sĶ³sµ²®É¡A³£·|³]©w-gªº¿ï¶µ¡F³o¼Ë°µ·|³y¦¨°õ¦æÀɹL¤jªº°Ý
   ÃD¡]³q±`¬OÀRºAªº³sµ²¡^¡C¹ê»Ú¤W¡A³o¨Ã¤£¬O¤@­Ó«Ü¼öªùªº·Qªk¡C
   
   ¦pªGµ{¦¡¥»¨­¦³autoconf¡A²£¥Í¤Fconfigure©R¥O½Z¡A³q±`§A´N¥i¥H
   ¥Î./configure CFLAGS=©Î¬O./configure CFLAGS=-O2¨ÓÃö±¼°£¿ù¸ê°T¡C¤£µMªº¸Ü
   ¡A§A±oÀˬdÀˬdMakefile¤F¡C·íµM°Õ¡A°²¦p§A¥Îªº¬OELF¡Aµ{¦¡«K·|¥H°ÊºAªº¤è¦¡
   ¨Ó³sµ²¡A¤£½×¬O§_¦³-gªº³]©w¡F¦]¦¹§A¥i¥H¥­±`¤ß§â-g®³±¼¡C
   
  ¹ê¥Îªº³nÅé
  
   ¾ÚÁA¸Ñ¡A¤j³¡¥÷ªº¤H³£¬O¥Îgdb¨Ó°£¿ù¡C§A¥i¥H±q [16]GNU archive sites®³¨ì­ì
   ©lµ{¦¡¡F©ÎªÌ¬O¨ì [17]tsx-11®³¥i°õ¦æÀÉ¡Cxxgdb¬O¤@­ÓX¤¶­±ªº°£¿ùµ{¦¡¡A´Ó°ò
   ©ógdb¡]¤]´N¬O»¡§A±o¥ý¦w¸Ë¦ngdb¡A¤~¯à¦A¸Ëxxgdb¡^¡Cxxgdbªº­ì©l½X¥i¥H¦b
   [18]ftp://ftp.x.org/contrib/xxgdb-1.08.tar.gz§ä¨ì¡C
   
   ¥t¥~¡AUPS°£¿ùµ{¦¡¤w¥ÑRick Sladkey²¾´Ó¦¨¥\¡CUPS¥i¥H¦bX©³¤U¬¡±o«Ü¦n¡A¤£
   ¹³xxgdb¨º¼Ë---¶È¶È¬OgdbªºX«eºÝ¤¶­±¡]X front end¡^¡C³o¤ä°£¿ùµ{¦¡¦³¤@¤j°ï
   Àu¨}ªº¯SÂI¡A¦Ó¥B¦pªG§A±oªá®É¶¡¥h°£¤@¤ä¯}Äꪺµ{¦¡¡A«Øij§A¦Ò¼{¦Ò¼{xxgdb¡C
   ¨Æ¥ý½sĶ¦nªºLinuxª©»P­×¥¿ª©ªº­ì©l½X¥i¥H¦b
   [19]ftp://sunsite.unc.edu/pub/Linux/devel/debuggers/§ä¨ì¡C¦Ó³Ìªìªº­ì©l
   µ{¦¡«h©ñ¦b [20]ftp://ftp.x.org/contrib/ups-2.45.2.tar.Z¡C
   
   §A¥i¯à·|µo²{¥t¤@­Ó¥Î¨Ó°£¿ùªº¤u¨ãstrace¡A¤]¬O¬Û·íªº¦³¥Î¡C¥¦¥i¥HÅã¥Ü¥X¥Ñ
   µ{§Ç©Ò²£¥Íªº¨t²Î©I¥s¡A¦Ó¥BÁÙ¾Ö¦³¨ä¥¦²³¦hÁc½Æªº¥\¯à¡A¹³¬O¦pªG§A¤âÃä¨S¦³
   ­ì©l½Xªº¸Ü¡Astrace¥i¥HÀ°§A§ä¥X¦³¨º¨Ç¸ô®|¦WºÙ¡]path-names¡^¤w½sĶ¶i°õ¦æ
   Àɤº¡F exacerbating race conditions in programs that you suspect
   contain them;ÁÙ¦³¡Astrace¥i®³¨Ó¾Ç²ßµ{¦¡¬O«ç»ò¦b¹q¸£¤¤°õ¦æªº¡C³Ì·sªºª©¥»
   ¡]¥Ø«e¬O3.0.8¡^¥i¦b§ä¨ì [21]ftp://ftp.std.com/pub/jrs/¡C
   
  ­I´ºµ{¦¡¡]±`¾nµ{¦¡¡^
  
   ¦­´Á¨å«¬ªº±`¾nµ{¦¡(daemon programs)¬O°õ¦æfork()¡AµM«á²×¤î¤÷µ{§Ç¡C³o¼Ëªº
   °µªk¨Ï±o°£¿ùªº®É¶¡´îµu¤F¡C
   
   ÁA¸Ñ³oÂIªº³Ì²³æªº¤èªk´N¬O´Àfork()³]¤@­Ó¤¤Â_ÂI¡]breakpoint¡^¡C·íµ{¦¡°±
   ¤î®É¡A±j­¢fork()¶Ç¦^0¡C
   
(gdb) list
1       #include <stdio.h>
2
3       main()
4       {
5         if(fork()==0) printf("child\n");
6         else printf("parent\n");
7       }
(gdb) break fork
Breakpoint 1 at 0x80003b8
(gdb) run
Starting program: /home/dan/src/hello/./fork
Breakpoint 1 at 0x400177c4

Breakpoint 1, 0x400177c4 in fork ()
(gdb) return 0
Make selected stack frame return now? (y or n) y
#0  0x80004a8 in main ()
    at fork.c:5
5         if(fork()==0) printf("child\n");
(gdb) next
Single stepping until exit from function fork,
which has no line number information.
child
7       }

  ®Ö¤ßÀÉ®×
  
   ·íLinux¶}¾÷®É¡A³q±`²ÕºA·|³]©w¦¨¤£­n²£¥Í®Ö¤ßÀɮסC­n¬O§A¨º»ò³ßÅw¥¦­Ìªº¸Ü
   ¡A¥i¥H¥Îshellªºbuiltin©R¥O¨Ï¨ä­«·s¥Í®Ä¡G´NC-shell¬Û®eªºshell¡]¦ptcsh¡^
   ¦Ó¨¥¡A·|¬O¤U­±³o¼Ë¡G
   
% limit core unlimited

   ¦ÓÃþ¦üBourne shellªºshell¡]sh, bash, zsh, pdksh¡^«h¨Ï¥Î¤U­±ªº»yªk¡G
   
$ ulimit -c unlimited

   ¦pªG§A·Q­n¦³­Ó¦h¤~¦hÃÀªº®Ö¤ßÀÉ©R¦W¡]core file naming¡^¡]for example,
   if you're trying to conduct a post-mortem using a debugger that's
   buggy itself¡^¡A¨º»ò§A¥i¥H¹ï§Aªº®Ö¤ßµ{¦¡°µ¤@ÂI¤p¤pªº§ó°Ê¡C§ä¤@
   §äfs/binfmt_aout.c»Pfs/binfmt_elf.cÀɤ¤»P¤U¦C¬Û²Åªºµ{¦¡¤ù¬q(in newer
   kernels, you'll have to grep around a little in older ones)¡G
   
        memcpy(corefile,"core.",5);
#if 0
        memcpy(corefile+5,current->comm,sizeof(current->comm));
#else
        corefile[4] = '\0';
#endif

   ±N0´«¦¨1.
   
5.3 ºÊºÞ

   ºÊºÞ¡]Profiling¡^¬O¥Î¨ÓÀˮ֤@¤äµ{¦¡¤¤¨º¨Ç³¡¥÷¬O³Ì±`©I¥s©Î¬O°õ¦æªº®É¶¡³Ì
   ¤[ªº¤èªk¡C³o¹ïµ{¦¡ªº³Ì¨Î¤Æ»P§ä¥X¦ó®É®É¶¡¬O®ö¶O±¼ªº¦Ó¨¥¡A¬O¬Û·í¦nªº¤è¦¡
   ¡C§A¥²¶·´N§A©Ò­nªº®Éµ{¸ê°T¡]timing information¡^ªº¥ØªºÀÉ¥[¤W-p¨Ó½sĶ¡A
   ¦Ó¥B¦pªG­nÅý¿é¥XªºÀɮצ³·N¸q¡A§A¤]·|»Ý­ngprof¡]¨Ó¦Ûbinutils®M¥óªº©R¥O¡^
   ¡C°Ñ¾\gprofªºmanual page¡A¥i±oª¾¨ä²Ó¸`¡C
   
   11/18/97Ķ
   
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

  ±±¨îª©¥»
  
   »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
   
  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
   
  «ç»ò¤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
   
  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 )

  ª©¥»½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

  a.out---ªº®æ¦¡¡\
  
   «Ø¥ß¦@¨Éµ{¦¡®wªº«K§Q©Ê¬Oª@¯Å¦ÜELFªº¥D­n­ì¦]¤§¤@¡C¨º¤]¬O»¡,a.out¥i¯àÁÙ¬O
   ¦³¥Î³B¦bªº¡C¤Wftp¯¸¥h§ì
   [22]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:-)
   
  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
   
  ÀÉ®×°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
   
  ``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¨º»ò«Øij§A¥H§¹¾ãªºª©¥»¨ú¥N¥¦¡C
   
  ³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
          
7. °ÊºA¸ü¤J

   ³o¤@³¹¸`¥Ø«e¬O²µu¤F¤@ÂI¡F·í§Ú±°ºÉELF HOWTO®É¡A´N¬O³o³¡¥÷¦A«×ÂX®iªº®É­Ô
   ¤F¡C
   
7.1 °ò¥»·§©À

   Linux¦³¦@¨Éµ{¦¡®w¡A¦pªG¤§«e§A¤w§¤µÛŪ§¹¤W¤@³¹¸`¡A·Q¥²²{¦b¤@Å¥¨ì¹³³o¼Ëªº
   »¡µü¡A«K·|¥ß¨è·P¨ìÀY©ü¡C¦³¤@¨Ç·ÓºD¨Ò¦Ó¨¥¬O¦b³sµ²®É´Á«K¸Ó§¹¦¨ªº¤u§@¡A¥²
   ¶·©µ¿ð¨ì¸ü¤J®É´Á¤~¯à§¹¦¨¡C
   
7.2 ¿ù»~°T®§

   §â§A³sµ²ªº¿ù»~±Hµ¹§Ú¡I§Ú¤£·|°µ¥ô¦óªº¨Æ¡A¤£¹L§Ú¥i¥H§â¥¦­Ì¼g°_¨Ó**
   
   can't load library: /lib/libxxx.so, Incompatible version
          ¡]a. out only¡^ ³o¬O«ü§A¨S¦³xxxµ{¦¡®wªº¥¿½Tªº¥D­nª©¥»¡C¥i§O¥H¬°
          ÀHÀH «K«K§Ë­Ó³sµ²¨ì§A¥Ø«e¾Ö¦³ªºª©¥»´N¥i¥H¤F¡A¦pªG©¯¹Bªº¸Ü¡A´N¥u
          ·|³y¦¨§Aªºµ{¦¡¤À­¶¿ù»~¦Ó¤w¡C¥h§ì·sªºª©¥».ELFÃþ¦üªº±¡ªp·|³y¦¨¹³¤U
          ­±³o¼Ëªº°T®§¡G
          
ftp: can't load library 'libreadline.so.2'

   warning using incompatible library version xxx
          ¡]a. out only¡^§Aªºµ{¦¡®wªº¦¸­nª©¥»¤ñ°_³o¤äµ{¦¡¥Î¨Ó½sĶªºÁÙ­nÂÂ
          ¡Cµ{¦¡¨ÌµM¥i¥H°õ¦æ¡C¥u¬O¥i¯à°Õ¡I§Ú·Q¡Aª@­Ó¯ÅÀ³¸Ó¨S¤°»ò¶Ë®`§a¡I
          
7.3 ±±¨î°ÊºA¸ü¤J¾¹ªº¹B§@

   ¦³¤@²ÕÀô¹ÒÅܼƷ|Åý°ÊºA¸ü¤J¾¹¦³©Ò¤ÏÀ³¡C¤j³¡¥÷ªºÀô¹ÒÅܼƹïlddªº¥Î³~­n¤ñ°_
   ¹ï¤@¯ëusersªºÁÙ­n¨Ó±o§ó¦h¡C¦Ó¥B¥i¥H«Ü¤è«Kªº³]©w¦¨¥Ñldd°t¦X¦UºØ°Ñ¼Æ¨Ó°õ
   ¦æ¡C³o¨ÇÅܼƥ]¬A¡A
   
     * LD_BIND_NOW --- ¥¿±`¨ÓÁ¿¡A¨ç¼Æ¦b©I¥s¤§«e¬O¤£·|Åýµ{¦¡´M§äªº¡C³]©w³o
       ­ÓºX¸¹·|¨Ï±oµ{¦¡®w¤@¸ü¤J¡A©Ò¦³ªº´M§ä«K·|µo¥Í¡A¦P®É¤]³y¦¨°_©lªº®É¶¡
       ¸ûºC¡C·í§A·Q´ú¸Õµ{¦¡¡A½T©w©Ò¦³ªº³sµ²³£¨S¦³°ÝÃD®É¡A³o¶µºX¸¹´NÅܱo«Ü
       ¦³¥Î¡C
     * LD_PRELOAD¥i¥H³]©w¤@­ÓÀɮסA¨Ï¨ä¨ã¦³*Âл\*¨ç¼Æ©w¸qªº¯à¤O¡C¨Ò¦p¡A¦p
       ªG§A­n´ú¸Õ°O¾ÐÅé¤À°tªº¤è²¤¡A¦Ó¥BÁÙ·Q¸m´«*malloc*¡A¨º»ò§A¥i¥H¼g¦n·Ç
       ³Æ´À´«ªº°Æµ{¦¡¡A¨Ã§â¥¦½sĶ¦¨mallolc.¡AµM«á¡G
       
$ LD_PRELOAD=malloc.o; export LD_PRELOAD
$ some_test_program

       LD_ELF_PRELOAD »P LD_AOUT_PRELOAD «ÜÃþ¦ü¡A¦ý¬O¶È¾A¥Î©ó¥¿½Tªº¤G¶i¦ì
       «¬ºA¡C¦pªG³]©w¤F LD_something_PRELOAD »P LD_PRELOAD ¡A¤ñ¸û©ú½Tªº¨º
       ¤@­Ó·|³Q¥Î¨ì¡C
     * LD_LIBRARY_PATH¬O¤@³s¦ê¥H¤À¸¹¹jÂ÷ªº¥Ø¿ý¦WºÙ¡A¥Î¨Ó·j´M¦@¨Éµ{¦¡®w¡C
       ¹ïld¦Ó¨¥¡A¨Ã¨S¦³¥ô¦óªº¼vÅT¡F³o¶µ¥u¦³¦b°õ¦æ´Á¶¡¤~¦³¼vÅT¡C¥t¥~¡A¹ï°õ
       ¦æsetuid»Psetgidªºµ{¦¡¦Ó¨¥¡A³o¤@¶µ¬OµL®Äªº¡C¦ÓLD_ELF_LIBRARY_PATH
       »PLD_AOUT_LIBRARY_PATH³o¨âºØºX¸¹¥i®Ú¾Ú¦U§Oªº¤G¶i¦ì«¬¦¡¤À§O¾É¦V¤£¦P
       ªº·j´M¸ô®|¡C¤@¯ë¥¿±`ªº¹B§@¤U¡A¤£À³¸Ó·|¥Î¨ìLD_LIBRARY_PATH¡F§â»Ý­n·j
       ´Mªº¥Ø¿ý¥[¨ì/etc/ld.so.conf/¸Ì¡FµM«á­«·s°õ¦ældconfig¡C
     * LD_NOWARN ¶È¾A¥Î©óa.out¡C¤@¥¹³]©w¤F³o¤@¶µ¡]LD_NOWARN=true; export
       LD_NOWARN¡^¡A¥¦·|§i¶D¸ü¤J¾¹¥²¶·³B²zfatal-warnings¡]¹³¬O¦¸­nª©¥»¤£¬Û
       ®eµ¥¡^ªºÄµ§i°T®§¡C
     * LD_WARN¶È¾A¥Î©óELF¡C³]©w³o¤@¶µ®É¡A¥¦·|±N³q±`¬O­P©R°T®§ªº¡§Can*t
       find library¡¨Âà´«¦¨Äµ§i°T®§¡C¹ï¥¿±`ªº¾Þ§@¦Ó¨¥¡A³o¨Ã¨S¦³¦h¤jªº¥Î³B
       ¡A¥i¬O¹ïldd´N«Ü­«­n¤F¡C
     * LD_TRACE_LOADED_OBJECTS¶È¾A¥Î©óELF¡C¦Ó¥B·|¨Ï±oµ{¦¡¥H¬°¥¦­Ì¬O¥Ñldd©Ò
       °õ¦æªº¡G
       
$ LD_TRACE_LOADED_OBJECTS=true /usr/bin/lynx
        libncurses.so.1 => /usr/lib/libncurses.so.1.9.6
        libc.so.5 => /lib/libc.so.5.2.18

7.4 ¥H°ÊºA¸ü¤J¼¶¼gµ{¦¡

   ¦pªG§A«Ü¼ô±xSolaris 2.x©Ò¤ä´©ªº°ÊºA¸ü¤Jªº¤u§@ªº¸Ü¡A§A·|µo²{Linux¦b³oÂI
   ¤W»P¨ä«D±`ªº¬Ûªñ¡C³o¤@³¡¥÷¦bH.J.LuªºELFµ{¦¡³]­p¤å¥ó¤º»Pdlopen(3)
   ªºmanual page¡]¥i¥H¦bld.soªº®M¥ó¤W§ä¨ì¡^¤W¦³¼sªxªº°Q½×¡C³o¸Ì¦³­Ó¤£¿ùªº
   ²³æ½d¨Ò¡G¥H-ldl³sµ²¡C
   
#include <dlfcn.h>
#include <stdio.h>

main()
{
  void *libc;
  void (*printf_call)();

  if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY))
  {
    printf_call=dlsym(libc,"printf");
    (*printf_call)("hello, world\n");
  }

}

8. »Pµo®i¤H¤hÁpµ¸

8.1 Bug³øªí

   §â°ÝÃD¼g¤U¨Ó¡C³o¬O°w¹ïLinuxªº¡A¥ç©Î¬Ogcc¦b¨ä¥¦¨t²Î¤W©Òµo¥Íªº°ÝÃD¡C
   »Pkernelªºª©¥»¬ÛÃö¶Ü¡H©ÎªÌ¬Oµ{¦¡®wªºª©¥»¡H¦pªG§ï¥ÎÀRºA¤è¦¡³sµ²¡A°ÝÃD¬O
   ¤£¬O´N®ø¥¢¤F¡H§A¥i¥H¸`¿ý¤@¤p¬qµ{¦¡¨Ó®i¥Ü³o°¦bug¶Ü¡H
   
   ·í§A°µ¤F³o¨Ç¨Æ±¡¤§«á¡A§A±N·|ª¾¹Dµ{¦¡¤ºªºbugs¬O¤°»ò¡C´Ngcc¦Ó¨¥¡Abug³øªí
   µ{§Ç¬O¥HinfoÀɨӻ¡©úªº¡C¦pªG¬Old.so©Î¬OC¡Bmathsµ{¦¡®w¡A±Nemail±H
   ¨ìlinux-gcc@vger.rutgers.edu¡C¦pªG¥i¯àªº¸Ü¡A¥]§t¤@¤ä¦Û¤v¦Û¨¬ªº¤pµ{¦¡¥H
   ®i¥Ü³o­Óbug¡A¦Ó¥Bªþ¤W»¡©ú¡A´y­z§A·Q­nÅý³o¤äµ{¦¡°µ¨Ç¤°»ò»P¹ê»Ú¤W¥¦¤S°µ¤F
   ¨Ç¤°»ò¡C
   
8.2 ¨ó§Uµo®i

   ¦pªG§A·Q­nÀ°¦£µo®igcc©Î¬OCµ{¦¡®w¡A²Ä¤@¥ó¨Æ´N¬O¥[
   ¤Jlinux-gcc@vger.rutgers.edu³q«H½×¾Â¡C¦pªG§A¥u¬O·Q¬Ý¬Ý³q«H½×¾Â¦b°Q½×¨Ç
   ¤°»ò¡A³o¸Ì¦³¤@­Ó½×¾Âªºarchives¡A¦ì©ó
   [23]http://homer.ncm.com/linux-gcc/¡C±µ¤U¨Óªº¨Æ¡A´N¬Ý§A·Q°µ¤°»ò¤F¡C
   
9. µ²»y

9.1 ¦W¤Hº]

     Only presidents, editors, and people with tapeworms have the right
     to use the editorial ``we''.
     
   (Mark Twain)
   
   ³o¥÷HOWTO¤å¥ó´X¥G§¹¥þ®Ú´Ó©óMitchum DsouzaªºGCC-FAQ¡F ¤å¥ó¤¤¤j³¡¥÷ªº¸ê°T
   ¬Oª½±µ¨Ó¦Û©óGCC-FAQ¡C³o¥÷¤å¥ó¥Î¨ìªº²Ä¤@¤HºÙ¥N¦Wµü¡A¥iµø¬°§Ú­Ì¨â¤H¨ä¤¤¤@
   ­Ó¡F¥i¥H»¡¡A­n¬O¨ä¤¤¦³¤@­Ó¤H»¡¡§§ÚÁÙ¨S¦³´ú¸Õ¹L³o¨Ç¡F¦pªG¥¦¿N¤F§AªºµwºÐ
   ¡B·´¤F§Aªº¨t²Î©Î¬O·d±o§A©dÂ÷¤l´²ªº¡A¥i§O»¡§Ú¨S´£¿ô§A°Ú¡I"¡A¹³³o¼Ëªº¸Ü¾A
   ¥Î©ó§Ú­Ç¨­¤W¡C
   
   ¹ï³o¥÷¤å¥ó¦³°^Ämªº¦W¤H¶®¤h¦p¤U©Ò¦C¡]¥HASCII½Xªº¶¶§Ç¦C¥X¡^¡G Andrew
   Tefft, Axel Boldt, Bill Metzenthen, Bruce Evans, Bruno Haible, Daniel
   Barlow, Daniel Quinlan, David Engel, Dirk Hohndel, Eric Youngdale,
   Fergus Henderson, H.J. Lu, Jens Schweikhardt, Kai Petzke, Michael
   Meissner, Mitchum DSouza, Olaf Flebbe, Paul Gortmaker, Rik Faith,
   Steven S. Dick, Tuomas J Lukka, ·íµMÁÙ¦³Linux Torvalds¡A¨S¦³¤F¥L¡A³o¾ã
   ­Ó¹B°Ê´NÅܱo¤@ÂI·N¸q¤]¨S¦³¤F¡A©Ò¥H¤£¥i¯àÅý¥L©t³æªº¡C:-)
   
   ½Ð¤£­nı±o¦³¥ô¦óªº«_¥Ç¤§³B¡A¦pªG±zªº¦W¦r¨S¦³¥X²{¦b³o¨à¡C¦pªG±z¹ï³o¥÷¤å
   ¥ó¡]HOWTO©Î¬OFAQ¡^´¿¸g¦³¹L°^Ämªº¸Ü¡A½Ðemailµ¹§Ú¡A§Ú·|§ï¥¿¹L¨Óªº¡C
   
9.2 ½Ķ

   ¨ì¥Ø«e¬°¤î¡A³o¥÷¤å¥óÁÙ¨S¦³¤wª¾ªºÂ½Ä¶ª©¥»¥X²{¡C¦pªG§A§Æ±æ¥Í¤@­Ó¥X¨Ó¡A½Ð
   ¾¨ºÞ¥h°µ¡A¤£¹L¤@©w±o§i¶D§Ú¬ÛÃöªº¨Æ©y¡C§ÚÁ¿ªº»y¨¥·|¬O§A·Q­n½ªº»y¨¥¡A¨º
   ¾÷²v¡]«Ü¿ò¾Ñ¡^¥u¦³¦n´X¦Ê¤À¤§¤@¡A¤£¹LÁÙ¬O¥ý§â´d¶ËÂ\¤@®Ç§a¡A¤£ºÞ¬O¤°»ò¼Ë
   °ÝÃD¡A§Ú³£·|«Ü¼Ö·NÀ°¦£ªº¡C
   
9.3 Åwªï¥ô¦óªº¦^õX

   ±H«Hµ¹§Ú [24]dan@detached.demon.co.uk¡C§ÚªºPGP public key (ID
   5F263625) ¥i¦b§Úªº¯M°öÂû [25]web pages¤W¨Ï¥Î¡A¦pªG§Aı±o¨Æ±¡¦³¥²­n«O±K
   ªº¸Ü¡C
   
9.4 ¦Xªkªº¦æ³w³W©w

   ¥»¤å±Ä¥Î¹Lªº°Ó¼Ð¤ÀÄÝ©ó­Ó§Oªº«ù¦³ªÌ¡C
   
   ³o¥÷HOWTO¤å¥óªºª©ÅvÄÝ©óDaniel Barlow <dan@detached.demon.co.uk>¡C §A¥i
   ¥H¥ô¦ó«¬¦¡ªº´CÅé¡A¥]¬A¦³§Îªº¡B¹q¤lªº¤è¦¡­«½Æ¥Í²£¡B¶Ç§G³¡¥÷©Î¬O¾ã¥÷
   ªºGCC-HOWTO¡A¥u­n³o¥÷ª©ÅvÁn©ú«O¦s¦b©Ò¦³ªº½Æ»s«~¤¤¡C°Ó·~ªº¥æ©ö¬O¤¹³\ªº¡A
   ¦Ó¥B§Ú¹ªÀy§A³o»ò°µ¡A¤£¹L¡A§Ú«Ü§Æ±æ§A¯à³qª¾§Ú¦³Ãöªº²Ó¸`¡C
   
   ¤£½×§A°µ¤°»ò¡A¹³¬O½Ķ¡BÂX¥R³o¥÷¤å¥ó¡B±q³o¥÷¤å¥ó­l¥Í¥X¨ä¥L¬ÛÃöªº¤å¥ó©Î
   ¬O¾ã¦X¨ä¥LªºLinux HOWTO¤å¥óµ¥¡A³£¥²¶·¿í´`³o¥÷ª©ÅvÁn©ú¡C¤]´N¬O»¡¡A¦pªG§A
   °Ñ°uHOWTO¤å¥ó¼g¥X¨ä¥Lªº»¡©ú¤å¥ó¡A§A¬O¤£¥i¥H¹ï³o¥÷­l¥Í¥X¨Óªº¤å¥ó¥[¤WÃB¥~
   ªº­­¨î¡A¼vÅT¤å¥óªºµo¦æÅvªº¡C·íµM¡A¦³¨Ç¯S§Oªº±¡ªp¬O¥i¥H¨Ò¥~ªº¡AÃö©ó³oÂI
   ¡A½Ð»PLinuxªº¨ó½Õ¤H³sµ¸¡A¹q¤l¶l¥ó«H½cªº¦a§}´N¦b«áÀY¡C
   
   Á`¦Ó¨¥¤§¡A§Ú­Ì§Æ±æ©Ò¦³ªºHOWTO¤å¥ó¯à°÷³z¹L¦UºØ¤£¦PªººÞ¹D¾¨¥i¯àªº¶Ç¼½¥X¥h
   ¡AµM¦Ó¡A¦P¼Ë¤]µ´¹ï§Æ±æ³o¥÷ª©ÅvÁn©ú¥i¥H¦s¯d¦b¤å¥ó¸ÌÀY¡A¨ä¥L¥ô¦óµo
   ¦æHOWTOs¤å¥óªº­pµe¡A§Ú­Ì³£«ÜÄ@·N±µ¨ì§Aªº³qª¾¡C
   
   ¦pªG¦³¥ô¦ó°ÝÃD¡A½Ð»PLinux HOWTOªº¨ó½Õ¤HTim Bynum³sô¡Aemail address
   ¬Ogregh@sunsite.unc.edu¡C
   
   ­ì¤åÂà¸ü¦p¤U¡G All trademarks used in this document are acknowledged
   as being owned by their respective owners.
   
   This document is copyright (C) 1996 Daniel Barlow
   <dan@detached.demon.co.uk> It may be reproduced and distributed in
   whole or in part, in any medium physical or electronic, as long as
   this copyright notice is retained on all copies. Commercial
   redistribution is allowed and encouraged; however, the author would
   like to be notified of any such distributions.
   
   All translations, derivative works, or aggregate works incorporating
   any Linux HOWTO documents must be covered under this copyright notice.
   That is, you may not produce a derivative work from a HOWTO and impose
   additional restrictions on its distribution. Exceptions to these rules
   may be granted under certain conditions; please contact the Linux
   HOWTO coordinator at the address given below.
   
   In short, we wish to promote dissemination of this information through
   as many channels as possible. However, we do wish to retain copyright
   on the HOWTO documents, and would like to be notified of any plans to
   redistribute the HOWTOs.
   
   If you have questions, please contact Tim Bynum, the Linux HOWTO
   coordinator, at linux-howto@sunsite.unc.edu via email.
   
   6/3/98¼W­×
   
10. ¯Á¤Þ

   ¶}ÀY¦pªG¤£¬O¤å¼Æ¦rªº¦r¤¸¡A±Æ¦C´N«ö·ÓASCII½Xªº¶¶§Ç¡C
   
     * -fwritable-strings [26]39 [27]56
     * /lib/cpp [28]16
     * a.out [29]1
     * ar [30]10
     * as [31]8
     * <asm/*.h> [32]19
     * atoi() [33]40
     * atol() [34]41
     * binaries too big [35]63 [36]65 [37]77
     * chewing gum [38]3
     * cos() [39]68
     * debugging [40]59
     * dlopen() [41]82
     * dlsym() [42]83
     * documentation [43]4
     * EINTR [44]52
     * elf [45]0 [46]71
     * execl() [47]57
     * fcntl [48]47
     * FD_CLR [49]44
     * FD_ISSET [50]45
     * FD_SET [51]43
     * FD_ZERO [52]46
     * file [53]2
     * <float.h> [54]20
     * gcc [55]6
     * gcc -fomit-frame-pointer [56]61
     * gcc -g [57]60
     * gcc -v [58]14
     * gcc, bugs [59]15 [60]28 [61]29 [62]84
     * gcc, flags [63]13 [64]25 [65]26
     * gdb [66]64
     * header files [67]17
     * interrupted system calls [68]51
     * ld [69]9
     * LD_* environment variables [70]80
     * ldd [71]81
     * libc [72]7
     * libg.a [73]62
     * libgcc [74]79
     * <limits.h> [75]21
     * lint [76]58
     * <linux/*.h> [77]18
     * manual pages [78]5
     * <math.h> [79]70
     * maths [80]69
     * mktemp() [81]55
     * optimisation [82]27
     * QMAGIC [83]76
     * segmentation fault [84]30 [85]54
     * segmentation fault, in GCC [86]33
     * select() [87]50
     * SIGBUS [88]34
     * SIGEMT [89]35
     * SIGIOT [90]36
     * SIGSEGV [91]31 [92]53
     * SIGSEGV, in gcc [93]32
     * SIGSYS [94]38
     * SIGTRAP [95]37
     * sin() [96]67
     * soname [97]73
     * sprintf() [98]42
     * statically linked binaries, unexpected [99]66 [100]78
     * <stdarg.h> [101]23
     * <stddef.h> [102]24
     * strings [103]11
     * <sys/time.h> [104]48
     * <unistd.h> [105]49
     * <varargs.h> [106]22
     * version numbers [107]12 [108]74
     * weird things [109]72
     * ZMAGIC [110]75

References

   1. http://www.linux.org.tw/CLDP/
   2. http://linux.ntcic.edu.tw/~jsfrank/
   3. http://sunsite.unc.edu/pub/linux/docs/HOWTO/
   4. http://ftp.linux.org.uk/~barlow/howto/gcc-howto.html
   5. ftp://tsx-11.mit.edu/pub/linux/packages/GCC/
   6. ftp://sunsite.unc.edu/pub/Linux/docs/
   7. ftp://tsx-11.mit.edu/pub/linux/packages/GCC/
   8. ftp://prep.ai.mit.edu/pub/gnu/
   9. ftp://tsx-11.mit.edu/pub/linux/packages/GCC/
  10. ftp://tsx-11.mit.edu/pub/linux/packages/GCC/
  11. ftp://tsx-11.mit.edu/pub/linux/packages/GCC/
  12. ftp://tsx-11.mit.edu/pub/linux/packages/GCC/
  13. ftp://sunsite.unc.edu/pub/Linux/devel/msdos
  14. ftp://prep.ai.mit.edu/pub/gnu
  15. ftp://larch.lcs.mit.edu/pub/Larch/lclint
  16. ftp://prep.ai.mit.edu/pub/gnu
  17. ftp://tsx-11.mit.edu/pub/linux/packages/GCC
  18. ftp://ftp.x.org/contrib/xxgdb-1.08.tar.gz
  19. ftp://sunsite.unc.edu/pub/Linux/devel/debuggers/
  20. ftp://ftp.x.org/contrib/ups-2.45.2.tar.Z
  21. ftp://ftp.std.com/pub/jrs/
  22. ftp://tsx-11.mit.edu/pub/linux/packages/GCC/src/tools-2.17.tar.gz
  23. http://homer.ncm.com/linux-gcc/
  24. mailto:dan@detached.demon.co.uk
  25. http://ftp.linux.org.uk/~barlow/
  26. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.39
  27. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.56
  28. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.16
  29. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.1
  30. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.10
  31. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.8
  32. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.19
  33. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.40
  34. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.41
  35. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.63
  36. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.65
  37. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.77
  38. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.3
  39. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.68
  40. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.59
  41. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.82
  42. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.83
  43. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.4
  44. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.52
  45. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.0
  46. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.71
  47. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.57
  48. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.47
  49. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.44
  50. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.45
  51. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.43
  52. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.46
  53. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.2
  54. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.20
  55. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.6
  56. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.61
  57. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.60
  58. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.14
  59. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.15
  60. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.28
  61. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.29
  62. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.84
  63. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.13
  64. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.25
  65. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.26
  66. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.64
  67. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.17
  68. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.51
  69. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.9
  70. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.80
  71. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.81
  72. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.7
  73. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.62
  74. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.79
  75. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.21
  76. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.58
  77. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.18
  78. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.5
  79. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.70
  80. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.69
  81. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.55
  82. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.27
  83. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.76
  84. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.30
  85. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.54
  86. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.33
  87. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.50
  88. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.34
  89. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.35
  90. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.36
  91. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.31
  92. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.53
  93. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.32
  94. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.38
  95. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.37
  96. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.67
  97. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.73
  98. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.42
  99. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.66
 100. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.78
 101. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.23
 102. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.24
 103. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.11
 104. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.48
 105. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.49
 106. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.22
 107. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.12
 108. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.74
 109. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.72
 110. file://localhost/tmp/zh-sgmltools.9205/GCC-HOWTO.txt.html#index.75