
                         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
     _________________________________________________________________
   
   ĭzwGNU CsĶM{]kAPɷ[a{sĶBsB
   BL{HΥiୱ{ѦhDCg@ѦҸƮbӦ۩Mitch
   D'SouzaͩҦGCC-FAQFӥt@ӨӷOELF-HOWTOCHOWTOiHw
   NFGCC-FAQAӥBYNnä[NELF-HOWTOFCDGCC-HOWTOĤ@}o
   檺]z|ǸFORCSǧ@^APĳAH
   wC
     _________________________________________________________________
   
1. 滷I

     * 1.1 Ķ̪
     * 1.2 ʻPR
     * 1.3 @̪py
     * 1.4 LPƪ
       
2. FFbH

     * 2.1 GCC-HOWTObH
     * 2.2 GCCƤSbH
     * 2.3 GCC 
     * 2.4 C{]PY
     * 2.5 pu (as, ld, ar, strings etc)
       
3. GCCw˻PGCC]w

     * 3.1 GCC
     * 3.2 FF˦n᳣hF?
     * 3.3 Yɣz?Yɣz?
     * 3.4 إߥesĶ(Building cross compilers)
       
4. ӵ{PsĶ{

     * 4.1 gccۦwqŸ
     * 4.2 uWDU
     * 4.3 ӯO
       
5. Pʺ

     * 5.1 wv]lint^
     * 5.2 
     * 5.3 ʺ
       
6. s

     * 6.1 @ɵ{w vsRA{w
     * 6.2 ׷fP]sin() bӵ{w̡H^
     * 6.3 XɮסH
     * 6.4 إߧAۤv{w
       
7. ʺAJ

     * 7.1 򥻷
     * 7.2 ~T
     * 7.3 ʺAJB@
     * 7.4 HʺAJg{
       
8. PoiHhp

     * 8.1 Bug
     * 8.2 Uoi
       
9. y

     * 9.1 WH]
     * 9.2 ½Ķ
     * 9.3 w󪺦^X
     * 9.4 XkwWw
       
10. 
     _________________________________________________________________
   
1. 滷I

1.1 Ķ̪

     * oĶ嬰Linux document projects(LDP)½ĶpetC@Cثe
       } [1]http://www.linux.org.tw/CLDP/AwUͿDJ@p
       eC
     * ڨèSӭvr½ĶCFODĶqZiŪAڷ|yy
       @rA[oKLAάO²Fo˰ܡAiHɤ^嶡
       ykctʡAByiHeqLêC
     * @rPM~JA|[WrC
     * JĶxA߭`rJpbugsBshadow passwordBpadding
       BimageAhOd夣ܡCYդUoǦrJAĶ㪺AФ[
       СC
     * 夤YJ"[Ķ̵:**]"аOAhHB~ѡC
     * ogĶ妳ĳPðݪAemailfrank63@ms5.hinet.netC
     * WWW Home PageG [2]http://linux.ntcic.edu.tw/~jsfrank/C
     * Ķ½Ķvwo^y@Daniel Barlow ͤPNFtA
       ؾͫOĶҦvQAAiHNAHUشC
       鴲GoĶAߦ`ɥRݭʤʪWABiNĶ
       C
     * v0.1Ķ۷WAsyykcӹLPAv0.2w襤
       媺ΦrߺDӭץAñNW@ĶaץLӡAҦpeither
       oӦrA^H`eitherWΡA̤N@ӡFoHOWTONR
       XoӥΦrߩʡAy򥻤WtC
     * 夤XyܨSĶXӡA@譱OݤAt譱OĶ]ĶXӡA
       HunOdFAnOդUs⮩ALצpЧiDڡC
     * v0.1½Ķ_lG11/7/97FIG11/19/97C
     * v0.2ץ_lG5/13/98FIG6/3/98C
       
1.2 ʻPR

   ثeLinuxoiiܬ骺iۡC²@IALinuxذɪ榡
   iΡAMAtάOX_ӪFALinuxӬO䤤@اaI\Ūo
   AiHUAMɪOC
   
   npϧOOH椽ε{file]ҦpAfile /bin/bash^NFC
   NELF{ӨAùWܥXӪT|tELFrFpGOa.outA
   T|㦳 Linux/i386rˡC
   
   ELFPa.out榡tB|b򪺳`Qס]ܼsxI^CELFOs
   榡A@ӨA{׸ΡC
   
1.3 @̪py

   vPXkwWwAN\bo󪺧ݡC~A٦@Ǥ
   oAܭnCNAۨSƷFA]nbUsenetW@ǧbʰݪ
   DF٦AnѥHۤvCy\O`pAMo@ǤObugsbugsX
   H{AoNiDOHAǵLNAbѷݭeAjMFܡHҥH
   ۥHO^DqOovC
   
1.4 LPƪ

   pGA{bŪOPostscriptBdviάOhtml榡AAҬݨ쪺rܤƴN|
   uŪ¤r榡Hh@ǡCSOOɮצW١BROBROXPKX
   lXAβγOrrCo˰ܡAYǻݭnjժܼ
   ٦ǨSTwGdҦӨANiHFjժĪGFC
   
   Ūo󪺦PɡAA]|o@MZΪޡCYOdviB postscript
   AުƦrNO`(section)sFpGOHTMLܡAoǼƦr|
   ǱƦCAAiHηƹhs۹諸ޤeFpGAݪO¤r
   , ƦrNuOƦrASOtNFĳA֪@ŬI
   
   ڥΪshellOBourne shell]OC shell^A|Ҥl۵MOBourne shell
   ykCpGAΪOC shellܡA]wܼƪyk|UoˡG
   
% setenv FOO bar

   nOBourne shellܡAڷ|oˤlgG
   
$ FOO=bar; export FOO

   pGܲŸܪOrŸ#ӤOrŸ $ܡAܦioөROOu
   AΩrootӤwCMաAnOAդFoǽdҡAG˱oAtεoͨaܡA
   ڥiO@Id]|tInBI:-)
   
   11/8/97Ķ. 5/13/98׭q
   
2. FFbH

2.1 GCC-HOWTObH

   oOLinux HOWTOtC@AyܻAAiHbҦsLinux HOWTO
   󪺺WoܡAҦp
   [3]http://sunsite.unc.edu/pub/linux/docs/HOWTO/CHTML]i|O
   s^iHq
   [4]http://ftp.linux.org.uk/~barlow/howto/gcc-howto.htmlWUӡC
   
2.2 GCCƤSbH

   зǪgccOHbo檺lX(source distribution)]UݴN
   FI^AYtextinfoP.infoɮסCnOAstv֡AάO
   @cdromAMAת@ߤ]AAiHۤv⥦untarAMA۹
   줸@@/usr/infoؿUCpAPWzšA
   [5]tsx-11Wh[[CLAڷQASnѬO}O۳̷saI
   
   libc󻡩بӷC@جOGNU libcAH.info榡xsAFstdio
   ~AlLinux libc۷ԺɺTCt@إiHbLinuxarchive
   [6]manpagesWtΩIs]system call^]2`^Plibcơ]function^
   ]3`^󻡩C
   
