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±Nn¥Ã¤[´À¥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ì¤å¤£ÅÜ¡CY»Õ¤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¡An¬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Ãö¦Ñ·Ý±«eA¤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°Õ¡An¬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¨âºØÀɮסCn¬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¤Wzªº¤£²Å¡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¤Wzªºª©¥»¤@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·Qn½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·Qnªº¡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·QnNYS©Î¬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«ezªºlibc 5®M¥ó¦@¦s¦@ºa¦Ó³]pªº¡A¤£¹L°£«D§A·Qn Ä~Äò¨Ï¥Î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«üELFYª©¥»§Ç¸¹¬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°õ¦æÀÉ¡Cnª`·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¥un§A¥Î¤£¦Pªº½s Ķ¾¹¥Ø¿ý¡]¦p¤W©Òz¡^¨Ó¦w¸Ë´N¥i¥H¤F¡Cnª¾¹D¤º©wªºª©¥»¬O¨º¤@Ó¡A ¦bshell´£¥Ü²Å¸¹¤U¥´gcc -v¡Cn¬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ºØ¥Dnªº¼ÐÀ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¡^¡AYn¥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 ¡CY¤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¥un¨Ì´`INSTALLÀɪº«ü¥Ü«K¥i§¹¦¨¤@¤Áªº ³]©w¡C make«á±¦A±µconfigure --target=i486-linux --host=XXX on platform XXX¡A´N¯àÀ°§AÅܧâÀ¸¤F¡Cnª`·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ªº²Å¸¹ ¥un°õ¦æ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¡¦ªº¿ï¶µ¡^¡Cn¬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¡An¬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¥un¦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½Xn¦h¤@ÂI¡C¡^¡A¦Aª@¯Å¨ì3¡]³Ì¨Î½s½Xn¦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¦³¥Î¡In¬O§A³ßÅw«·s½s Ķgccªº¸Ü¡A¬O¦³¨º»ò¤@Ó×¥¿ªºª©¥»¥i¥H§ó¥¿³o¶µ¿ù»~¡F¤£µMªº¸Ü¡A¤@©wn½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¡In¾å±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¤è±¡AY¯Âºé±qx86ªº¾÷¾¹¦bÂà´«¥¦ªº«ü¥O¶°¦¨¬°¾÷¾¹½Xªº¤èªk ¤W¨Ó¬Ý¡A«K·N¿×µÛ°ïÅ|©Ò¥Î¨ìªº°O¾ÐÅéªÅ¶¡n¤ñframe©Ò¥Î¨ìªºÁÙn¨Ó±o¦h¡F ´«¥y¸Ü»¡¡AIcache¹ïµ{¦¡½X¦Ó¨¥¨Ã¨S¦³¹ê½è¤WªºÀ°§U¡AY¬O»Õ¤U¥Î ¤F-fomit-frame-pointerªº¸Ü¡A¦P®É¤]¬O§i¶D½sĶ¾¹¦b¨C¦¸©I¥s¨ç¼Æ¤§«á¡A´N ¥²¶·×¥¿°ïÅ|ªº«ü¼Ð¡FµM¦Ó¡A´Nframe¨ÓÁ¿¡AY©I¥sªº¦¸¼Æ¤£¦hªº¸Ü¡A«h¤¹³\ °ïÅ|¼È®É°ï¿n°_¨Ó¡C ¦³Ãö³o¤è±¥DÃDªº³Ì«á¤@¬q¸Ü¤´¬O¨Ó¦Û©óLinus¡G nª`·Nªº¬O¡A¦pªG§A·Qn±o¨ì³Ì¨Îª¬ªpªº°õ¦æ®Ä¯à¡A¥i¤d¸U§O¬Û«H§Úªº¸Ü¡CµL ½×¦p¦ó¡A¤@©wn¶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²¨¥ ¤§¡AY¬Onµû¿ï¥»¥@¬ö³Ì¬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´Nn¤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¡AY¬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ªº¨º»ò·QnBSD«¬º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¡¨ ·Qn×¥¿³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¶Ç¦^¦Ûì©lp®É¶}©l «á©Ò³Ñ¾lªº®É¶¡¡C¥¼¨Óªºª©¥»¥i¯à·|¨Ï³o¶µ¥\¯à¹ê²{¡C¦]¦¹¡A´N¥Ø«e¦Ó¨¥¡AY ¥H¬°©I¥sselect()¤§«á¡Ap®É«ü¼Ð¤´µ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¦bp®Éµ² §ô®É¡A³£¨S¦³¸ê®Æ¶Ç°e¶i¨Ó¡Ap®É¤Þ¼Æ«K·|³]¬°0¡F¦pªG±µµÛÁÙ¦³¥ô¦ó ªºselect()¡A¥H¦P¼Ëªºp®Éstructure¨Ó©I¥s¡A¨º»òselect()«K·|¥ß¨èµ²§ô¡C Yn×¥¿³o¶µ°ÝÃD¡A¥un¨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¥un¤@¦¸ªºµ¥«Ý¡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¬On¦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´Á¶¡¡AY¦³¤@«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¡CYnÅý¨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·Qn°õ¦æªºµ{¦¡¦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¥Dn¬O¦]¬°¤j³¡¥÷ªº¤H³£¯àº¡¨¬©ógcc©Ò ´£¨ÑªºÄµ§i°T®§¡C¥i¯à³Ì¦³¥Îªº´N¬O-Wall°Ñ¼Æ¤F---³oӰѼƪº¥Î³~¬On¨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²£¥Í®Ö¤ßÀɮסCn¬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·Qn¦³Ó¦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ªGnÅý¿é¥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´yz¦¨*°Êº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¥unLinux¯à§ä¨ì³o¨Ç¦@¨Éµ{¦¡®wªº¸Ü¡A ´N¨S¤°»ò°ÝÃD¡F¤£µM,Linux´N·|³sµ²ÀRºAªº¤F¡C¦pªG§A·Qn¦@¨Éµ{¦¡®wªº¸Ü¡AÀË ¬d³o¨Çµ{¦¡®w¡]*.sa for a.out, *.so for ELF¡^¬O§_¦í¦b¥¦Ì¸Ó¦bªº¦a¤è¡A¦Ó ¥B¬O¥iŪ¨úªº¡C ¦bLinux¤W¡AÀRºAµ{¦¡®w·|¦³Ãþ¦ülibname.a³o¼Ëªº¦WºÙ¡F¦Ó¦@¨Éµ{¦¡®w«hºÙ ¬°libname.so.x.y.z¡A¦¹³Bªºx.y.z¬O«üª©¥»§Ç¸¹ªº¼Ë¦¡¡C¦@¨Éµ{¦¡®w³q±`³£·|¦³ ³sµ²²Å¸¹«ü¦VÀRºAµ{¦¡®w¡]«Ü«nªº¡^»P¬ÛÃöÁpªº.saÀɮסC¼Ð·Çªºµ{¦¡®w·|¥]§t ¦@¨É»PÀRºAµ{¦¡®w¨âºØ®æ¦¡¡C §A¥i¥H¥Îldd¡]List Dynamic Dependencies¡^¨Ó¬d¥X¬Y¤äµ{¦¡»Ýnþ¨Ç¦@¨Éµ{¦¡ ®w¡C $ ldd /usr/bin/lynx libncurses.so.1 => /usr/lib/libncurses.so.1.9.6 libc.so.5 => /lib/libc.so.5.2.18 ³o¬O»¡¦b§Úªº¨t²Î¤W¡AWWWÂsÄý¾¹*lynx*·|¨Ì¿àlibc.so.5 (the C library) »Plibncurses.so.1¡]²×ºÝ¾÷¿Ã¹õªº±±¨î¡^ªº¦s¦b¡CY¬Y¤äµ{¦¡¯Ê¥F¿W¥ß©Ê¡A ldd´N·|»¡¡¥statically linked¡¦©Î¬O¡¥statically linked (ELF)¡¦¡C 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*¥Dn*ªºÅܧó ¤Àªù§OÃþ¡A¦P®É³W©w*¦¸n*ªºÅܧó¬O¤£¤¹³\¥Î¨ì³oµ{¦¡®wªºÂµ{¦¡µo¥Í¤¤Â_ªº²{ ¶H¡C§A¥i¥H±qµ{¦¡®wªºÀɦW¤À¿ë¥X¥¦ªºª©¥»¡]¹ê»Ú¤W¡AÄY®æ¨ÓÁ¿¡A¹ïELF¦Ó¨¥¶È¶È ¬O¤@³õ¤Ñ¤jªºÁÀ¨¥¡FÄ~ÄòŪ±N¤U¥h¡A«K¥i©ú¥Õ¬°¤°»ò¤F¡^¡G libfoo.so.1.2ªº¥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®æ¦¡³Ì¥Dnªº®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¾úªººØºØµhW¡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 µ²¡Cn¬O§A¨S¦³³o»ò°µ¡A§A¦Û¦æ³]©wªºªFªF´N·|¦b¼Æ¤é«á³y¦¨¤d©_¦Ê©Çªº°ÝÃD¥X ²{¡C¨ì®ÉÔ¡A¥i§O»¡§Ú¨S´£¿ô§A°Ú¡I $ su # cp libfoo.so.1.0 /usr/local/lib # /sbin/ldconfig # ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so ) ª©¥»½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¥Dnªºª@¯Å·|¯}Ãa¬Û®e ©Ê¡F¦Ó¦¸nªºª@¯Å«h¥i¯à¤£·|¡F¨º»ò¥H¤U±ªº¤è¦¡¨Ó³sµ²¡A©Ò¦³ªº¤@¤Á´N³£·|¬Û ¦wµL¨Æ¤F¡C gcc -shared -Wl,-soname,libfoo.so.major -o libfoo.so.major.minor a.out---ªº®æ¦¡¡\ «Ø¥ß¦@¨Éµ{¦¡®wªº«K§Q©Ê¬Oª@¯Å¦ÜELFªº¥Dnì¦]¤§¤@¡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¥un²Ö¿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¥HP©ó³y¦¨¨ä¤¤¤@Ójump table slots·¸º¡¡C§A¥i¥H°õ ¦æ¤u¨ãµ{¦¡¡X¥Ñ2.17.tar.gz®M¥ó©Ò´£¨Ñªº¡¥getsize¡¦©R¥O¡A©w¥X©Ò¦³¶û ºÃ¥ÇªºÂܸñ¡C¥i¯à°ß¤@ªº¸Ñ¨M¤èªk¬O¡A¸Ñ°£¦¹µ{¦¡®w¥Dnªºª©¥»½s¸¹¡A±j ¢¥¦¦^¨ì¤£¬Û®eªº¦~¥N¡C ld: output file needs shared library libc.so.4 ³q±`³o¬Oµo¥Í¦b·í§A³sµ²ªºµ{¦¡®w¤£¬Olibc¡]¦pXµ{¦¡®w¡^¡A¦Ó¥B¦b©R¥O ¦C¥Î¤F-gªº°Ñ¼Æ¡A«o¨S¦³¤@¨Ö¨Ï¥Î-static¡A©Òµo¥Xªº¿ù»~°T®§¡C ¦@¨Éµ{¦¡®wªº.sa stubs³q±`¦³¤@Ó¥¼©w¸qªº²Å¸¹_NEEDS_SHRLIB_libc_4 ¡F³o¤@ÂI¥iÂÇ¥Ñlibc.sa stub¨Ó¸Ñ¨M¡AµM¦Ó¡A¥H-g¨Ó½sĶ®É¡A·|¨Ï±o³sµ² ¥Hlibg.a©Îlibc.a¨Óµ²§ô¡F¦]¦¹³oӲŸ¹¤@ª½´N¨S¦³¸Ñ¨M¡A¤]´N·|¾ÉP¤W ±ªº¿ù»~°T®§¤F¡C Á`¤§¡A¥H-gªººX¸¹½sĶ®É§O§Ñ¤F¥[¤W-static¡A¤£µM´N§O¥Î-g¨Ó³sµ²¡C³q ±`¡A¥H-g½sĶ¦UÓ¿W¥ßªºÀɮ׮ɡA©ÒÀò±oªº°£¿ù¸ê°T¤w¸g¨¬°÷¡A³sµ²®É´N ¥i¥H¤£»Ýn¥¦¤F¡C 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ªº¥Dnª©¥»¡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§An´ú¸Õ°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±`¬OP©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´yz§A·QnÅý³o¤äµ{¦¡°µ¨Ç¤°»ò»P¹ê»Ú¤W¥¦¤S°µ¤F ¨Ç¤°»ò¡C 8.2 ¨ó§Uµo®i ¦pªG§A·QnÀ°¦£µ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»¡¡An¬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·Qn½ªº»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¥un³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