2.3 GCC

   ѵG:
   
   (a)AiHb [7]ftp://tsx-11.mit.edu:/pub/linux/packages/GCC/W
    Linux GCCot(distribution)AӥBOwgsĶniɡC
   ڦbgoɡA2.7.2(gcc-2.7.2.bin.tar.gz)O̷sC
   
   (b)ۥѳn|]Free Software Foundation^ҵoGGCC̷slXiH
   q [8]GNU archivesWoCSnDoPWz@P~ALo
   ӪTOثe̷sCLinux GCC@(maintainers)AiHܻP
   ۦsĶoӳ̷sCconfigureROZ(script)|A۰ʳ]wnҦ
   ƱCĳAŤ [9]tsx-11ݬݡAw|ץOA|Q
   nΪC
   
   pGQnsgX@ǦΪn]OoA٬O֨Sԣγ~nb
   W|By«C^AUo@p`ҽͪ]OAݭnG
   
2.4 C{]PY

   ӿ@M{]OM(i)AtάOELFάOa.outF(ii)AƱAt
   ܦ@ءHpGAOqlibc 4@Ũlibc 5A򵹧A@Ө}ߪĳA
   hݬELF-HOWTOACA@w|ݡAbELF󪺭OHKIKIʡA
   NthoۦPmC [10]tsx-11WiHAQnC
   
   libc-5.2.18.bin.tar.gz
          --- ELF@ɵ{]]ELF shared library images^ARA{]
          ]static libraries^PYɡ]wCyPƾǵ{]^C
          
   libc-5.2.18.tar.gz
          ---libc-5.2.18.bin.tar.gzlXCoɮקA]ݭnA].bin.M
          (package)tݪYɡCpGɧASݤMAoOѨ
          ˦ۤUAʤsĶC{wnF٬OΤHasĶnGi
          (binaries)NiHFCoاxZHAӡAݧڪLΡGΤHasĶ
          nGiɤNѨMFIubAQnNYSάOshadow password
          pUA~ݭnۤvӱʷnxC
          
   libc-4.7.5.bin.tar.gz
          --- oɮ׬Oa.out@ɵ{w(shared library images)PRA{
          wAγ~OFPezlibc 5M@s@aӳ]pALDAQn
          ~ϥa.out{άO~oia.out{AMܡAOݭn
          C
          
2.5 pu (as, ld, ar, strings etc)

   ثeAPeҽͪ@ˡAq [11]tsx-11WANiHoǤu
   {CثeObinutils-2.6.0.2.bin.tar.gzC
   
   ݭn`NObinutilsuAΩELFAӥBثelibc]OݩELFF
   MաAߺDa.outHpGELFlibcPa.outlibcpX_Ӥ@_ϥΡAo
   L̨OAnLƤFCi_{AC{]oiHM}B
   VELF榡ADAuܦnzѡAݭna.outFFAMڡAja|
   yAi}AX[JUiתjyC
   
   11/9/97Ķ
   
3. GCCw˻PGCC]w

3.1 GCC

   bshellܲŸUJgcc -vAùWN|ܥXAثebϥΪGCC
   CPɳo]O@Ӭ۷iakAiHTwA{bҥΪOELFάOa.outC
   bڪtΤWAgcc -vGOG
   
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2

   WTXFX󭫭nƱG
     * i486 oOA{bbΪgccOF486LBzӼg---Aq
       iO386άO586Co3طLBzҽsĶӦ{XAOi
       HۮeϥΪCtOBO486{XbYǦa観[Wpadding\A
       ҥHiHb486W]o֡Co386ӨA{įä
       |򤣨}vTAuLu|{XܱoyyjF@ǡC
     * box oiH@I]nFL]itҫ]OslackwareΪ
       Odebian^AΪ̮ڥ]O]ҥHoI㪺ؿW٬Oi486-linux
       ^CpAOȬ˳˳̡A˦۰ʤإݩۤvgccAAiHb
       إߪL{]wo@AHICNڰ@:-)C
     * linux oOlinuxelfάOlinuxaoutCo@|OHް_nxb
       AsO@ط|ھڧAҥΪӲC
          + linux NELFYǸO2.7.0.]άOs^F_hܡA
            NOa.outFC
          + linuxaout Na.out榡Clinuxwqqa.out󴫨ELF
            AlinuxaoutN|An@ܡAF@ӥؼЪC]AA
            |ݨ󪩥s2.7.0.gcclinuxaoutC
          + linuxelf wgLɤFCq`oO2.6.3gccAӥBoӪ]i
            HΨӲELFiɡCn`NOAgcc 2.6.3bELF{
            Xɷ|bugsAҥHpGAثeΪnOoӪAĳA֪@
            C
     * 2.7.2 ǸC
       
   ҥHA`_ӡAڦ2.7.2gccAiHELF榡{XCNo²A
   YaIehH
   
3.2 FF˦n᳣hF?

   pGwgccɨSJӪݵۿùAΪ̧AOq@ӧ㪺otθ̧gcc
   WXӦw˪ܡA]\A|QD쩳oǪFF˦nObɮרt
   ΪǦaCXӭIpUG
   
     * /usr/lib/gcc-lib/target/version/ ]Plؿ^jsĶNOb
       oӦa誺Cbo঳i檺{AڦbsĶu@Ft~A٦@
       ǯSw{wPYɵ]|xsbC
     * /usr/bin/gcc OsĶXʵ{---]NOAڦbROC(command
       line)W檺{CoӥؿiѦUتgccϥΡAunAΤPs
       Ķؿ]pWҭz^Ӧw˴NiHFCnDwO@ӡA
       bshellܲŸUgcc -vCnOQjYӪANgcc -V
       versionCҦpG
       
# 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)/ pGAˤFƺتؼЪAҦpa.out
       PelfAάOY@تesĶ(cross-compiler)AݩDDy
       Ъ]non-native target(s)^{wAbinutils]asBld^u
       PYɵiHboCYϧAuwˤF@gccA٬OiHbo
       oǭ쥻NO̷ǳƪFFCpGOboANӬO
       b/usr/(bin|lib|include)FC
     * /lib/A/usr/lib P䥦ؿODytΡ]native-system^{]
       ؿC\hε{|Ψ/lib/cppA]A]ݭn---@kWAO
       q/usr/lib/gcc-lib/target/version/ ؿ̫ANO˭ӲŸs
       ]symlink^VC [Ķ̵:ҿתnativeAOثeAtάO
       Ha.outelf榡DAΪ̤wgccO@تCnativeN
       OgBꪺPѥͪKKFA@CD-ROM
       YܧNLinuxw˧ALinuxX͡AAӤHS@p@~x
       ApGA[ˤ@Ǥ@˪ؼЪA۵MNgP~١} L
       Fv~AꡦP~ꡦBѥ͡PHϧOAPɤ]t
       w]default^NbCYA[WAӤH[P_MߦnA
       QΥDy]native^PDDy]non-native^½ĶٺC]
       
3.3 Yɣz?Yɣz?

   pAۦw˦b/usr/local/includeؿUYɱưb~
   ALinux٦t~3إDnYɡG
   
     * /usr/include/PlؿUYɡAjOH.J.LuoilibcM
       (libc binary package)ҴѪCڷ|uj]AO]A
       i঳䥦ӷYɡ]OcursesPdbm{w^\boFרO
       ApGA{bΪO̷slibcotΪܡ]sªˡAwg
       A䴩cursesdbmFC^AFFhOHHQުI [Ķ
       :libc binary packageNHGiΦ(machine code)xsMA
       DlX]text^AYnHĶXAhlibcGiɮM󡦡A
       mAGhbinaryAHlibcMq١C]
     * b֤߭lXotΤ(kernel source distribution)
       A/usr/include/linux P /usr/include/asm ]Yoɮ
       G<linux/*.h> P <asm/*.h>^ӦŸs]symbolic links^iHs
       ܥؿlinux/include/linux P linux/include/asmCpGAE[
       ܡAw˳oǪFFANӥuOӽsĶ֤ߡ]kernel^ӤwC 
       lXY]unpacking^AiA]|o{Aݭnb֤ߪؿ
       ]kernel directory^Umake configʧ@Cܦhɮ׳|
       <linux/autoconf.h>AiOoɮ׫oi]PӤsb
       CYz֤ߪ̡AasmNuOۤv@ӲŸsAȶȬObmake
       configɤ~إߥXӦӤwC [Ķ̵:崣autoconf.hɬOMany
       files depend on <linux/autoconf.h>,which otherwise may not exist,*
       CBotherwiseήe(adj)At@pBt@
       BPNANήely}G(i) Many files
       depend on <linux/autoconf.h>. (ii)<linux/autoconf.h> of other
       condition may not exist. PU@yۤABPbP
       pUC] ҥHAAbؿ/usr/src/linuxUAѶ}֤ߪ{XɡAN
       ӵۤUܪaI
       
$ cd /usr/src/linux
$ su
# make config
(^UӪDCq`^oTänADA~vy֤ߡ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ۤPsĶӲAݩAӤHɮסAiHb
       /usr/lib/gcc-lib/i486-box-linux/2.7.2/include/P䥦]ۦP^
       ؿW٪aC 11/11/97Ķ 5/14/98ץ
       
3.4 إߥesĶ(Building cross compilers)

  NLinux@Ъ@~x(target platform)
  
   ]AwggcclXAq`Aun̴`INSTALLɪܫKi@
   ]wC make᭱Aconfigure --target=i486-linux --host=XXX on
   platform XXXANAܧFCn`NOAA|ݭnLinux٦֤ߪY
   ɡFPɤ]ݭnإߥeĶ(cross assembler)Pes(cross
   linker)AӷO [12]ftp://tsx-11.mit.edu/pub/linux/packages/GCC/C
   
  Linuxl@~x(source platform)MSDOS@Ъ@~x
  
   UghCܩ㪺AoӤjݭnΨMemxάOMgoCЦۦh
   [13]ftp://sunsite.unc.edu/pub/Linux/devel/msdosݬݡCڨèSչLo
   ӪFAҥHSkOҤC
   
4. ӵ{PsĶ{

4.1 gccۦwqŸ

   ungccɡA[ -voӰѼơANXAҥΪogccA۰AwqF
   ŸCҦpAڪݰ_ӷ|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__ -

   YAbg{X|Ψ@LinuxWSʡA⨺ǵLkӪ{
   XAH󦡽sĶemROʬA_ӡAiOӤDNOIpUҥܡJ
   
#ifdef __linux__
/* ... funky stuff ... */
#endif /* linux */

   __linux__NiHFتFݥJӤ@IAOlinuxClinux]wqA
   AoӤMOPOSIXзǡC
   
4.2 uWDU

   gccsĶѼƪOgcc info page]bEmacsAUC-h iAM
   gccﶵ^CnOˤXӡAOACD-ROMHSoӪFFAA
   MNOA{bΪOªCJoرpA̦nkOʴLvarchive
   [14]ftp://prep.ai.mit.edu/pub/gnuάOmirrorsxAhgcclɮ
   ^aAsi@fC
   
   gcc manual page]gcc.1^ iHOwgLɤFAnOAYFۨSƷFwO
   QݡAN|iDAOLFC
   
  X
  
   bROCWgccɡAunbѫ᭱[W-OnﶵANgccĨĪ
   AͥX̨νsXXCo̪nO@ӥiiLpơAPgcc
   AnNqP䥿T\ĳ@ˡALA嫬dOq0]nCAڤ
   n̨νsXC^ܤƨ2]̨νsXnh@IC^AA@Ũ3]̨νsXnAh
   @IAh@I^C
   
   gccb䤺|NoǼƦrĶ@tC-fP-mﶵCgccɱaWX-v
   P-QAANܲMݥXC@صŪ-OO쨺ǿﶵCn񻡡AN-O2
   AڪgcciD|ڻ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

   nOAΪ̨νsXŰAsĶү䴩]e.g. -O6^A򥦪
   GNAΧAsĶүണѪ̰ŪĪGO@˪CbAoX
   hgcc{XAΦbsĶɳOpBzoDAuOncQC
   YOiB̨νsXkXs̡AӧA]άOAusers^
   ٬Oյ۳o˰ܡAiN|o{gcc|_A{FC
   
   qgcc 2.7.0@Ũ2.7.2usersӪ`N@IAϥ-O2ɷ|@bugCV|
   OAjקѼ(strength reduction)~MSΡInOAwss
   ĶgccܡAO@ӭץiH󥿳o~FMܡA@wnTw
   CsĶɳ[W-fno-strength-reduceI
   
   11/12/97Ķ
   
  өʪLBz
  
   @-mXQγBAOoLkǥѦUصŪ-O}ӨϥΡCo
   ̭nO-m386M-m486oءAΨӧiDgccӧ⥿bsĶ{X@M
   386άO486ҼgC׬Oέ@-mӽsĶ{XAiHb
   WA-m486sĶXӪX|jALӦb386W]]|
   CNOFC
   
   ثe|L-mpentiumάO-m586XCLinusĳڭ̥iH-m486
   -malign-loops=2 -malign-jumps=2 -malign-functions=2ӱǫνsX486
   {XAo˰nNiHקKalignment]Pentiumäݭn^Ljgapso
   ͡CMichael MeissnerG
   
     ڪĤPiDڡA-mno-strength-reduce]KInoڥiObͱjק
     ѼƪbugrAwgOt~@ӪתԳFC^@ˤ]iHbx86
     W͸֪{XAoO]x86ȦsۤiiȴbA
     ӥBGCC's method of grouping registers into spill registers vs.
     other registers doesn't help eitherCǲΤWAjקG|ϱos
     ĶhQΥ[kȦsH[kBӨNkBCƹWAڦbh
     -fcaller-savesi]uOӺ|}]wC
     
     ӧڪĤCPhAתiDڻA-fomit-frame-pointeri|]iण|
     YCqoIӬݡANON׵ۦt@ӼȦsiHΨӳBzO
     tDCt譱AYºqx86bഫOXk
     WӬݡAKN׵۰|ҥΨ쪺OŶnframeҥΨ쪺٭nӱohF
     yܻAIcache{XӨèSWUAYOդU
     F-fomit-frame-pointerܡAPɤ]OiDsĶbCIsƤAN
     ץ|СFMӡANframeAYIsƤhܡAh\
     |Ȯɰn_ӡC
     
   o譱DD̫@qܤOӦ۩LinusG
   
     n`NOApGAQnǫΪpįAidUO۫HڪܡCL
     צpA@wniաCgccsĶ٦\hѼƥiΡA䤤iN@
     س̯SOզXAiHĄνsXGC
     
   11/14/97Ķ 5/15/98ץ
   
  Internal compiler error: cc1 got fatal signal 11
  
   Signal 11O SIGSEGVAΪ segmentation violationCq`oO
   gccۤvҥΪзPxbAӥBٹյۧƼgJݩ󥦪O
   CҥHAoiO@gccbugC MӡAjӨAgccO@gLYKեB
   iaר}nnΧ@C]ΤFjqƵcPHмƶqC²
   AYOn糧@̬DP̤@ARAMյ{AgcciH@KZ
   aCpALksƻsobug---As}lsĶɡA~TèS@
   X{bP@Ӧa---XGiHTw,OAw饻D(CPU,O,D
   OάO֨O).dUn]AqiHqL}{ǪաB
   OWindowsiH]oܶBΪ̨䥦򪺡AN^LYӤjvŶǻoOgcc@
   bugFAҰoǴհʧ@Aq`SڤWȡAoOܦXz
   Ct~A]n]sĶ֤߮ɡA`Odbmake zImageqANnj|
   oOgccbug---M|bڡImake zImageɡAݭnsĶɮ
   iNWL200ɮסFڭ̥b@ӴNסC
   
   pGAiHвͳobugAӥB]̦nOo˰աI^iHg@ӵup{
   iܳobugܡAANiH⥦bugiAMemailFSFAΪ
   Olinux-gccqH׾¡CAiHhѦgccAݬݦԲӪT,O
   L̩һݭnC
   
4.3 ӯO

   ڳAӳ\hXAYOYFF{b٨SӨLinuxW
   hAiH֩wOA@w@IȤ]SC:-)
   
   Ig@IC@ӨAlXuݭn@ǧקANiHJALinux
   100%PPOSIXۮeSCpGAF󪺭קAӱNǦ^@̡A|
   Oܦس]ʪ|ʡCoˤNuݭnΨ졥makeANo@ӥi檺
   ɮפFC
   
  BSDЮ{ ( bsd_ioctlBdaemon P <sgtty.h>)
  
   sĶ{ɡAiHtX-I/usr/include/bsdPs-lbsd{wC]ҦpGbA
   MakefileɤA-I/usr/include/bsd[CFLAGS@F-lbsd[
   LDFLAGS@^CpGAuQnBSDAH欰A]ݭnA[
   W-D__USE_BSD_SIGNALFCO]AΤF-I/usr/include/bsdPtAFY
   <signal.h>AmakeɴN|۰ʥ[JFC
   
  ʦL(SIGBUS, SIGEMT, SIGIOT, SIGTRAP, SIGSYS etc)
  
   LinuxPPOSIXOۮeCLAǫHäOPOSIXwq---ISO/IEC
   9945-1:1990 (IEEE Std 1003.1-1990), paragraph B.3.3.1.1 sez:
   
     bPOSIX.1ٲFSIGBUSBSIGEMTBSIGIOTBSIGTRAPPSIGSYSHAO
     ]̪欰P@覡AӥB]LkiACT{
     @覡AKiHoeoǫHAiOH󻡩̬Ob˪
     UoeXӪAHΫXP̪oiC
     
   QnץoӰDA²]O̲ªkNOSIGUNUSEDswqoǫHC
   TkӬOH󦡪sĶ#ifdefӳBzoǰD~G
   
#ifdef SIGSYS
/* ... non-posix SIGSYS code here .... */
#endif

   11/15/97Ķ 5/22/98ץ
   
  K & R
  
   gccO@ӻPANSIۮesĶF_ǪOAثejhƪ{XŦXANSI
   wзǡCpGARANSIAwANSIѪзǨӼgC{AGF[
   W-traditionalX~ANS䥦iHhͪFCThere is a
   certain amount of finer-grained control over which varieties of brain
   damage to emulate;Цۦd\gcc info pageC
   
   n`NOAާAΤF-traditionalӧܻySʡAĪG]ȫ]
   gccүdCҦp, -traditional|}-fwritable-stringsAϱo
   r`ƲܸưOŶ(q{XOŶXӡAoӦaO
   NgJ)Co˰|{XOŶLΤW[C
   
  emBzŸfWƭ쫬ŧi
  
   ̱`DOApҬҪALinux\h`ΪƳwqsb
   YɤAɭYۦƭ쫬ŧiX{b{XAemBz|ڵi
   ykRem@~C`atoi()Patol()C
   
  sprintf()
  
   bjUnixtΤWAsprintf(string, fmt, ...)Ǧ^OstringСAM
   ӡAo譱Linux]`ANSI^Ǧ^oOJstringrƥ.i沾Ӯ
   AרOwSunOSAݦĵıߡC
   
  fcntl PơFFD_*aڪwq쩳\b?
  
   Nb<sys/time.h>YC Fu쫬ŧiAAΤFfcntlAiA]Qt
   AY<unistd.h>iӡC
   
   @ӨAƪmanual page|bSYNOPSIS`CXݭnYɡC
   
  select()p---{ɷ|B󦣸L-ݪA
  
   ܤ[ܤ[He,Aselect()pɰѼƥuŪʦӤwCYϨF̪
   Amanual pagesMUoqĵiG
   
     select()ӬOǥѭץɶƭȡ]pGܡ^AAǦ^ۭlpɶ}l
     ҳѾlɶCӪi|ϳo\{C]ANثeӨAY
     HIsselect()ApɫФM|QץLAiO@ثD`
     QkI
     
   ӴNbڭ̪eFIܤ֡AboAiHݨCselect()Ǧ^A
   Oݩ|FƩүӶOɶAѾlɶƭȡCpGbpɵ
   ɡASƶǰeiӡApɤ޼ƫK|]0FpG٦
   select()AHP˪pstructureөIsAselect()K|ߨ赲C
   
   YnץoDAunCIsselect()eApɼƭȩp
   structureANSDFCU{XA
   
      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ӰDAbǪMosaic̬O۷ۦWAun@ݡAMosaicN
   b̤FCMosaicùkWAOOӶꪺB|઺ayʵeC
   yoU֡ANܸƱqWǰeLӪtvUCI
   
  ͤ_tΩIs
  
  SxG
  
   @{HCtrl-ZBMAsɡXΪ̬O䥦iHCtrl-C_
   HpApl{Ǫ׵XtδN|軡"interrupted system call"
   O"write: unknown error"AΪ̽ѦpTC
   
  DIG
  
   POSIXtˬdHơA_@ªUnixOnh@ICpG
   OLinuxAiN|signal handlersFX
   
     * DPBa(pɾwn)
     * tΩIsǦ^
     * bUCtΩIsJ 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ΦӨAAݭniNOUoǨtΩIsFG creat(),
   close(), getmsg(), putmsg(), msgrcv(), msgsnd(), recv(), send(),
   wait(), waitpid(), wait3(), tcdrain(), sigpause(), semop() to this
   list.
   
   btΩIsAY@H]{ǳƦnhandler]F^
   AhandlerN|QIsChandlerNvಾ^tΩIsɡA|Xw
   gͤ_AӥBǦ^ȷ|ߨ]w-1Aerrno]wEINTRC{èSQ
   |oͳoبơAҥHNFC
   
   حץkiHܡG
   
   (1) CӧAۦw˪signal handlerAbsigactionX[
   WSA_RESTARTCҦpAUC{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`NOAoܧjqΨtΩIsAIsread()Bwrite()
   Bioctl()B select()B pause() P connect()ɡAAMoۦˬdEINTRC
   pUҥܡG
   
   (2) AۤvoܩTaˬdEINTRG
   
   o̦Ӱwread()Pioctl()ҤlC
   
   l{qAϥ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{qAϥioctl()G
   
int result;
result = ioctl(fd,cmd,addr);

   ק令A
   
int result;
do { result = ioctl(fd,cmd,addr); }
while ((result == -1) && (errno == EINTR));

   `N@IAǪBSD UnixA䤺w欰OstΩIsCYnt
   ΩIs_Aoϥ SV_INTERRUPTSA_INTERRUPTXC
   
  iHgJr
  
   gccusers`hۼ[QkA۫HL̥YӦr@`ƨӥ
   ---NuuOr`ƦӤwC]Aoئr`Ʒ|xsb{XO
   ϬqCoϰiHpageϺоimageWAקKӱswapOŶA
   ӥBռgJ|ʳ|y~(segmentation fault)CoiO@
   دSOI
   
   ¤@I{ӨAoi|ͤ@ӰDCҦpAIsmktemp()Aǻ
   ޼(arguments)Or`ơC mktemp()|յۦb*Am*sgJ
   ޼ơC
   
   ץk~G(a)H-fwritable-stringssĶAgccN`Ƹmb
   OŶFΪ(b)NIǦavsgAtm@Ӥ`ƪrA
   bIseAHstrcpy()NƫihC
   
  Isexecl()|ѡH
  
   O]AIs覡CexeclĤ@Ӥ޼ƬOAQn檺{W.ĤG
   P򪺤޼Ʒ|ܦAҩIs{argv}CCOGǲΤWAargv[0]Ou
   {Saۤ޼ưɡA~|]wȡCҥHoAAӳo˼gG
   
execl("/bin/ls","ls",NULL);

   ӤOuA
   
execl("/bin/ls", NULL);

   {Ӥa޼ơAiO@ܽШAتO⦹{ʺA{
   wWߪSʦLXӡCܤ֡Aa.outOo˪CNELFӨCƱNOoˤF.
   
   ]pGAQo{wTA@ǧ²檺iΡFѦҰʺAJ@
   `AάOlddmanual pageC^
   
   11/16/97Ķ 6/2/98ץ
   
5. Pʺ

5.1 wv]lint^

   lintLinuxӨèSܼsxγ~ADnO]jHມgcc
   ѪĵiTCi̦ΪNO-WallѼƤF---oӰѼƪγ~OnDgccN
   ҦĵiT{XӡFbut probably has more mnemonic value if
   thought of as the thing you bang your head against.
   
   W@ӹΪpublic domain lintA
   [15]ftp://larch.lcs.mit.edu/pub/Larch/lclintCڨäDoӯ쩳h
   nNOFC
   
5.2 

  ڭn˰~NT@{YH
  
   AݭnK[-gѼƨӽsĶPs{AӥBiH-fomit-frame-pointer
   ơCƹWAAݭnssĶҦ{AuݭssĶثeAb
   YiC
   
   Na.outպAӨA@ɵ{wOH-fomit-frame-pointersĶӦAoӮɭ
   AgdbNܱo^LΪZaFCsɵw-gﶵAӴNtRAs
   NqFFoNOn[-g]FC
   
   pGssѡAiDA䤣libg.aANOb/usr/lib/ؿUA
   Flibg.aClibg.aO@CyܯSO{wC@blibcM󤺴N|
   libg.aFMܡ]sOo˪^AAiݭnlibclXۤv]mF
   ALAڤWAӤݭn~CެOتAjpUAu
   Nlibg.as/usr/lib/libc.aAANo쨬TFC
   
  AणⰣTH
  
   ܦhGNUnbsĶsɡA|]w-gﶵFo˰|yɹLj
   D]q`ORAs^CڤWAoäO@ӫܼQkC
   
   pG{autoconfAͤFconfigureROZAq`ANiH
   ./configure CFLAGS=άO./configure CFLAGS=-O2TCM
   AAoˬdˬdMakefileFCMաApAΪOELFA{K|HʺA覡
   ӳsA׬O_-g]wF]AiH`ߧ-gC
   
  Ϊn
  
   AѡAjHOgdbӰCAiHq [16]GNU archive sites
   l{FΪ̬O [17]tsx-11iɡCxxgdbO@X{AӰ
   gdb]]NOAow˦ngdbA~Axxgdb^CxxgdblXiHb
   [18]ftp://ftp.x.org/contrib/xxgdb-1.08.tar.gzC
   
   t~AUPS{wRick SladkeyӦ\CUPSiHbXUoܦnA
   xxgdb---ȶȬOgdbXeݤ]X front end^Co䰣{@j
   u}SIAӥBpGAoɶh@}ꪺ{AĳAҼ{Ҽ{xxgdbC
   ƥsĶnLinuxPץlXiHb
   [19]ftp://sunsite.unc.edu/pub/Linux/devel/debuggers/Cӳ̪쪺l
   {hb [20]ftp://ftp.x.org/contrib/ups-2.45.2.tar.ZC
   
   Ai|o{t@ӥΨӰustraceA]O۷ΡCiHܥX
   {ǩҲͪtΩIsAӥBپ֦䥦hcƪ\AOpGAS
   lXܡAstraceiHAXǸ|W١]path-names^wsĶi
   ɤF exacerbating race conditions in programs that you suspect
   contain them;٦AstraceiӾǲߵ{Obq檺C̷s
   ]ثeO3.0.8^ib [21]ftp://ftp.std.com/pub/jrs/C
   
  I{]`n{^
  
   嫬`n{(daemon programs)Ofork()AMפ{ǡCo˪
   kϱoɶuFC
   
   AѳoI²檺kNOfork()]@Ӥ_I]breakpoint^C{
   ɡAjfork()Ǧ^0C
   
(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}ɡAq`պA|]wn֤ͮɮסCnOAw̪
   AiHshellbuiltinROϨ䭫sͮġGNC-shellۮeshell]ptcsh^
   ӨA|OUoˡG
   
% limit core unlimited

   Bourne shellshell]sh, bash, zsh, pdksh^hϥΤUykG
   
$ ulimit -c unlimited

   pGAQnӦh~h֤ɩRW]core file naming^]for example,
   if you're trying to conduct a post-mortem using a debugger that's
   buggy itself^AAiHA֤ߵ{@IppʡC@
   fs/binfmt_aout.cPfs/binfmt_elf.cɤPUC۲Ū{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

   N01.
   
5.3 ʺ

   ʺޡ]Profiling^OΨˮ֤@{ǳO̱`IsάO檺ɶ
   [kCo{̨ΤƻPXɮɶOOӨAO۷n覡
   CANAҭnɵ{T]timing information^تɥ[W-pӽsĶA
   ӥBpGnXɮצNqAA]|ݭngprof]ӦbinutilsM󪺩RO^
   CѾ\gprofmanual pageAioӸ`C
   
   11/18/97Ķ
   
6. s

   ѩRAP@ɵ{w̶ۮe榡tʻPʵ*link*LqϥΩ
   *sĶ᪺Ʊ*P*sĶn{ϥήɩҵoͪƱ*oƤWYA
   ϱoo@`ܱoF\hC] and, actually, the overloading of the
   word `load' in a comparable but opposite sense^LAA]NOo
   FAҥHդULߡC
   
   FyLŪ̪xbAڭٰ̺ҵoͪƬ*ʺAJ*Ao@DD
   |bU@`ͨCA]|bOaݨڧʺAJyz*ʺAs*A
   L|Obo@`CyܻAo@`ҽͪAOoͦbsĶ
   ᪺sC
   
6.1 @ɵ{w vsRA{w

   إߵ{̫@ӨBJKOsF]NONҦp{զX_ӡAݬ
   O_|FǤCMA@ǨƱOܦh{|Q---ҦpA}ɮ
   A۩ҦP}ɦp{N|Nxs{wɮ״ѵA{
   ΡCb@몺LinuxtΤWAoǤp{iHb/libP/usr/lib/ؿUC
   
   AΪORA{wɡAs|X{һݪҲաAMڱN̫
   ɤCMӡA@ɵ{wӨANOoˤFC@ɵ{w|b
   ɤdU@ӰOA*{ɡAJoӵ{w*CMA@
   ɵ{wOչϨϰܱopAPϥΧ֪OPϺЪŶ
   CLinuxw欰Os@ɵ{wAunLinuxoǦ@ɵ{wܡA
   NSDFM,LinuxN|sRAFCpGAQn@ɵ{wܡA
   doǵ{w]*.sa for a.out, *.so for ELF^O_b̸ӦbaA
   BOiŪC
   
   bLinuxWARA{w|libname.ao˪W١FӦ@ɵ{wh
   libname.so.x.y.zABx.y.zOǸ˦C@ɵ{wq`|
   sŸVRA{w]ܭn^Pp.saɮסCзǪ{w|]t
   @ɻPRA{wخ榡C
   
   AiHldd]List Dynamic Dependencies^ӬdXY{ݭnǦ@ɵ{
   wC
   
$ ldd /usr/bin/lynx
        libncurses.so.1 => /usr/lib/libncurses.so.1.9.6
        libc.so.5 => /lib/libc.so.5.2.18

   oObڪtΤWAWWWs*lynx*|̿libc.so.5 (the C library)
   Plibncurses.so.1]׺ݾù^sbCYY{ʥFWߩʡA
   lddN|statically linkedάOstatically linked (ELF)C
   
6.2 ׷fP]sin() bӵ{w̡H^

   nm {wWӷ|CX{wW٩ҰѦҨ쪺ҦŸCoӫOiH
   bRAP@ɵ{wWC]AQDtcgetattr()ObwqGAiHp
   A
   
$ nm libncurses.so.1 |grep tcget
         U tcgetattr

   *U*X*wq*---]NOncurses{wΨtegetattr()AOèSw
   qCA]iHo˰A
   
$ nm libc.so.5 | grep tcget
00010fe8 T __tcgetattr
00010fe8 W tcgetattr
00068718 T tcgetpgrp

   *W*F*zA(weak)*ANŸwwqAiѤP{wt@wq
   NC²檺*`*wq]Otcgetpgrp^O*T*ҼХܡG
   
   DҽͪDA²׫KOlibm.(so|a)FCҦwqb<math.h>
   Odbmaths{wF]AAΨ䤤@ӨƮɡAݭnH-lm
   ѼƳs{wC
   
6.3 XɮסH

   ld: Output file requires shared library `libfoo.so.1`
   
   ldPRObjMɮתWA|̾ڪtӦҤPAO
   ߤ@@ӧAiHXz]wؿKO/usr/libFCpGAƱ樭BB{
   w]CJjMCAANH-LﶵigccάOldC
   
   nOAo{@IĪG]SANݬݨɮ׬OO٨ĨĪbaC
   Na.outӨAH-lfooѼƨӳsA|XldhMlibfoo.sa]shared stubs^
   FpGS\AN|Mlibfoo.a]static^CNELFӨA ld|
   libfoo.soAMOlibfoo.aClibfoo.soq`O@ӳsŸAs
   libfoo.so.xC
   
6.4 إߧAۤv{w

  
  
   P䥦󪺵{@ˡA{w]ץbugsDsbC̤]iಣ
   ͥX@ǷsSIAثesbҲժ\ġAάONªCo勵b
   ϥΥ̪{ӨAi|O@ӤjDCpG@{OھڨªS
   IӰ檺ܡAH
   
   ҥHAڭ̤޶iF{ws[Cڭ̱N{w*n*P*Dn*ܧ
   OAPɳWw*n*ܧO\Ψo{wµ{oͤ_{
   HCAiHq{wɦWX]ڤWAYAELFӨȶ
   O@ѤjF~ŪNUhAKiլF^G libfoo.so.1.2D
   nO1AnO2CnsiuơA]iर򳣨S
   ---libcbo@IWΤF*ץ{*[AӭqXFlibc.so.5.2.18o˪
   {wW١CnsYO@ǦrBuBάOiHCL
   ASCIIrA]OܦXzC
   
   ELFPa.out榡̥DntO@NOb]m@ɵ{woƤWFڭ̥
   ELFA]²@ǡC
   
  ELFH쩳OFFzH
  
   ELF]Executable and Linking Format^̪OUSL]UNIX System
   Laboratories^oiӦGi榡AثeΩSolarisPSystem V
   Release 4WCѩELFҼWuʻWLLinuxLhҥΪa.out榡A]
   GCCPC{woiHh1995~MwELFLinuxзǪGi榡C
   
  SӤFH
  
   o@`OӦ۩/news-archives/comp.sys.sun.miscC
   
     ELF]Executable Linking Format^OSVR4Ҥ޶is}تɮ
     CELF_COFFiOhXF֪\CHELFӨA*O*iѨϥΪ̦ۦ
     CELF@تɬ`ϡ]sections^ApC몺զXFӥBC
     iNס]ӤO@Twjp}C^CoǸ`ϻPCOFF@ˡA
     ݭnTwbYӦaA]ݭnHYضǱƦCCpGϥΪ̧Ʊɮs
     ơAKiH[Js`ϨتɤCELF]@ӧjӦOk
     A٬DWARF]Debugging With Attribute Record Format^XثeLinux
     䴩CDWARF DIEs]Debugging Information Entries^sC|
     bELFΦ .debug`ϡCDWARF DIEsC@ .debug`ϨëD@Ǥֶq
     BTwjpTOXAӬO@NתCA֦ݩʡA
     B{Ʒ|Hd򭭨𪬸ƵcgXӡCDIEsүɮ쪺jq
     TOCOFF .debug`ϵLk䶵IC]OC++~ӹϡC^
     
     ELFɮ׬OqSVR4]Solaris 2.0 H^ELFs{w]ELF access library^
     sC{wiѤ@²KֳtELFCϥELFs{w̥D
     nf@KOAAAݭnhݤ@ELFɪquaFCNUNIXɮצӨ
     AOHElf*ӦsFIself_open()Aqɶ}lAAuݩI
     self_foobar()ӳBzɮתY@YiAäݭnɮ׹ڦbϺФW
     imagedo@ζáC
     
   ELFuIP@ŦELFũһݸgغصhWAwbELF-HOWTOפΡFڨ
   bo߽kCELF HOWTOӻPo󦳦P˪DD~OC
   
  ELF@ɵ{w
  
   YQlibfoo.so@ɵ{wA򥻪BJ|Uoˡ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|ͤ@ӦWlibfoo.so.1.0@ɵ{wAHεldAs
   ]libfoo.so^٦ϱoʺAJ{]dynamic loader^쥦
   ]libfoo.so.1^CFiաAڭ̱Nثeؿ[LD_LIBRARY_PATH̡C
   
   AzzֹD{ws\ɡAOѤF⥦p/usr/local/libؿ
   UAåBs]wTs|Clibfoo.so.1Plibfoo.so.1.0s|
   ldconfig̤_sANjtΨӻAldconfig|b}L{
   Clibfoo.sosѤʤ覡sCpGA{wҦզl]p
   Yɵ^@šA`Oۤ@AAסA²檺kNO
   libfoo.so -> libfoo.so.1Fp@ӡAldconfigK|APɫOd̷ss
   CnOASo򰵡AAۦ]wFFN|bƤyd_ʩǪDX
   {CɭԡAiOڨSAڡI
   
$ su
# cp libfoo.so.1.0 /usr/local/lib
# /sbin/ldconfig
# ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so )

  sBsonamePŸs
  
   C@ӵ{w@sonameCso{bjM{wo˪@
   ӦW١AsK|NsonameJsGiɤAӤObB@
   ڪɦWCb{AʺAJ{|jM֦sonameo˪ɦWɮ
   AӤO{wɦWC]A@ӦWlibfoo.so{wANiH@
   libbar.sosonameFCӥBҦslibbar.so{A{}l
   A|M䪺KOlibbar.soFC
   
   oť_Ӧn@INq]SAOo@IAAѼƭӤPP@ӵ{
   wOpb@tΤW@s]AoO䤧_CLinux{wзǪRW
   ApOlibfoo.so.1.2AӥBoӵ{w@libfoo.so.1sonameCp
   G{wO[зǵ{wؿU]e.g. /usr/lib^Aldconfig|إ߲
   slibfoo.so.1 -> libfoo.so.1.2AϨ䥿TimageCA
   ]ݭnslibfoo.so -> libfoo.so.1Alds쥿TsonameC
   
   ҥHoAAץ{wbugsAάOK[Fsƶih]󤣷|{s
   {yQvTܡ^AA|ئ{wAOd쥻wsonameA
   M{wɦWCA{wܧ|ϱo{{_AAu
   W[sonames---ҤAٷslibfoo.so.2.0Asoname
   libfoo.so.2C򱵵ۡAANlibfoo.sosVsFܦA@ɤSA
   ׫_FMI
   
   AnHؤ覡Ӵ{wRWALoTOӦnǲΡCELFᤩA
   b{wRWWuʡA|ϱoHݩIIdMpFo˪uʦbA
   ]äܧANohΥC
   
   ELF`G]gѧAʹ[o{ӺDһG{wDn@ŷ|}aۮe
   ʡFӦn@ūhiण|FHU覡ӳsAҦ@N|
   wLƤFC
   
gcc -shared -Wl,-soname,libfoo.so.major -o libfoo.so.major.minor

  a.out---ª榡\
  
   إߦ@ɵ{wKQʬO@ŦELFDn]@C]O,a.outi٬O
   γBbCWftph
   [22]ftp://tsx-11.mit.edu/pub/linux/packages/GCC/src/tools-2.17.tar.gzF
   YA|o{20iHCCŪCګܤwۤvҬ
   {o򪺲OɭPAiOqWU嶡AӤ]iHܲMXڱqӤ
   Y{ۤv}ʮaI:-)
   
  ZMAGIC vs QMAGIC
  
   QMAGICO@®榡a.out]٬ZMAGIC^i 榡Aoخ榡
   |ϱoĤ@ӤLkmapC0-4096d򤺨SmappingsbɡAhi
   \NULL dereference trapping[eCҲͪɮOAɷ|
   p]j1Kk^C
   
   uYN@os䴩ZMAGICA@bwIJçs䴩oخ
   FӥثeȤ䴩QMAGICӤwCƹWAoèShjvTAO]
   ثe֤ߨخ榡C
   
   *file*ROӥiHT{{OOQMAGIC榡C
   
  ɮװtm
  
   @a.out(DLL)@ɵ{w]tӯuꪺɮ׻P@ӳsŸCN*foo*oӥ
   󰵬dҪ{wӨAoɮ׷|Olibfoo.saPlibfoo.so.1.2F
   sŸ|Olibfoo.so.1AӥB|Vlibfoo.so.1.2CoǬOΪH
   
   bsĶɡAld|Mlibfoo.saCoO{w*stub*ɮסCӥBtҦ
   sһݪexportedƻPVƪСC
   
   AʺAJ{|Mlibfoo.so.1CoȶȬO@ӲŸsAӤOu
   ꪺɮסCG{wissBwץ~AӤ|l󦹮
   bϥΦ{wε{Cbs---plibfoo.so.1.3---we{
   Aldconfig|H@Lpާ@ANsVsAϱo쥻ϥª
   {|P쵷@C
   
   DLL{w]ڪDoOLת---ҥHڴXD^aI^q`|񥦭̪
   RAƥnӱojhC̬OH*}]holes^*ΦӫOdŶHK᪺XR
   Co*}*iHΥ󪺺ϺЪŶC@²檺cpIsAάOϥmakehole
   {ANiHFoˮĪGC]̪}OTwbP@mWAҥHbإ
   {wAAiH⥦̮CLAdUnյۮELF{wC
   
  ``libc-lite''?
  
   libc-liteOqŪlibcCiΨӦsbϺФWA]iHjCL
   UNIXȦCS]tcurses, dbm, termcap{XCpGA
   /lib/libc.so.4Os@litelibcAĳAH㪺NC
   
  sG`D
  
   AsɩҾDJDHڡIڥiरƤ]|AOunֿnF
   ƶqAڷ|⥦̼g_*C
   
   AQ@ɡA{osRAI
          ˬdAѵldsO_TAldC@ӹ@ɵ{wA
          NELFӨAoO@ӲŸslibfoo.soAsimageFNa.outӨ
          ANOlibfoo.saɤFCܦhHNELF binutils 2.5@Ŧ2.6AN
          ͤFoӰD---jM@ɵ{wɸzAҥHèSN
          Ҧsإ߰_ӡCӡAFP䥦[cۮeAoRz
          QHRFAt~Ao˪*z*P_~v۷Aҳy
          ·Ф񥦩ҸѨMD٦hAҥHdۤ]O`HFpkhI
          
   DLLu{mkimage䤣libgccH 
          libc.so.4.5.xAlibgccwAO@ɪ榡C]AA
          b*-lgcc*X{BH`gcc -print-libgcc-file-name`N]㪺˳
          ޸]back-quotes^^Ct~ARҦ/usr/lib/libgcc*ɮסCo
          IܭnC
          
   __NEEDS_SHRLIB_libc_4 multiply defined messages 
          OP˪Dҳyt@صGC
          
   ``Assertion failure'' message when rebuilding a DLL ?
          o@Ți઺]OAbljump.varsɮפAѩ
          OdŶӤ֡AHPy䤤@jump table slotsCAiH
          u{X2.17.tar.gzMҴѪgetsizeROAwXҦ
          åǪܸCiߤ@ѨMkOAѰ{wDnsAj
          ^줣ۮe~NC
          
   ld: output file needs shared library libc.so.4 
          q`oOoͦbAs{wOlibc]pX{w^AӥBbRO
          CΤF-gѼơAoS@֨ϥ-staticAҵoX~TC
          
          @ɵ{w.sa stubsq`@ӥwqŸ_NEEDS_SHRLIB_libc_4
          Fo@Iiǥlibc.sa stubӸѨMAMӡAH-gӽsĶɡA|ϱos
          Hlibg.alibc.aӵF]oӲŸ@NSѨMA]N|ɭPW
          ~TFC
          
          `AH-gXsĶɧOѤF[W-staticAMNO-gӳsCq
          `AH-gsĶUӿWߪɮ׮ɡAoTwgAsɴN
          iHݭnFC
          
7. ʺAJ

   o@`ثeO²uF@IFڱELF HOWTOɡANOoAXiɭ
   FC
   
7.1 򥻷

   Linux@ɵ{wApGeAwŪW@`AQ{b@ť칳o˪
   AK|ߨPYC@ǷӺDҦӨObsɴKӧu@A
   Jɴ~৹C
   
7.2 ~T

   As~HڡIڤ|󪺨ơALڥiH⥦̼g_**
   
   can't load library: /lib/libxxx.so, Incompatible version
          ]a. out only^ oOASxxx{wTDnCiOH
          HH KK˭ӳsAثe֦NiHFApGBܡANu
          |yA{~ӤwChs.ELFp|yU
          o˪TG
          
ftp: can't load library 'libreadline.so.2'

   warning using incompatible library version xxx
          ]a. out only^A{wn_o{ΨӽsĶ٭n
          C{̵MiHCuOiաIڷQA@ӯӨSˮ`aI
          
7.3 ʺAJB@

   @ܼƷ|ʺAJҤCjܼƹlddγ~n_
   @users٭nӱohCӥBiHܤK]wlddtXUذѼƨӰ
   Coܼƥ]AA
   
     * LD_BIND_NOW --- `AƦbIseO|{M䪺C]wo
       ӺX|ϱo{w@JAҦMK|o͡APɤ]y_lɶ
       CCAQյ{ATwҦsSDɡAoXNܱo
       ΡC
     * LD_PRELOADiH]w@ɮסAϨ㦳*л\*ƩwqOCҦpAp
       GAnհOt貤AӥBٷQm*malloc*AAiHgn
       ƴƵ{Aç⥦sĶmallolc.AMG
       
$ LD_PRELOAD=malloc.o; export LD_PRELOAD
$ some_test_program

       LD_ELF_PRELOAD P LD_AOUT_PRELOAD AOȾAΩ󥿽TGi
       ACpG]wF LD_something_PRELOAD P LD_PRELOAD AT
       @ӷ|QΨC
     * LD_LIBRARY_PATHO@sHjؿW١AΨӷjM@ɵ{wC
       ldӨAèS󪺼vTFoub~vTCt~A
       setuidPsetgid{ӨAo@OLĪCLD_ELF_LIBRARY_PATH
       PLD_AOUT_LIBRARY_PATHoغXiھڦUOGi쫬OɦVP
       jM|C@륿`B@UAӷ|ΨLD_LIBRARY_PATHFݭnj
       Mؿ[/etc/ld.so.conf/̡FM᭫sldconfigC
     * LD_NOWARN ȾAΩa.outC@]wFo@]LD_NOWARN=true; export
       LD_NOWARN^A|iDJBzfatal-warnings]On
       e^ĵiTC
     * LD_WARNȾAΩELFC]wo@ɡA|Nq`OPRTCan*t
       find libraryഫĵiTC勵`ާ@ӨAoèShjγB
       AiOlddNܭnFC
     * LD_TRACE_LOADED_OBJECTSȾAΩELFCӥB|ϱo{H̬Oldd
       檺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ʺAJg{

   pGAܼxSolaris 2.xҤ䴩ʺAJu@ܡAA|o{LinuxboI
   WPD`۪Co@bH.J.LuELF{]p󤺻Pdlopen(3)
   manual page]iHbld.soMW^WsxQסCo̦Ӥ
   ²dҡGH-ldlsC
   
#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. PoiHhp

8.1 Bug

   DgUӡCoOwLinuxAάOgccb䥦tΤWҵoͪDC
   PkernelܡHΪ̬O{wHpGRA覡sADO
   ONFHAiH`@pq{ӮiܳobugܡH
   
   AFoǨƱAAN|D{bugsOCNgccӨAbug
   {ǬOHinfoɨӻCpGOld.soάOCBmaths{wANemailH
   linux-gcc@vger.rutgers.eduCpGi઺ܡA]t@ۤvۨp{H
   iܳobugAӥBWAyzAQno{ǤPڤWSF
   ǤC
   
8.2 Uoi

   pGAQnoigccάOC{wAĤ@ƴNO[
   Jlinux-gcc@vger.rutgers.eduqH׾¡CpGAuOQݬݳqH׾¦bQר
   Ao̦@ӽ׾ªarchivesA
   [23]http://homer.ncm.com/linux-gcc/CUӪơANݧAQFC
   
9. y

9.1 WH]

     Only presidents, editors, and people with tapeworms have the right
     to use the editorial ``we''.
     
   (Mark Twain)
   
   oHOWTOXGڴөMitchum DsouzaGCC-FAQF 󤤤jT
   OӦ۩GCC-FAQCoΨ쪺Ĥ@H٥NWAiڭ̨H䤤@
   ӡFiHAnO䤤@ӤH٨SչLoǡFpGNFAw
   BFAtΩάOdoAdlAiOڨSAڡI"Ao˪ܾA
   ΩڭǨWC
   
   o󦳰^mWHhpUҦC]HASCIIXǦCX^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 TorvaldsASFLAo
   ӹBʴNܱo@INq]SFAҥHiLt檺C:-)
   
   Фnıo󪺫_ǤBApGzWrSX{boCpGzo
   ]HOWTOάOFAQ^gL^mܡAemailڡAڷ|勵LӪC
   
9.2 ½Ķ

   ثeAo٨Sw½ĶX{CpGAƱͤ@ӥXӡA
   ޥhAL@woiDڬƩyCy|OAQn½yA
   v]ܿѡ^unXʤ@AL٬Od\@ǧaAެO
   DAڳ|ַܼNC
   
9.3 w󪺦^X

   HH [24]dan@detached.demon.co.ukCڪPGP public key (ID
   5F263625) ibڪM [25]web pagesWϥΡApGAıoƱnOK
   ܡC
   
9.4 XkwWw

   ĥιLӼФݩӧO̡C
   
   oHOWTO󪺪vݩDaniel Barlow <dan@detached.demon.co.uk>C Ai
   H󫬦CA]AΪBql覡ƥͲBǧGάO
   GCC-HOWTOAunovnOsbҦƻs~Cӷ~O\A
   ӥBڹyAo򰵡ALAګܧƱAqڦӸ`C
   
   קAAO½ĶBXRoBqolͥXL
   OXLLinux HOWTO󵥡A`ovnC]NOApGA
   ѰuHOWTOgXLAAOiHolͥXӪ[WB~
   AvT󪺵ovCMAǯSOpOiHҥ~AoI
   AлPLinuxդHsAqllHca}NbYC
   
   `ӨAڭ̧ƱҦHOWTOzLUؤP޹Di઺ǼXh
   AMӡAPˤ]ƱovniHsdbYALo
   HOWTOs󪺭peAڭ̳@NAqC
   
   pGDAлPLinux HOWTOդHTim BynumsôAemail address
   Ogregh@sunsite.unc.eduC
   
   pUG 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/98W
   
10. 

   }YpGOƦrrAƦCNASCIIXǡ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
