The Linux GCC HOWTO Daniel Barlow v1.17, 28 February 1996 ÀÌ ¹®¼­´Â GNU C ÄÄÆÄÀÏ·¯¿Í °³¹ß ¶óÀ̺귯¸®¸¦ ¸®´ª½º »ó¿¡¼­ ¾î¶»°Ô ¼Â¾÷ÇÏ´ÂÁö¿¡ ´ëÇØ ´Ù·ç°í ÀÖ´Ù. ±×¸®°í ¸®´ª½º »ó¿¡¼­ ÄÄÆÄÀÏ, ¸µÅ·, ½ÇÇà, µð¹ö±ëÀ» ¾î¶»°Ô ÇÏ´ÂÁö¿¡ ´ëÇÏ¿© °³·«ÀûÀÎ Áö½ÄÀ» Á¦°øÇÑ´Ù. ´ëºÎºÐÀÇ ³»¿ëÀº Mitch D'Souza¾¾ÀÇ GCC-FAQ·ÎºÎÅÍ Â÷¿ëÇØ¿Â °ÍÀ̸ç (¸¹Àº ºÎºÐ ±³Ã¼Çß´Ù.) ¶ÇÇÑ ELF-HOWTO·ÎºÎÅ͵µ Â÷¿ëÀ» ÇØ¿Â °ÍÀÌ´Ù. (À̰͵µ ¶ÇÇÑ ´ëºÎºÐ ¹Ù²î°Ô µÉ °ÍÀÌ´Ù.) ÀÌ ¹®¼­´Â ù¹ø° °ø°³ ¹öÀüÀÌ´Ù. (¹öÀü ¹øÈ£´Â RCS ÀÇ Àå³­ÀÏ »ÓÀÌ´Ù.) ¿©·¯ºÐÀÇ ÀÇ°ßÀ» ȯ¿µÇÑ´Ù. 1. ½ÃÀÛÇÏ´Â ¸» 1.1. ELF vs. a.out ¸®´ª½º °³¹ßÀº Áö±Ý ÇöÀç¿¡µµ ²÷ÀÓ¾ø´Â º¯È­ °úÁ¤¿¡ ³õ¿© ÀÖ´Ù. °£´ÜÈ÷ ¸»Çؼ­, ¸®´ª½ºÀÇ Ãø¸é¿¡¼­ ¾î¶»°Ô ½ÇÇàÇØ¾ß ÇÏ´ÂÁö ¾Ë°í ÀÖ´Â ¹ÙÀ̳ʸ®´Â ¹Ù·Î ÀÌ 2 °¡Áö Á¾·ù°¡ ÀÖ´Ù. ¿©·¯ºÐÀÇ ½Ã½ºÅÛÀÌ ¾î¶»°Ô ±¸¼ºµÇ¾î ÀÖ´ÂÁö¿¡ µû¶ó µÑ ´Ù °¡Áö°í ÀÖÀ»¼öµµ ÀÖ´Ù. 2 °¡Áö¸¦ ¾î¶»°Ô ±¸º°Çϴ°¡? fileÀ̶ó°í ÇÏ´Â À¯Æ¿¸®Æ¼¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ELFÇÁ·Î±×·¥¿¡ ´ëÇؼ­´Â ELF ¶ó°í ¾î¼±¸ Àú¼±¸ ¸»ÇÒ °ÍÀ̸ç, a.out ÇÁ·Î±×·¥¿¡ ´ëÇؼ­´Â Linux/i386À̶ó´Â ´Ü¾î°¡ µé¾î°¡´Â ¸»·Î ¾ê±âÇØÁÙ °ÍÀÌ´Ù. µÑ °£ÀÇ Â÷ÀÌ´Â ¹®¼­ ÈĹݺο¡¼­ ¼³¸íµÉ °ÍÀÌ´Ù. ELF ´Â »õ·Î¿î ½ÇÇàÈ­ÀÏ Çü½ÄÀ̸ç, ÀϹÝÀûÀ¸·Î ´õ ¶Ù¾î³ª´Ù°í ¿©°ÜÁö°í ÀÖ´Ù. 1.2. Ã¥ÀÓ(Admistrata) ÀúÀ۱ǿ¡ °ü·ÃµÈ Á¤º¸´Â ÀÌ ¹®¼­ÀÇ ¸¶Áö¸·À» Âü°íÇ϶ó. ¶ÇÇÑ, ÈĹݺο¡¼­ ÀÌ ±ÛÀ» Àаí, Usenet¿¡ ¹Ùº¸°°Àº Áú¹®(Á¸ÀçÇÏÁö ¾Ê´Â GCCÀÇ ¹ö±×¸¦ ¹ßÇ¥ÇÏ´Â µî)À» ¿Ã¸®Áö ¸»¶ó´Â °æ°í¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. 2. ÇÊ¿äÇÑ °ÍÀ» ¾îµð¿¡¼­ ¾òÀ» ¼ö Àִ°¡? 2.1. Áö±Ý ÀÌ ¹®¼­ ÀÌ ¹®¼­´Â ¸®´ª½º ÇÏ¿ìÅõ ¹®¼­ ½Ã¸®ÁîÀÇ ÇϳªÀÌ´Ù. µû¶ó¼­ ¸ðµç ¸®´ª½º ÇÏ¿ìÅõ ¹®¼­°¡ ÀúÀåµÇ¾î ÀÖ´Â °÷À̶ó¸é ¾îµðµç ÀÖ´Ù. ¿¹¸¦ µé¾î¼­ ¿Í °°Àº °÷ÀÌ ¹Ù·Î ±×°÷ÀÌ´Ù. HTML ¹öÀüÀº ¿¡¼­ ãÀ» ¼ö ÀÖÀ¸¸ç ¾à°£ ¹öÀüÀÌ ³ôÀ» Áöµµ ¸ð¸¥´Ù. 2.2. ´Ù¸¥ ¹®¼­µé gcc ¿¡ ´ëÇÑ °ø½ÄÀûÀÎ ¹®¼­´Â ¼Ò½º ¹èÆ÷ È­ÀÏ¿¡ µé¾îÀÖ´Ù. texinfo È­ÀÏ, .infoÈ­ÀÏÀÇ Çü½ÄÀ¸·Î µé¾îÀÖ´Ù. ³×Æ®¿öÅ© ¼Óµµ°¡ ºü¸£´Ù°Å³ª, ½Ãµð·Ò¿¡ °¡Áö°í Àְųª, ¶Ç´Â Àγ»½ÉÀÌ ¸¹´Ù°í »ý°¢µÉ ¶§¿¡´Â ±×°ÍÀ» untar ÇÑ ÈÄ¿¡ ÇØ´ç È­ÀÏÀ» /usr/infoµð·ºÅ丮¿¡ Ä«ÇÇÇϵµ·Ï ÇÏÀÚ. ¸¸¾à ¾ø´Ù¸é tsx-11 ¿¡ °¡¼­ ÀڷḦ ã¾Æº¸ÀÚ. Ç×»ó ÃֽŠ¹öÀüÀÌ ÀÖ´Â °ÍÀº ¾Æ´Ò °ÍÀÌ´Ù. libc ¿¡ ´ëÇÑ ¹®¼­´Â 2 °¡Áö°¡ ÀÖ´Ù. GNU libc ÀÇ °æ¿ì¿¡´Â info È­ÀϵéÀ» °¡Áö°í Àִµ¥ stdio ºÎºÐÀ» »©°í´Â ¾ÆÁÖ ÀÚ¼¼È÷ ¸®´ª½º libc ¿¡ ´ëÇؼ­ ¾Ë·ÁÁÖ°í ÀÖ´Ù. ¸ÇÆäÀÌÁö µµ ±¸ÇÒ ¼ö Àִµ¥ ½Ã½ºÅÛ È£Ãâ(system call ¼½¼Ç 2), ¸¹Àº libc ÇÔ¼ö(¼½¼Ç 3)¿¡ ´ëÇØ ¾ÆÁÖ »ó¼¼È÷ ¼³¸íÇÏ°í ÀÖ´Ù. 2.3. GCC µÎ °¡Áö ´äÀÌ ÀÖ´Ù. (a) ¸®´ª½º GCC ÀÇ °ø½ÄÀûÀÎ ¹èÆ÷ÆÇÀº ¿¡¼­ ¹ÙÀ̳ʸ® ÇüÅ·Π±¸ÇÒ ¼ö ÀÖ´Ù. Áï ÀÌ¹Ì ÄÄÆÄÀϵǾî ÀÖ´Â °ÍÀ» ¸»ÇÑ´Ù. Áö±Ý ±ÛÀ» ¾²°í ÀÖ´Â ÀÌ ¼ø°£¿¡ ÃֽŠ¹öÀüÀº 2.7.2 ·Î¼­ È­ÀϸíÀº gcc-2.7.2.bin.tar.gzÀÌ´Ù. (ÆíÁýÀÚÁÖ: ÀÌ ¹®¼­ÀÇ ÀÛ¼º½Ã±â°¡ 96³âµµÀÓÀ» »ó±âÇ϶ó!) (b) FSF·ÎºÎÅÍÀÇ ÃֽŠ¼Ò½º ¹öÀüÀº GNU ÇÁ·Î±×·¥ ÀúÀå¼ÒÀÎ GNU archives ¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. ¼Ò½º ¹öÀüÀÌ Ç×»ó °ø½Ä¹èÆ÷ÆÇ ¹ÙÀ̳ʸ® ¹öÀü°ú °°Àº °ÍÀº ¾Æ´Ï´Ù. configure ½ºÅ©¸³Æ®¸¦ ÀÌ¿ëÇؼ­ ¸ðµç ¼³Á¤À» ÇÒ ¼ö ÀÖ´Ù. tsx-11 µµ ¸¶Àú »ìÆ캸µµ·Ï ÇÏÀÚ. ÆÐÄ¡È­ÀÏÀÌ ÇÊ¿äÇÒ Áöµµ ¸ð¸£±â ¶§¹®ÀÌ´Ù. ¾î¶² °ÍÀ̵ç ÄÄÆÄÀÏÀ̶ó´Â °ÍÀ» Çϱâ À§Çؼ­´Â ´ÙÀ½ÀÌ ÇÊ¿äÇÏ´Ù. 2.4. C ¶óÀ̺귯¸®¿Í Çì´õ È­ÀÏµé ¿©±â¼­ ¿©·¯ºÐ¿¡°Ô ÇÊ¿äÇÑ °ÍÀº ÀÏ´Ü (1)¿©·¯ºÐÀÇ ½Ã½ºÅÛÀÌ a.out Àΰ¡? (2) ¾Æ´Ï¸é µÑ ´Ù ÀÖ´Â °æ¿ì¿¡ µÑ Áß¿¡ ¹«¾ùÀ» ÅÃÇÏ°í ½ÍÀº°¡? ¿¡ µû¶ó ´Þ¶óÁø´Ù. ¸¸¾à ¿©·¯ºÐÀÌ libc 4 ¿¡¼­ libc 5 ·Î ¾÷±×·¹À̵åÇÏ·Á°í ÇÑ´Ù¸é ¿ì¼±Àº ELF-HOWTO¹®¼­¸¦ ºÁ¾ßÇÒ °ÍÀÌ´Ù. tsx-11 ¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. libc-5.2.18.bin.tar.gz --- ELF °øÀ¯ ¶óÀ̺귯¸® À̹ÌÁö, Á¤Àû ¶óÀ̺귯¸® ±×¸®°í C ¶óÀ̺귯¸®¿Í ¼öÇÐ ¶óÀ̺귯¸®¸¦ À§ÇÑ Çì´õÈ­Àϵé libc-5.2.18.tar.gz --- À§ ¶óÀ̺귯¸®¿¡ ´ëÇÑ ¼Ò½º. ¿©·¯ºÐÀº Çì´õ È­ÀÏÀ» ±¸ÇØ¾ß Çϱ⠶§¹®¿¡ À§¿¡ ÀÖ´Â ¹ÙÀ̳ʸ®¹èÆ÷Æǵµ ÇÊ¿äÇÏ´Ù. ¼Õ¼ö ÄÄÆÄÀÏÀ» ÇÒ °ÍÀÎÁö ¾Æ´Ï¸é ±×³É ¹ÙÀ̳ʸ®¸¦ »ç¿ëÇÒ °ÍÀÎÁö¿¡ ´ëÇÑ ´äÀº °£´ÜÇÏ´Ù. ¹ÙÀ̳ʸ®¸¦ »ç¿ëÇ϶ó! ÇÏÁö¸¸ NYS³ª ¼Îµµ¿ì Æнº¿öµå ±â´ÉÀ» ¿øÇÒ ¶§´Â ¼Õ¼ö ÄÄÆÄÀÏÇÏ´Â ¼ö ¹Û¿¡ ¾ø´Ù. libc-4.7.5.bin.tar.gz --- a.out °øÀ¯ ¶óÀ̺귯¸® À̹ÌÁö, Á¤Àû ¶óÀ̺귯¸®(C ÇÔ¼ö, ¼öÇÐ ÇÔ¼ö), À§¿¡ ÀÖ´Â libc 5 ¿Í °øÁ¸ÇÒ ¼ö ÀÖ°Ô²û µðÀÚÀεǾî ÀÖ´Ù. ÇÏÁö¸¸ ¿©·¯ºÐÀÌ a.out ÇÁ·Î±×·¥À» ¾ÆÁ÷µµ °®°í Àְųª °³¹ßÇÏ·Á°í ÇÒ ¶§¸¸ ÇÊ¿äÇÏ´Ù. 2.5. °ü·ÃµÈ µµ±¸µé (as, ld, ar, strings µîµî) tsx-11 ¿¡¼­ ±¸ÇÒ ¼ö ÀÖÀ¸¸ç, ÇöÀç ¹öÀüÀº binutils-2.6.x.x.bin.tar.gzÀÌ´Ù. ¹ÙÀ̳ʸ® À¯Æ¿¸®Æ¼µéÀº ¿À·ÎÁö ELF ¸¸ ÀÖ´Ù´Â »ç½Ç¿¡ À¯ÀÇÇÏÀÚ. ÇöÀç ¶óÀ̺귯¸®´Â ELF ·Î¸¸ °³¹ßµÇ°í ÀÖÀ¸¸ç a.out ¶óÀ̺귯¸®´Â ELF ¿Í °°ÀÌ ¾µ ¶§¸¸ ÀǹÌÀÖ´Ù°í »ý°¢ÇÑ´Ù. C ¶óÀ̺귯¸® °³¹ßÀº ELF ÂÊÀ¸·Î¸¸ ÁøÇàµÇ°í ÀÖÀ¸¸ç, a.outÀ¸·Î ÇؾßÇÒ Ä¿´Ù¶õ ÀÌÀ¯ °°Àº°Ô ¾ø´Ù¸é ±×¿¡ µû¸£´Â °ÍÀÌ ÁÁ´Ù. 3. GCC¼³Ä¡¿Í ¼³Á¤ 3.1. GCC ¹öÀü ÇöÀç »ç¿ë ÁßÀÎ gcc ÀÇ ¹öÀüÀ» ¾Ë°í ½ÍÀº °æ¿ì¿¡´Â gcc -v¶ó°í ¼Ð ÇÁ·ÒÇÁÆ®¿¡¼­ ½ÇÇà½ÃÅ°¸é µÈ´Ù. ¶ÇÇÑ ÀÌ·¸°Ô ¸í·ÉÀ» ³»¸®¸é ¿©·¯ºÐÀÇ ½Ã½ºÅÛÀÌ ELF·Î ¼¼ÆõǾî ÀÖ´ÂÁö ¾Æ´Ï¸é a.out À¸·Î µÇ¾î ÀÖ´ÂÁö È®½ÇÇÏ°Ô ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. ÇÊÀÚÀÇ ½Ã½ºÅÛ¿¡¼­´Â ´ÙÀ½°ú °°ÀÌ ³ª¿Â´Ù. $ gcc -v Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs gcc version 2.7.2 ¿©±â¼­ ¾Ë¾ÆµÎ¾î¾ß ÇÒ ÇÙ½ÉÀûÀÎ ³»¿ëÀº ´ÙÀ½°ú °°´Ù. o i486. ÀÌ´Â ¿©·¯ºÐÀÌ 486 ÇÁ·Î¼¼¼­ ¿ëÀ¸·Î ÄÄÆÄÀÏµÈ gcc¸¦ »ç¿ëÇÏ°í ÀÖ´Ù´Â ¸»ÀÌ´Ù. ÀÌ ºÎºÐÀº ´Ù¸¦ ¼ö Àִµ¥ ¾î¶² »ç¶÷Àº 386, 586 ¿¡ µû¶ó ´Ù¸¦ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ 3 °¡Áö Ĩ¿¡¼­ ÄÄÆÄÀÏµÈ °ÍµéÀº »ó°ü¾øÀÌ ¼­·Î Àß ½ÇÇàµÈ´Ù. Â÷ÀÌÁ¡À̶ó°í ÇÑ´Ù¸é 486 Äڵ尡 ¾îµð¿£°¡ ´õÇØÁüÀ¸·Î½á 486 ¿¡¼­´Â ´õ¿í ´õ »¡¸® ½ÇÇàµÈ´Ù´Â Á¤µµÀÌ´Ù. 386 ¿¡¼­ ½ÇÇàÇϴµ¥ ÇØ°¡ µÈ´Ù°Å³ª ÇÏÁö´Â ¾Ê´Â´Ù. ÇÏÁö¸¸ ¾à°£ ¹ÙÀ̳ʸ®°¡ Ä¿Áú °ÍÀÌ´Ù. o box. ÀÌ°Ç ÀüÇô Áß¿äÇÑ ºÎºÐÀÌ ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î¼­ box¶ó´Â ¸» ´ë½Å¿¡ slackware ³ª debian µîÀÇ ´Ü¾î·Î ±³Ã¼µÉ ¼öµµ ÀÖ°í ¾Æ¿¹ ÀÌ ºÎºÐÀÌ ¾øÀ» ¼öµµ ÀÖ´Ù. º¸ÅëÀº i486-linux ÀÌ·± ½ÄÀÏ °ÍÀÌ´Ù. ¸¸¾à gcc ¸¦ ÄÄÆÄÀÏÇؼ­ »ç¿ëÇÑ´Ù¸é º»ÀÎÀÌ µû·Î i486-box-linux ¶ó°í ÁöÁ¤ÇßµíÀÌ gcc¸¦ ¸¸µé ¶§ Á¤ÇØÁÙ ¼ö ÀÖ´Ù. o linux. ÀÌ ´Ü¾î ´ë½Å¿¡ linuxelf ¶óµç°¡ linuxaoutÀ̶ó´Â ´Ü¾î°¡ µé¾î°¥ ¼öµµ ÀÖ´Ù. ¶Ç´Â ¸®´ª½º Ä¿³Î ¹öÀüÀÌ µé¾î°¡µµ·Ï ÇÒ ¼öµµ ÀÖ´Ù. ¾ÏÆ° ¸®´ª½º¿ëÀÓÀ» Àß ³ªÅ¸³»°í ÀÖ´Ù. °£´ÜÈ÷ °á·ÐÀ» ¸»ÇÏÀÚ¸é, ÀÌ ´Ü¾îÀÇ ¶æÀº »ç¿ëÁßÀÎ GCC ¹öÀü¿¡ µû¶ó ´Ù¸£°Ô Çؼ®µÈ´Ù. o 2.7.0 ÀÌ»óÀÇ ¹öÀü¿¡¼­´Â ±×³É linuxÀ̸é ELF ¸¦ ÀǹÌÇÏ°í a.outÀº linuxaout °ú °°Àº À̸§À» °®´Â´Ù. o ¸®´ª½º°¡ ELF ÂÊÀ¸·Î ³ª¾Æ°¡¸é¼­ À̸§ÀÌ linux¿¡¼­ ¹Ð·Á³µ´Ù°íµµ ÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ 2.7.0 ±× ÀÌÇÏ¿¡¼­´Â linuxaout À̶ó´Â ¸»À» ã¾Æº¼ ¼ö ¾øÀ» °ÍÀÌ´Ù. o linuxelf¶ó´Â À̸§Àº »ç¶óÁø ¸»ÀÌ´Ù. gcc ¹öÀü 2.6.3 ½ÃÀý¿¡ ELF ½ÇÇàÈ­ÀÏÀ» ¸¸µé±â À§Çؼ­ Áö¾îÁ³´ø À̸§ÀÌ´Ù. gcc 2.6.3 Àº ELF ½ÇÇàÈ­ÀÏÀ» ¸¸µå´Âµ¥ ¹ö±×°¡ ÀÖ´Ù°í ¾Ë·ÁÁ® ÀÖ´Ù. ¾÷±×·¹À̵åÇϱ⠹ٶõ´Ù. o 2.7.2 ÀÌ°ÍÀº ¹öÀü ¹øÈ£ÀÌ´Ù. µû¶ó¼­ Á¾ÇÕÇغ¸¸é ÇÊÀÚ´Â Áö±Ý ELF ½ÇÇàÄڵ带 »ý¼º½ÃÅ°´Â gcc 2.7.2 ¸¦ °¡Áö°í ÀÖ´Ù´Â °ÍÀÌ´Ù. 3.2. µµ´ëü ³» gcc °¡ ¾îµð¿¡ Àִ°ǰ¡? ±×³É ¾Æ¹« »ý°¢¾øÀÌ gcc ¸¦ ¼³Ä¡Ç߰ųª ¹èÆ÷ÆÇÀ» ¼³Ä¡ÇÒ ¶§ ÀÚµ¿À¸·Î ¼³Ä¡ÇÏ°Ô Çß´Ù¸é, µµ´ëü ¸®´ª½º È­ÀÏ ½Ã½ºÅÛ »ó¿¡¼­ ¾îµð¿¡ À§Ä¡ÇÏ´ÂÁö ¾Ë°í ½ÍÀ» °ÍÀÌ´Ù. ´ë´äÀº ÀÌ·¸´Ù. o /usr/lib/gcc-lib/target/version/ (±×¸®°í ¸ðµç ÇÏÀ§ µð·ºÅ丮µé)ÀÌ ÄÄÆÄÀÏ·¯ÀÇ ´ëºÎºÐÀÌ À§Ä¡ÇÏ´Â Àå¼ÒÀÌ´Ù. ÄÄÆÄÀÏÀ» ¼öÇàÇÏ´Â ½ÇÇàÈ­ÀÏ ±× ÀÚü¿Í gcc ¹öÀü¿¡ µû¸¥ ¶óÀ̺귯¸®¿Í Çì´õÈ­ÀϵéÀÌ µé¾îÀÖ´Ù. o /usr/bin/gcc´Â ÄÄÆÄÀÏ·¯ ¿îÀü»ç(Compiler Driver)¿ªÇÒÀ» ÇÑ´Ù. Ä¿¸Çµå »ó¿¡¼­´Â gcc ¶ó°í¸¸ ¸í·ÉÇÑ´Ù. ¸¸¾à ¿©·¯ ¹öÀüÀÇ ÄÄÆÄÀÏ·¯¸¦ °¡Áö°í ÀÖ´Ù¸é ¿©·¯ ¹öÀü°ú ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Ù. gcc °¡ »ç¿ëÇÏ°Ô µÉ µðÆúÆ® ¹öÀüÀÇ ÄÄÆÄÀÏ·¯¸¦ ¾Ë¾Æ³»±â À§Çؼ­´Â gcc -v¶ó°í Çغ¸¸é µÈ´Ù. ´Ù¸¥ ¹öÀüÀ¸·Î °­Á¦·Î ÄÄÆÄÀÏÇÏ°Ô ÇÏ·Á¸é gcc -V version ÀÌ·± ½ÄÀ¸·Î »ç¿ëÇÏ¸é µÈ´Ù. ¿¹¸¦ µé¾î¼­... # 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 o /usr/target/(bin|lib|include)/. ¿©·¯ºÐÀÌ ¿©·¯ °³ÀÇ ¸ñÇ¥ Çü½ÄÀ» °¡Áö°í ÀÖ´Ù¸é (ÀÏ´Ü ELFÀΰ¡ a.out Àΰ¡ ¶Ç´Â ¿©·¯ ÇüÅÂÀÇ Å©·Î½º ÄÄÆÄÀÏ·¯ µî) µðÆúÆ® ¸ñÇ¥ Çü½Ä¿ëÀÌ ¾Æ´Ñ ¶óÀ̺귯¸®, ¹ÙÀ̳ʸ® À¯Æ¿¸®Æ¼ (as, ld µî...), Çì´õ È­Àϵ鵵 ã¾Æº¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿À·ÎÁö ÇÑ Á¾·ùÀÇ gcc ¸¦ °¡Áö°í ÀÖ´Ù ÇÏ´õ¶óµµ ¸Å¿ì ¸¹Àº °ÍµéÀÌ ±× µð·ºÅ丮¿¡ ±ò·ÁÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö ¾Ê´Ù¸é ¾Æ¸¶µµ /usr/(bin|lib|include)¿¡ ÀÖÀ» °ÍÀÌ´Ù. o /lib/,/usr/lib ±×¸®°í ¿©Å¸ ¶óÀ̺귯¸® µð·ºÅ丮µéÀÌ ±âº» ½Ã½ºÅÛÀ» À§ÇÑ ¶óÀ̺귯¸® µð·ºÅ丮ÀÌ´Ù. ¿©·¯ºÐÀº ¶ÇÇÑ »ó´çÈ÷ ¸¹Àº ÇÁ·Î±×·¥¿¡ ´ëÇÏ¿© /lib/cpp¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. (X °¡ ½ÇÁ¦·Î ¸¹ÀÌ »ç¿ëÇÏ°í ÀÖ´Ù.) /usr/lib/gcc-lib/target/version/¿¡ ÀÖ´Â cpp ¸¦ Ä«ÇÇÇسõ´ø°¡? ¾Æ´Ï¸é ½Éº¼¸¯ ¸µÅ©¸¦ ÇØÁØ´Ù. 3.3. Çì´õ È­ÀϵéÀº ¾îµð¿¡ Àִ°¡? ¿©·¯ºÐÀÌ ¼Õ¼ö /usr/local/include¿¡ ¼³Ä¡ÇÑ °Íµé »©°í ¸®´ª½º¿¡´Â 3 °¡Áö Áß¿ä Çì´õ µð·ºÅ丮°¡ ÀÖ´Ù. o ´ëºÎºÐÀÇ/usr/include/¿Í ±× ÇϺΠµð·ºÅ丮µéÀº H J Lu ÀÇ libc ¹ÙÀ̳ʸ® ¹èÆ÷ÆÇ¿¡ ÀÇÇؼ­ Á¦°øµÈ´Ù. ¿©±â¼­ º»ÀÎÀº "´ëºÎºÐ"À̶ó´Â Ç¥ÇöÀ» ½è´Âµ¥, ±× ÀÌÀ¯´Â ´Ù¸¥ ¼Ò½º (¿¹¸¦ µé¾î curses, dbm ¶óÀ̺귯¸®)¿¡¼­ ¿Â Çì´õÈ­Àϵ鵵 Àֱ⠶§¹®ÀÌ´Ù. ƯÈ÷³ª ÃÖ±Ù libc ¹èÆ÷ÆÇÀ» °¡Á®¿À¸é ±×·¯ÇÑ Çì´õÈ­ÀϵéÀº ¾ø´Ù. (¿¹Àü¿¡´Â °°ÀÌ ´Þ·Á¼­ ¿ÔÁö¸¸) o /usr/include/linux¿Í /usr/include/asm(È­ÀÏ°ú ¿¡ ÀÇÇØ ÂüÁ¶µÇ´Â Çì´õÈ­ÀϵéÀÌ ÀÖ´Â Àå¼Ò)´Â °¢°¢ Ä¿³Î ¼Ò½º¿¡¼­ linux/include/linux¿Í linux/include/asmÀ» °¡¸®Å°´Â ½Éº¼¸¯ ¸µÅ©¿©¾ß ÇÑ´Ù. ¹º°¡ Á¶±ÝÀÌ¶óµµ Å« ÀÛ¾÷À» ÇÏ·Á°í ÇÑ´Ù¸é ºÐ¸íÈ÷ ¼³Ä¡ÇØ¾ß ÇÑ´Ù. Ä¿³Î ÄÄÆÄÀÏÀ» Çϱâ À§Çؼ­¸¸ ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. ¶ÇÇÑ Ä¿³Î ¼Ò½º¸¦ Ç®°í ³ª¼­ make config¶ó´Â ÀÛ¾÷À» ÇØÁÖ¾î¾ß ÇÒ °ÍÀÌ´Ù. ¸¹Àº È­ÀϵéÀÌ ±× °úÁ¤À» ÅëÇؼ­ »ý°Ü³ª´Â ¶ó´Â È­ÀÏ¿¡ ÀÇÁ¸Çϱ⠶§¹®ÀÌ´Ù. ±×¸®°í ¾î¶² ¹öÀüÀÇ Ä¿³Î¿¡¼­´Â asm À̶ó°í ÇÏ´Â °ÍÀÌ ½Éº¼¸¯ ¸µÅ©ÀÏ »Ó, make config ÇÒ ¶§¸¸ »ý±â´Â °æ¿ì°¡ ÀÖ´Ù. asm Àº º¸Åë asm-i386À¸·Î ¸µÅ©µÇ¾î ÀÖ´Ù. ±×Àü¿¡´Â ¿À·ÎÁö ÀÎÅÚ ¸Ó½Å¿ë Çì´õÈ­Àϸ¸ÀÌ ÀÖ¾ú±â ¶§¹®¿¡ asm ¸¸ÀÌ ÀÖ¾úÁö¸¸ ÀÌÁ¦´Â ¸®´ª½º°¡ ¸í½Ç»óºÎÇÏ°Ô ¸ÖƼÇ÷§Æû ¿î¿µÃ¼Á¦·Î ³ª¾Æ°¡°í Àֱ⠶§¹®ÀÌ´Ù. asm- i386¸»°íµµ asm-alpha, asm-generic, asm-m68k, asm-mips, asm-ppc, asm-sparcµîÀÇ Çì´õ È­ÀÏ µð·ºÅ丮°¡ ÀÖ´Â °ÍÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ /usr/src/linux¶ó°í ÇÏ´Â µð·ºÅ丮¿¡ ÀÌ¹Ì ¼Ò½º¸¦ Ç®¾î³õ¾Ò´Ù¸é... $ cd /usr/src/linux $ su # make config [answer the questions. Unless you're going to go on and build the kernel it doesn't matter _too_ much what you say] # cd /usr/include # ln -s ../src/linux/include/linux . # ln -s ../src/linux/include/asm . o , , , ±×¸®°í µîÀÇ È­ÀϵéÀº ÄÄÆÄÀÏ·¯ ¹öÀü¸¶´Ù ´Ù¸¦ °ÍÀÌ´Ù. ±×¸®°í ±×µéÀº /usr/lib/gcc-lib/i486-box-linux/2.7.2/include/¿¡ À§Ä¡ÇÏ°í ÀÖ´Ù. 3.4. Å©·Î½º ÄÄÆÄÀÏ·¯(Cross Compiler) ¸¸µé±â 3.4.1. ¸ñÇ¥ Ç÷§ÆûÀ¸·Î¼­ÀÇ ¸®´ª½º ¿©·¯ºÐÀÌ Áö±Ý gcc ¼Ò½º Äڵ带 °¡Áö°í ÀÖ´Ù°í »ý°¢ÇÏ°Ú´Ù. º¸ÅëÀº GCC ¿¡ ´ëÇÑ INSTALL È­ÀÏ¿¡¼­ Áö½ÃÇÏ´Â ´ë·Î µû¸£¸é µÈ´Ù. configure --target=i486-linux --host=XXX ÀÌ·± ½ÄÀ¸·Î ÇØÁִµ¥, XXX´Â Ç÷§ÆûÀ» ¸»ÇÑ´Ù. ´ÙÀ½¿¡´Â make °úÁ¤À» °ÅÄ¡¸é µÈ´Ù. ¸®´ª½º Çì´õÈ­ÀÏ, Ä¿³Î Çì´õÈ­ÀÏÀÌ ÇÊ¿äÇϸç, Å©·Î½º ÄÄÆÄÀÏ·¯¿Í Å©·Î½º ¸µÄ¿¸¦ ¸¸µé±â À§Çؼ­µµ ÇÊ¿äÇÏ´Ù. ¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. 3.4.2. ¼Ò½º Ç÷§ÆûÀ¸·Î¼­ÀÇ ¸®´ª½º, ¸ñÇ¥ Ç÷§ÆûÀ¸·Î¼­ÀÇ MSDOS Èì. ¼Ò½º¸¦ ¸®´ª½º¿¡¼­ ÀÛ¼ºÇÑ µÚ¿¡ µµ½º¿¡¼­ µ¹¾Æ°¡´Â ÇÁ·Î±×·¥À¸·Î ÄÄÆÄÀÏÇϱâ À§Çؼ­´Â emx ÆÐÅ°Áö³ª go extender¶ó´Â °ÍÀ» ÇÊ¿ä·Î ÇÑ´Ù. ¿¡ °¡¼­ °ü·Ã È­ÀÏÀ» ã¾Æº¸±â ¹Ù¶õ´Ù. º»ÀÎÀ¸·Î¼­´Â Å×½ºÆ®Çغ» ÀûÀÌ ¾øÀ¸¸ç, ¾µ¸¸ÇÏ´Ù°í ´Ü¾ðÇϱâ´Â Èûµé´Ù. 4. Æ÷Æðú ÄÄÆÄÀϸµ 4.1. ÀÚµ¿ÀûÀ¸·Î Á¤ÀǵǴ ½Éº¼µé ¿©·¯ºÐÀº ¿©·¯ºÐÀÌ °®°í ÀÖ´Â ¹öÀüÀÇ gcc°¡ -v ¿É¼ÇÀ» ºÙÀÓÀ¸·Î½á ¾î¶°ÇÑ ½Éº¼À» ÀÚµ¿ÀûÀ¸·Î Á¤ÀÇÇÏ´ÂÁö ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î º»ÀÎÀÇ °ÍÀº ´ÙÀ½°ú °°´Ù. $ 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__ - ¸¸¾à ¿©·¯ºÐÀÇ Äڵ尡 ¸®´ª½º¿¡¸¸ °ü°èµÇ´Â ÄÚµå¶ó¸é, ´ÙÀ½°ú °°ÀÌ ÇØÁÖ´Â °ÍÀÌ ÁÁ´Ù. #ifdef __linux__ /* ... funky stuff ... */ #endif /* linux */ __linux__¶ó´Â À̸§À» »ç¿ëÇ϶ó. linux°¡ ¾Æ´Ï´Ù. ÈÄÀÚ°¡ Á¤ÀǵǾî ÀÖ±â´Â ÇÏÁö¸¸ POSIX ±Ô°Ý¿¡´Â ¸ÂÁö ¾Ê±â ¶§¹®ÀÌ´Ù. 4.2. ÄÄÆÄÀÏ·¯ ºÎ¸£±â ÄÄÆÄÀÏ·¯ ½ºÀ§Ä¡µé¿¡ ´ëÇÑ ¹®¼­´Â gcc info ÆäÀÌÁö¸¦ º¸¸é µÈ´Ù. (¿©·¯ºÐÀÌ Emacs¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é C-h i±×¸®°í ³ª¼­ gcc ¿É¼ÇÀ» ¼±ÅÃÇ϶ó) ¿©·¯ºÐÀÌ °®°í ÀÖ´Â ¹èÆ÷ÆÇÀ» ¸¸µç »ç¶÷ÀÌ gcc info ÆäÀÌÁö¸¦ ³Ö¾îÁö ¾Ê¾ÒÀ» ¼öµµ ÀÖ°í, ¶Ç´Â ¿¾ ¹öÀüÀÇ °ÍÀÌ µé¾î°¡ ÀÖÀ» ¼öµµ ÀÖ´Ù. °¡Àå ÁÁÀº ¹æ¹ýÀº ³ª ¶Ç´Â ¹Ì·¯ »çÀÌÆ®·Î °¡¼­ gcc ¼Ò½º Äڵ带 ¹Þ¾Æ¿À´Â °ÍÀÌ´Ù. ±×¸®°í ±× ¼Ò½º ¾È¿¡¼­ Ä«ÇÇÇؿ´Ù. gcc ¿¡ ´ëÇÑ ¸ÇÆäÀÌÁö(gcc.1)´Â ÀϹÝÀûÀ¸·Î ½Ã´ë¿¡ µÚ¶³¾îÁ® ÀÖ´Ù°í ¸»ÇÒ ¼ö ÀÖ´Ù. ¸ÇÆäÀÌÁö¸¦ º¸·Á°í ÇÏ¸é ±×·¯ÇÑ °æ°í ¹®±¸¸¦ º¼ ¼ö ÀÖ´Ù. 4.2.1. ÄÄÆÄÀÏ·¯ Ç÷¡±×(flag) gcc¸¦ »ç¿ëÇÒ ¶§, -On(¿©±â¼­ nÀº ÀÛÀº ¾çÀÇ Á¤¼öµé, »ý·«Çصµ µÈ´Ù)À» Ä¿¸Çµå ¶óÀÎ ¿É¼ÇÀ¸·Î ³Ö¾îÁÖ¸é Ãâ·Â Äڵ尡 ÃÖÀûÈ­µÈ´Ù. ¿©±â¼­ »ç¿ëµÇ´Â n °ª Áß¿¡¼­ ½ÇÁ¦ Àǹ̸¦ °®´Â °ªµéÀº gccÀÇ ¹öÀü¿¡ µû¶ó ´Ù¸¥µ¥, ÀϹÝÀûÀ¸·Î 0 (ÃÖÀûÈ­ÇÏÁö ¾ÊÀ½)ºÎÅÍ ½ÃÀÛÇؼ­ 2(»ó´çÈ÷ ¸¹ÀÌ ÃÖÀûÈ­), 3(¾ÆÁÖ¾ÆÁÖ ¸¹ÀÌ ÃÖÀûÈ­)±îÁö ¾²ÀδÙ. ³»ºÎÀûÀ¸·Î gcc´Â ÀÌ ¿É¼ÇÀ» -f¿Í -m À̶ó´Â ¿É¼Çµé·Î ¹Ù²Ù¾î¼­ ó¸®ÇÏ°Ô µÈ´Ù. -OÀÇ Æ¯Á¤ ·¹º§ÀÌ ¾î¶² Àǹ̸¦ °®´ÂÁö¿¡ ´ëÇؼ­´Â gcc ½ÇÇà½Ã¿¡ -v¿Í -Q(¹®¼­È­µÇÁö ¾Ê¾ÒÀ½)Ç÷¡±×¸¦ ºÙ¿©ÁÜÀ¸·Î½á È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î -O2´Â ´ÙÀ½°ú °°ÀÌ ³ªÅ¸³­´Ù. (»ç¶÷µé¸¶´Ù ¼­·Î ´Ù¸¦ ¼ö ÀÖ´Ù) 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 ¿©·¯ºÐÀÇ ÄÄÆÄÀÏ·¯°¡ Áö¿øÇÏ°í ÀÖ´Â ÃÖÀûÈ­ ·¹º§º¸´Ù Å« ¼ýÀÚ¸¦ »ç¿ëÇÑ´Ù¸é (¿¹¸¦ µé¾î -O6), ±× ÄÄÆÄÀÏ·¯°¡ Áö¿øÇÏ´Â ÃÖÀûÀÇ ·¹º§·Î ÃÖÀûÈ­½ÃÄÑÁØ´Ù. ÀÌ·± ½ÄÀ¸·Î ÄÄÆÄÀϵǵµ·Ï ¼¼ÆõǾî ÀÖ´Â Äڵ带 ¹èÆ÷ÇÏ´Â °ÍÀº º°·Î ÁÁÀº »ý°¢Àº ¾Æ´Ñ °Í °°´Ù. ´õ ¸¹Àº ÃÖÀûÈ­ ·¹º§µéÀÌ Â÷ÈÄ gcc ¹öÀü¿¡ »ý±ä´Ù¸é, À߸øÇÏ¸é ¿©·¯ºÐÀÇ ¼Ò½º Äڵ尡 ¾û¶×ÇÏ°Ô ÄÄÆÄÀϵǴ ¼öµµ ÀÖ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ Áö±Ý -O3ÀÌ ÃÖ°í ·¹º§À̶ó´Â °¡Á¤ÇÏ¿¡¼­ -O6¸¦ »ç¿ëÇß´Ù°í Ä¡ÀÚ. ÇÏÁö¸¸ ´ÙÀ½ ¹öÀü(¿¹¸¦ µé¾î¼­ 2.7.3.?)¿¡¼­ -O8±îÁö Áö¿øÇÏ°Ô µÈ´Ù¸é -O6´Â ÀüÇô ¾û¶×ÇÑ Àǹ̸¦ °¡Áú ¼öµµ ÀÖ´Ù. gcc ¹öÀü 2.7.0 ºÎÅÍ 2.7.2 ±îÁöÀÇ »ç¿ëÀÚµéÀº -O2 ÃÖÀûÈ­ Ç÷¡±×¿¡ ¹ö±×°¡ ÀÖ´Ù´Â »ç½ÇÀ» Àß ¾Ë¾ÆµÎ±â ¹Ù¶õ´Ù. Strength ReductionÀ̶ó°í ÇÏ´Â °ÍÀÌ Á¦´ë·Î ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Â ÆÐÄ¡°¡ ÀÖ°í ´Ù½Ã gcc ¸¦ ÄÄÆÄÀÏÇØ¾ß ÇÒ°ÍÀÌ´Ù. ¶Ç´Â ¾ðÁ¦³ª -fno-strength-reduce ¶ó´Â ¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏÇϱ⠹ٶõ´Ù. 4.2.1.1. ÇÁ·Î¼¼¼­º° ¿É¼Ç -O ¿É¼ÇÀ» Á־ ÀÚµ¿ÀûÀ¸·Î ÀÛµ¿ÇÏÁö ¾Ê´Â -m Ç÷¡±×µéÀÌ ÀÖ´Ù. ÇÏÁö¸¸ À̵éÀº »ó´çÈ÷ À¯¿ëÇÏ´Ù. Áß¿äÇÑ °ÍÀ¸·Î´Â -m386°ú -m486ÀÌ ÀÖ´Ù. ÀÌ Ç÷¡±×µéÀº gcc´õ·¯ °¢°¢ 386, 486Áß ¾î¶² °Í¿¡ ´õ ¸ÂÃç¼­ ÄÄÆÄÀÏÇÒ °ÍÀÎÁö¸¦ ¾Ë·ÁÁÖ´Â °ÍÀÌ´Ù. -m486À¸·Î ÄÄÆÄÀÏÇÏ¿´´Ù°í ÇÏ´õ¶óµµ 386 ¿¡¼­ ½ÇÇàµÇ´Âµ¥´Â ÁöÀå¾ø´Ù. ±×·¯´Ï °ÆÁ¤ÇÒ ÇÊ¿ä¾ø´Ù. 486 Äڵ尡 Á¶±Ý ´õ Å©Áö¸¸ 386 ¿¡¼­ ´À·ÁÁö°Å³ª ÇÏÁö´Â ¾Ê´Â´Ù. ¾ÆÁ÷±îÁö´Â -mpentiumÀ̳ª -m586°ú °°Àº °ÍÀº ¾ø´Ù. ¸®´©½º(Linus)´Â 486 ÄÚµå¿ÉƼ¸¶ÀÌÁîµÈ Äڵ带 ¾òÀ¸¸é¼­µµ ÆæƼ¾öÀÌ »ç¿ëÇÏÁö ¾Ê´Â Á¤·Ä¹æ½Ä°úÀÇ Ä¿´Ù¶õ Â÷ÀÌÁ¡ÀÌ ¾ø´Â Äڵ带 ¾ò±â À§Çؼ­´Â, -m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2¸¦ »ç¿ëÇÒ °ÍÀ» Á¦¾ÈÇÏ°í ÀÖ´Ù. Michael Meissner(Cygnus¿¡ ÀÖ´Â)´Â ´ÙÀ½°ú °°ÀÌ ¸»ÇÏ°í ÀÖ´Ù. ³» À°°¨À¸·Î´Â -mno-strength-reduce¸¦ °°ÀÌ ¾²¸é ¶ÇÇÑ x86 ¿¡¼­ ´õ ºü¸¥ Äڵ带 ¾ò¾î³¾ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. (ÁÖÀÇ! ³ª´Â Áö±Ý strength reduction ¹ö±×¿¡ ´ëÇؼ­ ¸»ÇÏ°í ÀÖ´Â °ÍÀÌ ¾Æ´Ï´Ù. ±×°ÍÀº ÀüÇô ´Ù¸¥ ¹®Á¦ÀÌ´Ù) ¿Ö³ÄÇϸé x86Àº ´Ù¼Ò ·¹Áö½ºÅÍ ¼ýÀÚ°¡ Àû±â ¶§¹®ÀÌ´Ù. (±×¸®°í ´Ù¸¥ ·¹Áö½ºÅÍ¿¡ ´ëÇÏ¿© ·¹Áö½ºÅ͵éÀ» ±×·ìÀ¸·Î ¹­¾î¼­ spill ·¹Áö½ºÅÍ ¼ÓÀ¸·Î ó¸®ÇÏ´Â GCC ÀÇ Ã³¸®¹æ½ÄÀº ÀüÇô µµ¿òÀÌ µÇÁú ¾Ê´Â´Ù) StrengthReduc­ tionÀº ÀüÇüÀûÀ¸·Î °ö¼ÀÀ» µ¡¼ÀÀ¸·Î ±³Ã¼Çϱâ À§ÇÏ¿© ´Ù¸¥ ·¹Áö½ºÅ͵éÀ» »ç¿ëÇÏ°Ô µÈ´Ù. -fcaller-saves ¶ÇÇÑ ÀÌ·± ¹®Á¦Á¡ÀÌ ÀÖÁö ¾Ê³ª »ý°¢ÇÏ°í ÀÖ´Ù. ¶Ç ´Ù¸¥ ¿¹°¨Àº ÀÌ·¸´Ù. -fomit-frame-pointer´Â µµ¿òÀÌ µÉ ¼öµµ ÀÖ°í, ±×·¸Áö ¾ÊÀ» ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. ÇÑ ÆíÀ¸·Î´Â ¶Ç ´Ù¸¥ ·¹Áö½ºÅÍ°¡ ÇÒ´ç°¡´ÉÇÏ´Ù´Â °ÍÀ» ÀǹÌÇÒ ¼öµµ ÀÖ°í, ´Ù¸¥ ÇÑ ÆíÀ¸·Î´Â x86 ÀÌ ¿¬»êÁö½Ã(instruction)¿¡ ´ëÇÏ¿© ÀÎÄÚµùÇÏ´Â ¹æ½ÄÀ¸·Î¼­, ½ºÅà »ó´ëÀû ÁÖ¼Ò°¡ ÇÁ·¹ÀÓ »ó´ëÀû ÁÖ¼Òº¸´Ùµµ ´õ ¸¹Àº °ø°£À» Â÷ÁöÇÑ´Ù´Â °ÍÀ» ÀǹÌÇϱ⵵ ÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é ÇÁ·Î±×·¥¿¡ »ç¿ëµÉ ¼ö ÀÖ´Â IcacheÀÌ ¾à°£ ÁÙ¾îµç´Ù. ¶ÇÇÑ -fomit-frame-pointer´Â ÄÄÆÄÀÏ·¯°¡ °è¼ÓÀûÀ¸·Î È£Ãâ ÈÄ¿¡µµ ½ºÅà Æ÷ÀÎÅ͸¦ Á¶Á¤ÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ¶æÇÑ´Ù. µû¶ó¼­ ÇÁ·¹ÀÓÀ» °®´Â °æ¿ì, ¸î ¹øÀÇ È£Ã⸸À¸·Îµµ ½ºÅÃÀÌ °¡µæ Â÷°Ô µÈ´Ù. ¸¶Áö¸· ¸»Àº ¸®´©½º ¶ÇÇÑ ¾ð±ÞÇÏ°í ÀÖ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ ÃÖÀûÈ­µÈ È¿À²À» ¿øÇÑ´Ù¸é, ³ª¸¦ ¹ÏÁö ¸»¶ó. ½ÇÁ¦·Î Å×½ºÆ®¸¦ ÇغÁ¾ß ÇÑ´Ù. gcc ÄÄÆÄÀÏ·¯ÀÇ ¿É¼ÇÀº Á¤¸»·Î ¸¹´Ù. ±×¸®°í ¸î °³ÀÇ Æ¯Á¤ Á¶ÇÕÀÌ °¡Àå ÁÁÀº ÃÖÀûÈ­¸¦ ÀÌ·ïÁÙ °ÍÀÌ´Ù. 4.2.2. Internal compiler error: cc1 got fatal signal 11 ½Ã±×³Î 11¹øÀº SIGSEGV, Áï ¼¼±×¸ÕÅ×ÀÌ¼Ç À§¹Ý¿¡ ´ëÇÑ ½Ã±×³ÎÀÌ´Ù. ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¥ÀÌ Æ÷ÀÎÅ͸¦ À߸ø ½è´Ù´Â ¸»À̰ųª ÀڱⰡ ¼ÒÀ¯ÇÏ°í ÀÖÁö ¾ÊÀº ¸Þ¸ð¸®¿¡´Ù ¾²±â ÀÛ¾÷À» ÇÏ·Á°í ÇÒ ¶§ ¹ß»ýÇÑ´Ù. ±×·¡¼­ ÀÌ´Â gccÀÇ ¹ö±×ÀÏ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ gcc´Â ´ëºÎºÐÀÇ ÀÛ¾÷¿¡¼­ ¸Å¿ì ¾ÈÁ¤ÀûÀÌ°í Å×½ºÆÃÀ» ¸¹ÀÌ °ÅÄ£ ¼ÒÇÁÆ®¿þ¾î¶ó´Â »ç½ÇÀ» ±â¾ïÇ϶ó. gcc´Â ¶ÇÇÑ º¹ÀâÇÑ ÀÚ·á ±¸Á¶¿Í Æ÷ÀÎÅ͸¦ ¾öû³ª°Ô ¸¹ÀÌ »ç¿ëÇÏ°í ÀÖ´Ù. °£´ÜÈ÷ ¸»ÇÏÀÚ¸é ÇöÀç±îÁö ¼ÒÇÁÆ®¿þ¾î Áß¿¡¼­ °¡Àå ¶Ù¾î³­ ·¥ Å×½ºÆà ÇÁ·Î±×·¥(RAM Tester)À̶ó°í ¸»ÇÒ ¼öµµ ÀÖ´Ù. ¸¸¾à ¸Å¹ø ÄÄÆÄÀÏÇÒ ¶§¸¶´Ù ¸ØÃß´Â À§Ä¡°¡ ´Ù¸£´Ù¸é ÀÌ´Â °ÅÀÇ ´ëºÎºÐ ¿©·¯ºÐ Çϵå¿þ¾îÀÇ ¹®Á¦¶ó°í ºÁµµ µÈ´Ù. (CPU, ¸Þ¸ð¸®, ¸¶´õº¸µå³ª ij½¬) ¿©·¯ºÐÀÇ ÄÄÇ»ÅÍ°¡ ÆÄ¿ö ¿Â üŷÀ» °ÅÃļ­ Àß ºÎÆõǾú°í ±×¸®°í À©µµ¿ìÁî °°Àº °Íµµ Àß µ¹¾Æ°£´Ù°í Çؼ­ ±×°ÍÀ» gccÀÇ ¹ö±×·Î µ¹¸®Áö´Â ¸»¶ó. ÀÌ·¯ÇÑ »ç½ÇÀº ¹«ÀǹÌÇÏ´Ù. ±×¸®°í Ä¿³Î ÄÄÆÄÀÏÇϸ鼭 make zImage¿¡¼­ ²À ¸ØÃá´Ù°í Çؼ­ gccÀÇ ¹ö±×¶ó°í ¸»ÇÒ ¼ö´Â ¾ø´Ù. make zImage´Â ¹«·Á 200°³ ÀÌ»óÀÇ È­ÀÏÀ» ÄÄÆÄÀÏÇÏ°í ÀÖ´Ù. ±×°Íº¸´Ù´Â Á» ÀÛÀº °æ¿ì¸¦ ã¾Æº¸µµ·Ï ÇÏÀÚ. ¸¸¾à °è¼ÓÀûÀ¸·Î ¹ö±×°¡ ¶È°°ÀÌ ³ªÅ¸³ª°í Àڱ׸¶ÇÑ ÇÁ·Î±×·¥ ÄÄÆÄÀÏ¿¡¼­µµ ±×·¯ÇÏ´Ù¸é, FSF¿¡´Ù°¡ ¹ö±× ¸®Æ÷Æ®¸¦ Çصµ µÇ°í, ¶Ç´Â linux-gcc ¸ÞÀϸµ ¸®½ºÆ®¿¡ ±ÛÀ» ¿Ã·Áµµ µÈ´Ù. ±×·¯±â À§Çؼ­´Â ¿ì¼± gcc ¹®¼­¸¦ Àо°í ¾î¶² ÀýÂ÷°¡ ÇÊ¿äÇÑÁö ¼÷ÁöÇÑ ´ÙÀ½ Çϱ⠹ٶõ´Ù. 4.3. Æ÷ÆÃ(Portability) ¿äÁòÀº ¸¸¾à ±× ¼ÒÇÁÆ®¿þ¾î°¡ ¸®´ª½º·Î Æ÷ÆÃµÉ ¼ö ¾ø´Ù¸é ±× ¼ÒÇÁÆ®¿þ¾î´Â °¡Ä¡°¡ ¾ø´Â ÇÁ·Î±×·¥À̶ó°í ¸»ÇÑ´Ù. :-) ÁøÁöÇÏ°Ô ¸»ÇÏÀÚ¸é, ÀϹÝÀûÀ¸·Î ¸®´ª½ºÀÇ 100% POSIX ȣȯ¼ºÀ» ÀÌ·ç±â À§Çؼ­´Â ¾ÆÁÖ ¾à°£ÀÇ ¼öÁ¤ÀÛ¾÷¸¸ÀÌ ÇÊ¿äÇÏ´Ù. ¶ÇÇÑ ´ÜÁö make ¶ó°í¸¸ ÇÏ¸é ½ÇÇàÈ­ÀÏÀÌ ¸¸µé¾îÁú ¼ö ÀÖµµ·Ï Çϱâ À§ÇÏ¿© ÄÚµåÀÇ ¿øÀúÀÚ¿¡°Ô ¼öÁ¤ Äڵ带 º¸³»´Â °ÍÀ̾߸»·Î °¡Ä¡ÀÖ´Â ÀÏÀÌ´Ù. 4.3.1. BSDisms ( bsd_ioctl , daemon ±×¸®°í ) ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥À» -I/usr/include/bsd¸¦ ³Ö¾î¼­ ÄÄÆÄÀÏÇÑ ÈÄ, -lbsd ¿É¼ÇÀ» ³Ö°í ¸µÅ©ÇÒ ¼öµµ ÀÖ´Ù. (Áï Makefile ¾È¿¡¼­ -I/usr/include/bsd¸¦ CFLAGS º¯¼ö¿¡ ³Ö°í, -lbsd¸¦ LDFLAGS¿¡ ³ÖÀ½À¸·Î½á) ÀÌÁ¨ BSD ŸÀÔÀÇ ½Ã±×³Î ÇൿÀ» ¾ò¾î³»±â À§Çؼ­ -D__USE_BSD_SIGNAL¸¦ µ¡ºÙÀÏ ÇÊ¿ä°¡ ¾ø´Ù. ¿Ö³ÄÇϸé -I/usr/include/bsd¶ó°í ÇØÁÖ°í ¸¦ ¼Ò½º ¾È¿¡¼­ Æ÷ÇÔÇÏ¸é ¸ðµç ÀÏÀÌ Á¦´ë·Î ÀÌ·ç¾îÁø´Ù. 4.3.2. ¾ø¾îÁø ½Ã±×³Îµé ( SIGBUS , SIGEMT , SIGIOT , SIGTRAP , SIGSYS µî) ¸®´ª½º´Â POSIX¸¦ ÁؼöÇÏ°í ÀÖ´Ù. ÀÌ·¯ÇÑ ½Ã±×³ÎµéÀº POSIX Á¤ÀÇ ½Ã±×³ÎµéÀÌ ¾Æ´Ï´Ù. ÀÌ´Â ISO/IEC 9945-1:1990 (IEEE Std 1003.1-1990), paragraph B.3.3.1.1 ¿¡¼­ ´ÙÀ½°ú °°ÀÌ ¸»ÇÏ°í ÀÖ´Â ¹ÙÀÌ´Ù. SIGBUS, SIGEMT, SIGIOT, SIGTRAP, ±×¸®°í SIGSYS¿Í °°Àº ½Ã±×³ÎµéÀº POSIX.1À¸·ÎºÎÅÍ Á¦¿ÜµÇ¾ú´Ù. ¿Ö³ÄÇÏ¸é ±×µéÀÇ ÇൿÀº ÇÔÃàÀûÀÌ°í ¾î¶»°Ô ºÎ¸£´À³Ä¿¡ µû¶ó ´Ù¸£±â ¶§¹®¿¡ ÀûÀýÇÏ°Ô ¹üÁÖÈ­½Ãų ¼ö°¡ ¾ø´Ù. ÀÌ·¯ÇÑ ½Ã±×³ÎµéÀ» ¾ø¾Ö¹ö¸®´Â °ÍÀÌ ±Ô¾à ÁؼöÀÏ ¼öµµ ÀÖÁö¸¸, ¿Ö ±× ½Ã±×³ÎµéÀ» Á¦¿ÜÇعö·È´ÂÁö¿¡ ´ëÇؼ­ ¹®¼­È­ÇØ¾ß ÇÑ´Ù. ±×¸®°í ±× ½Ã±×³ÎµéÀ» ¾î¶»°Ô ó¸®ÇÒ °ÍÀΰ¡¿¡ ´ëÇؼ­´Â ¾Æ¹«·± °­Á¦ ±ÔÁ¤µµ ¾ø´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Â °¡Àå °£´ÜÇÑ ¹æ¹ýÀº ÀÌ·¯ÇÑ ½Ã±×³ÎµéÀ» ¸ðµÎ SIGUNUSED·Î ÀçÁ¤ÀÇÇÏ´Â °ÍÀÌ´Ù. ¹Ù¸¥¹æ¹ýÀº ¹°·Ð ÀÌ·¯ÇÑ ½Ã±×³ÎÀ» ó¸®ÇÏ´Â ºÎºÐÀ» #ifdef ¹®ÀåÀ» ½á¼­ ó¸®Çϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù. #ifdef SIGSYS /* ... POSIX ±ÔÁ¤ÀÌ ¾Æ´Ñ SIGSYS Äڵ尡 ¿©±â¿¡ ¿Â´Ù .... */ #endif 4.3.3. K & R ÄÚµå GCC´Â ANSI ÄÄÆÄÀÏ·¯ÀÌ´Ù. ÇÏÁö¸¸ ¾ÆÁÖ ¸¹Àº ÄÚµåµéÀÌ ANSI°¡ ¾Æ´Ï´Ù. ÀÌ·² ¶§´Â ÄÄÆÄÀÏ·¯ Ç÷¡±×¿¡ -traditional À̶ó°í¸¸ ºÙ¿©ÁÖ¸é µÈ´Ù°í ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ±«·Ó°Ô ¼öÀÛ¾÷À» ÇØÁà¾ß ÇÏ´Â ºÎºÐµµ ¸¹ÀÌ ÀÖ´Ù. gcc info ÆäÀÌÁö¸¦ »ìÆ캸±â ¹Ù¶õ´Ù. -traditional¶ó´Â ¿É¼ÇÀº gcc °¡ ÀÌ¿ëÇÏ·Á°í ÇÏ´Â C ¾ð¾î ¹æ½ÄÀ» ¹Ù²Ù´Â °Í ¸»°íµµ ´Ù¸¥ È¿°ú¸¦ Áö´Ï°í ÀÖ´Ù. ¿¹¸¦ µé¾î ±× ¿É¼ÇÀº -fwritable- stringsÀ» ÀÛµ¿½ÃÅ°´Âµ¥, ¹®ÀÚ¿­ »ó¼ö¸¦ µ¥ÀÌŸ ¿µ¿ªÀ¸·Î º¸³»´Â ¿ªÇÒÀ» ÇÑ´Ù. (ÅؽºÆ® ¿µ¿ª, Áï ±×µéÀÌ ¾µ ¼ö ¾ø´Â ¿µ¿ªÀ» ¸»ÇÑ´Ù) ÀÌ·± °æ¿ì ÇÁ·Î±×·¥ÀÇ ¸Þ¸ð¸® »ç¿ëÈçÀû(footprint)ÀÌ Áõ°¡ÇÏ°Ô µÈ´Ù. 4.3.4. Àü󸮱⠽ɺ¼ÀÌ ÄÚµåÀÇ ÇÁ·ÎÅäŸÀÔ°ú Ãæµ¹ÇÒ ¶§ ¸¹ÀÌ ¹ß»ýÇÏ´Â ¹®Á¦µé Áß¿¡ Çϳª°¡ ¹Ù·Î ¸î¸î ÇÔ¼öµéÀÌ ÀÌ¹Ì ¸®´ª½º Çì´õÈ­Àϵ鿡 ¸ÅÅ©·Î·Î Á¤ÀǵǾî ÀÖ°í Àü󸮱Ⱑ ÄÚµå ³»¿¡¼­ À¯»çÇÑ ÇÁ·ÎÅäŸÀÔ¿¡ ´ëÇÏ¿© ó¸® °ÅºÎ¸¦ ÇÏ´Â °æ¿ìÀÌ´Ù. º¸Åë atoi()¿Í atol()ÀÎ °æ¿ì°¡ ¸¹´Ù. 4.3.5. sprintf() sprintf(string, fmt, ...)ÀÌ ¸¹Àº À¯´Ð½º ½Ã½ºÅÛ¿¡¼­´Â ¹®ÀÚ¿­¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÏ´Â ¹Ý¸é¿¡ ANSI¸¦ µû¸£´Â ¸®´ª½º´Â ¹®ÀÚ¿­¿¡ »ðÀÔµÈ ¹®ÀÚÀÇ °¹¼ö¸¦ ¹ÝȯÇÑ´Ù. À̴ ƯÈ÷³ª SunOS¿Í °°Àº °ÍÀ¸·ÎºÎÅÍ Æ÷ÆÃÇÏ´Â °æ¿ì¿¡ ´õ¿í ÁÖÀÇÇØ¾ß ÇÑ´Ù. 4.3.6. FD_* °°Àº °Íµé? fcntl °ú ±× ºñ½ÁÇÑ ³à¼®µé. µµ´ëü Á¤ÀǺκÐÀÌ ¾îµð¿¡ Àִ°¡? ¿¡ ÀÖ´Ù. ¸¸¾à fcntlÀ» ÀÌ¿ëÇÏ°íÀÚ ÇÑ´Ù¸é ½ÇÁ¦ ÇÁ·ÎÅäŸÀÔÀ» À§ÇÏ¿© ¶ÇÇÑ Æ÷ÇÔ½ÃÅ°°í ½ÍÀ» °ÍÀÌ´Ù. ÀϹÝÀûÀ¸·Î ¸»ÇÏÀÚ¸é ¾î¶² ÇÔ¼ö¿¡ ´ëÇÑ ¸ÇÆäÀÌÁö¸¦ º¸¸é SYNOPSYS ºÎºÐ¿¡¼­ ¾î¶² Çì´õÈ­ÀÏÀ» #include ÇؾßÇÏ´ÂÁö ÀÚ¼¼È÷ ³ªÅ¸³»ÁÖ°í ÀÖÀ¸´Ï ±×°ÍÀ» Âü°íÇϱ⠹ٶõ´Ù. 4.3.7. select() ¿¡¼­ ŸÀӾƿôÀÌ °É¸®°í ÇÁ·Î±×·¥ÀÌ °è¼Ó ±â´Ù¸®±â¸¸ ÇÑ´Ù. ¿¹Àü¿¡´Â select()¿¡ ´ëÇÑ Å¸ÀӾƿô ÆĶó¹ÌÅÍ°¡ ÀбâÀü¿ëÀ¸·Î¸¸ »ç¿ëµÇ¾ú´Ù. ±×¸®°í ±× ¶§¿¡µµ ¸ÇÆäÀÌÁö¿¡´Â ´ÙÀ½°ú °°Àº °æ°í°¡ ÀÖ¾ú´Ù. select()´Â ¾Æ¸¶µµ ÀûÀýÇÑ °÷¿¡ ÀÖ´Â ½Ã°£°ªÀ» º¯°æÇÔÀ¸·Î½á ¸¸¾à¿¡ ±×·¯ÇÑ ÀÏÀÌ ¹ß»ýÇÑ´Ù¸é ¿ø·¡ÀÇ Å¸ÀӾƿôºÎÅÍ ³²Àº ½Ã°£À» ¹ÝȯÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÌ ±â´ÉÀº Â÷±â ¹öÀü¿¡¼­³ª ±¸ÇöµÉ °ÍÀÌ´Ù. µû¶ó¼­ ŸÀÓ ¾Æ¿ô Æ÷ÀÎÅÍ°¡ select() È£Ãâ¿¡ ÀÇÇÏ¿© ¼öÁ¤µÇÁö ¾ÊÀ» °ÍÀ̶ó°í »ý°¢ÇÏ´Â °ÍÀº ¹Ù¶÷Á÷ÇÏÁö ¸øÇÏ´Ù. ¹Ù·Î ±× ³¯ÀÌ ¿Ô´Ù! ÃÖ¼ÒÇÑ ±×°ÍÀÌ ÀÌ·ç¾îÁö°í ÀÖ´Ù. select()È£Ãâ·ÎºÎÅÍ µ¹¾Æ¿Ã ¶§, ŸÀӾƿô Àμö´Â µ¥ÀÌÅÍ°¡ µµÂøÇÏÁö ¾Ê´Â´Ù¸é ±â´Ù¸®·Á°í Çß´ø ÀÜ·ù ½Ã°£À¸·Î ¼¼ÆõȴÙ. ¸¸¾à ¾Æ¹« µ¥ÀÌÅ͵µ µµÂøÇÏÁö ¾Ê¾Ò¾ú´Ù¸é ÀÌ °ªÀº 0(zero)ÀÌ µÇ¾úÀ» °ÍÀÌ´Ù. ±×¸®°í °°Àº ŸÀӾƿô ±¸Á¶Ã¼¸¦ °¡Áö°í È£ÃâÀ» ÇÏ°Ô µÇ¸é È£Ãâ Áï½Ã µÇµ¹¾Æ¿Ã °ÍÀÌ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â ŸÀӾƿô °ªÀ» ¸Å¹ø select()¸¦ È£ÃâÇÒ ¶§¸¶´Ù °ü·Ã ±¸Á¶Ã¼¿¡ Àû¾îÁÖ¾î¾ß ÇÑ´Ù. ´ÙÀ½°ú °°Àº Äڵ尡 ÀÖ´Ù¸é, struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; while (some_condition) select(n,readfds,writefds,exceptfds,&timeout); ¾Æ·¡¿Í °°ÀÌ ¹Ù²Ùµµ·Ï Ç϶ó. struct timeval timeout; while (some_condition) { timeout.tv_sec = 1; timeout.tv_usec = 0; select(n,readfds,writefds,exceptfds,&timeout); } ¸ðÀÚÀÍ(Mosaic)ÀÇ ¸î¸î ¹öÀüÀÌ ÇÑ ¶§ ÀÌ·¯ÇÑ ¹®Á¦·Î ¶°µé½âÇß¾ú´Ù. ȸÀüÇÏ´Â Áö±¸ ¾Ö´Ï¸ÅÀ̼ÇÀÇ ¼Óµµ°¡ ³×Æ®¿öÅ©¸¦ ÅëÇØ µé¾î¿À´Â ÀÚ·áÀÇ ¼Óµµ¿¡ ¹Ýºñ·¹ÇÏ´Â ÀÏÀÌ ¹ú¾îÁø °ÍÀÌ´Ù! 4.3.8. ½Ã½ºÅÛ È£ÃâÀÌ ÀÎÅÍ·´Æ®µÉ ¶§ 4.3.8.1. Áõ»ó: ÇÁ·Î±×·¥ÀÌ Ctrl+Z·Î ¼­½ºÆæµåµÇ°í ´Ù½Ã ½ÃÀÛµÇ¾î ¹ö¸°´Ù. ¶Ç´Â ´Ù¸¥ ¶§¿¡´Â Ctrl+C¿Í °°Àº ½Ã±×³ÎÀ» ¹ß»ý½ÃÅ°°í ÀÚ½Ä ÇÁ·Î¼¼½ºµéÀ» Á×Àδ٠µîµî... "interrupted system calls" ¶Ç´Â "write: unknown error" ¶Ç´Â ±×·± °Í ºñ½ÁÇÑ ¿¡·¯¸¦ ³½´Ù. 4.3.8.2. ¹®Á¦Á¡: POSIX ½Ã½ºÅÛÀº ´Ù¸¥ ±¸½Ä À¯´Ð½º üÁ¦¿¡¼­º¸´Ù ¾à°£ ´õ ¸¹ÀÌ ½Ã±×³Î¿¡ ´ëÇؼ­ üŷÀ» ÇàÇÑ´Ù. ¸®´ª½º´Â ½Ã±×³Î Çڵ鷯µé(signal handler)À» ½ÇÇà½Ãų °ÍÀÌ´Ù. o ŸÀ̸Ӱ¡ °±ï´î ¶§¸¶´Ù ºñµ¿±âÀûÀ¸·Î. o ¸ðµç ½Ã½ºÅÛ È£Ãâ ¹Ýȯ½Ã¿¡. o ±×¸®°í ´ÙÀ½°ú °°Àº ½Ã½ºÅÛ È£Ãâ µ¿¾È¿¡µµ ±×·¯ÇÏ´Ù: select(), pause(), connect(), accept(), Å͹̳Π»ó¿¡¼­ÀÇ read(), ¼ÒÄÏ, ÆÄÀÌÇÁ³ª ¶óÀÎ ÇÁ¸°ÅÍ, FIFO¿¡ ´ëÇÑ open(), PTY³ª ½Ã¸®¾ó ¶óÀÎ, Å͹̳ο¡ ´ëÇÑ ioctl(), F_SETLKW ¸í·ÉÀ» ³»¸®´Â fcntl(), wait4(), syslog(), ¸ðµç TCP ¶Ç´Â NFS ÀÛ¾÷ ´Ù¸¥ ¿î¿µÃ¼Á¦ÀÇ °æ¿ì¿¡´Â ´ÙÀ½°ú °°Àº ½Ã½ºÅÛ È£Ãâ¿¡ ´ëÇؼ­µµ üũÇÒ °ÍÀÌ´Ù. À§¿¡¼­ ¸»ÇÑ °Í ÀÌ¿Ü¿¡µµ ´ÙÀ½°ú °°Àº ½Ã½ºÅÛ È£Ãâµé: creat(), close(), getmsg(), putmsg(), msgrcv(), msgsnd(), recv(), send(), wait(), waitpid(), wait3(), tcdrain(), sigpause(), semop() ¸¸¾à ½Ã±×³Î(ÇÁ·Î±×·¥¿¡¼­ Çڵ鷯¸¦ ÀνºÅçÇÑ °æ¿ì)ÀÌ ½Ã½ºÅÛ È£Ãâ Áß¿¡ ¹ß»ýÇÑ´Ù¸é, ±×¿¡ ´ëÇÑ Çڵ鷯°¡ È£ÃâµÈ´Ù. ±×¸®°í Çڵ鷯°¡ ¹ÝȯµÇ¸é (½Ã½ºÅÛ È£Ãâ·Î), ½Ã½ºÅÛ È£ÃâÀº Áß°£¿¡ °¡·Îä±â¸¦ ´çÇß´ÂÁö »ìÆ캸°í Áï½Ã -1 °ªÀ» °¡Áö°í ¹ÝȯµÈ´Ù. ±×¸®°íerrno ¸¦ EINTR ·Î ¼¼ÆÃÇÑ´Ù. ÇÁ·Î±×·¥Àº ±×·¯ÇÑ ÀÏÀÌ ÀÖÀ» °ÍÀ̶ó°í ¿¹»óÇÏÁö ¸øÇÏ°í Á×´Â °ÍÀÌ´Ù. ¿©·¯ºÐÀº ´ÙÀ½ 2 °¡Áö ÇØ°áÃ¥ Áß¿¡ Çϳª¸¦ °í¸£¸é µÈ´Ù. (1) ¿©·¯ºÐÀÌ ¼³Ä¡ÇÑ ¸ðµç ½Ã±×³Î Çڵ鷯¿¡ ´ëÇÏ¿© SA_RESTART¸¦ sigaction Ç÷¡±×¿¡ ÷°¡ÇÑ´Ù. ´ÙÀ½°ú °°Àº °ÍÀÌ ÀÖ´Ù¸é, signal (sig_nr, my_signal_handler); ¸¦ ´ÙÀ½°ú °°ÀÌ ¹Ù²Û´Ù. 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); } ÀÌ ¹æ¹ýÀÌ ´ëºÎºÐÀÇ ½Ã½ºÅÛ È£Ãâ¿¡ Àû¿ëµÇ±â´Â ÇÏÁö¸¸, read(), write(), ioctl(), select(), pause(), connect()¿¡ ´ëÇؼ­´Â ¿©·¯ºÐ ½º½º·Î EINTR¸¦ üũÇØÁÖ¾î¾ß ÇÑ´Ù. ´ÙÀ½À» »ìÆ캸ÀÚ. (2) ¿©·¯ºÐÀÌ Á÷Á¢ ¸í½ÃÀûÀ¸·Î EINTRÀ» üũÇØÁØ´Ù. read()¸¦ »ç¿ëÇÏ´Â Äڵ尡 ¿ø·¡ ÀÌ·¸°Ô µÇ¾î ÀÖ´Ù°í Ä¡ÀÚ. 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; } } À̹ø¿¡ ÀÌ·± Äڵ尡 ÀÖ´Ù¸é, int result; result = ioctl(fd,cmd,addr); ±×°ÍÀº ¶ÇÇÑ ´ÙÀ½°ú °°ÀÌ ¹Ù²î¾î¾ß ÇÑ´Ù. int result; do { result = ioctl(fd,cmd,addr); } while ((result == -1) && (errno == EINTR)); BSD À¯´Ð½ºÀÇ ¸î¸î ¹öÀü¿¡¼­´Â ½Ã½ºÅÛ È£ÃâÀ» Àç°³ÇÏ´Â °ÍÀÌ ±âº» ÇൿÀ¸·Î µÇ¾î ÀÖ´Â °æ¿ìµµ ÀÖÀ¸¹Ç·Î ÁÖÀÇÇÏÀÚ. ½Ã½ºÅÛ È£ÃâÀÌ °¡·Îä±â¸¦ Çã¿ëÇϱâ À§Çؼ­´Â SV_INTERRUPT ¶Ç´Â SA_INTERRUPT Ç÷¡±×¸¦ »ç¿ëÇϵµ·Ï ÇÏÀÚ. 4.3.9. ¾²±â °¡´É ¹®ÀÚ¿­ (ÇÁ·Î±×·¥ÀÌ ·£´ýÇÏ°Ô ¼¼±×ÆúÆ®¸¦ ³½´Ù) GCC´Â gcc¸¦ »ç¿ëÇÏ´Â »ç¶÷µéÀÌ ¹®ÀÚ¿­ »ó¼ö¿¡ ´ëÇÏ¿© Á¤È®È÷ »ó¼ö·Î¼­ °è¼Ó »ç¿ëÇÒ °ÍÀ̶ó°í ³«°üÇÏ°í ÀÖ´Â µí ÇÏ´Ù. µû¶ó¼­ ±× ¹®ÀÚ¿­ »ó¼ö¸¦ ÇÁ·Î±×·¥ÀÇ ÅؽºÆ® ¿µ¿ª¿¡ Áý¾î³Ö´Â´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ½º¿Ò ¿µ¿ªÀ» »ç¿ëÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÇÁ·Î±×·¥ÀÇ µð½ºÅ© À̹ÌÁö·ÎºÎÅÍ ÆäÀÌÁö ÀÎ & ¾Æ¿ôÀ» ÇàÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ±×·¯¹Ç·Î ¹®ÀÚ¿­ »ó¼ö¿¡ ´ëÇÏ¿© ´Ù½Ã ¾²±â ÀÛ¾÷À» ÇÏ°Ô µÇ¸é ¼¼±×¸àÅ×ÀÌ¼Ç ÆúÆ®¸¦ ÀÏÀ¸Å°°Ô µÇ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î¼­ ¹®ÀÚ¿­ »ó¼ö¸¦ Àμö·Î ÇÏ¿© mktemp()¸¦ È£ÃâÇÏ´Â ¿¾³¯ ÇÁ·Î±×·¥µé¿¡¼­´Â ¹®Á¦°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. mktemp()´Â ÁÖ¾îÁø Àμö¿¡ ´Ù½Ã ¾²·Á°í Çϱ⠶§¹®ÀÌ´Ù. ÀÌ ¹®Á¦¸¦ °íÄ¡±â À§Çؼ­´Â (a) -fwritable-strings À̶ó´Â ¿É¼ÇÀ» Á־ ÄÄÆÄÀÏÇÑ´Ù. ÀÌ·¸°Ô ÇØÁÖ¸é gcc´Â ¹®ÀÚ¿­ »ó¼ö¸¦ µ¥ÀÌŸ ¿µ¿ª¿¡ ³Ö°Ô µÈ´Ù. ¶Ç´Â (b) ¹®Á¦°¡ µÇ´Â ºÎºÐÀ» ¼öÁ¤Çؼ­ »ó¼ö°¡ ¾Æ´Ï¶ó º¯¼ö·Î ÁÖ¾îÁö°Ô ¸¸µé°í È£Ãâ Àü¿¡ strcpy ¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ±×°÷À¸·Î Ä«ÇÇÇØÁØ´Ù. 4.3.10. ¿Ö execl() È£ÃâÀÌ ½ÇÆÐÇϴ°¡? ¿øÀÎÀº °£´ÜÇÏ´Ù. Á¦´ë·Î È£ÃâÀ» ÇÏÁö ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. execl¿¡ ´ëÇÑ Ã¹¹ø° Àμö´Â ½ÇÇàÇÏ°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ±×¸®°í µÎ¹ø°ºÎÅʹ ȣÃâÇÏ´Â ÇÁ·Î±×·¥¿¡ Àü´ÞÇÒ argv¹è¿­ÀÌ´Ù. ±â¾ïÇ϶ó! argv[0]´Â ÀüÅëÀûÀ¸·Î ¾Æ¹«·± Àμö ¾øÀÌ ½ÇÇàµÇ´õ¶óµµ ¼¼ÆÃÀÌ µÈ´Ù´Â »ç½ÇÀ»! µû¶ó¼­ ´ÙÀ½°ú °°ÀÌ Äڵ带 ½á¾ßÇÑ´Ù. execl("/bin/ls","ls",NULL); Àý´ë·Î ´ÙÀ½°ú °°ÀÌ ¾²¸é ¾ÈµÈ´Ù. execl("/bin/ls", NULL); ¾Æ¹«·± Àü´ÞÀμö ¾øÀÌ ½ÇÇà½ÃÅ°´Â °æ¿ì¿¡µµ ½ÇÇàÇü½ÄÀº ÀÚ½ÅÀÇ µ¿Àû ¶óÀ̺귯¸® ÀÇÁ¸¼ºÀ» ³ªÅ¸³¾ ¼ö ÀÖ´Â ¹æ½ÄÀ¸·Î ±¸¹®À» ¸ÂÃçÁØ ÇüŶó¾ß ÇÑ´Ù. ÃÖ¼ÒÇѵµ a.outÀÇ °æ¿ì´Â ±×·¯ÇÏ´Ù. ELF´Â Á» ´Ù¸¥ ¹æ½ÄÀ¸·Î ÀÛµ¿ÇÑ´Ù. (¸¸¾à ÀÌ·¯ÇÑ ¶óÀ̺귯¸® Á¤º¸¸¦ ¿øÇÑ´Ù¸é ¾ÆÁÖ °£´ÜÇÑ ÀÎÅÍÆäÀ̽º°¡ ÀÖ´Ù. µ¿Àû ·ÎµùDynamic Loading¿¡ ´ëÇÑ ¼½¼ÇÀ» º¸°Å³ª ldd¿¡ ´ëÇÑ ¸ÇÆäÀÌÁö¸¦ Âü°íÇ϶ó) 5. µð¹ö±ë°ú Profiling 5.1. ¿¹¹æÀûÀÎ °ü¸®(lint) ¹®Á¦°¡ ¹ß»ýÇÏ°í ³ª¼­ ÇØ°áÇÏ´Â °Íº¸´Ù´Â ¹®Á¦¸¦ ¹Ì¿¬¿¡ ¹æÁöÇÏ´Â °ÍÀÌ Áß¿äÇÏÁö ¾ÊÀ»±î? ¸®´ª½º¿¡ ³Î¸® ¾²ÀÌ´Â lint´Â ¾ø´Ù. ¾Æ¸¶µµ ´ëºÎºÐÀÇ »ç¶÷µéÀÌ gcc°¡ ³»³õ´Â ÀÚ¼¼ÇÑ °æ°í ¸Þ¼¼Áö¿¡ ¸¸Á·ÇÏ°í Àֱ⠶§¹®ÀÎ °Í °°´Ù. ¾Æ¸¶µµ °¡Àå À¯¿ëÇϾ²ÀÌ´Â °ÍÀº -Wall ½ºÀ§Ä¡ÀÏ °ÍÀÌ´Ù. ÀÌ°ÍÀÌ ÀǹÌÇÏ´Â ¹Ù´Â "Warnings, all"·Î¼­ ¸ðµç °æ°í ¸Þ¼¼Áö¸¦ ¹ß»ý½ÃÅ°¶ó´Â ¸»ÀÌ´Ù. ¶ÇÇÑ ¾ÆÁÖ ÀÚ¼¼ÇÏ°Ô ³ª¿Â´Ù. Public Domain lint´Â ¿¡¼­ ¾òÀ» ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¾ó¸¶³ª ±¦ÂúÀºÁö º»ÀÎÀº ¸ð¸¥´Ù. 5.2. µð¹ö±ë 5.2.1. ¾î¶»°Ô Çϸé ÇÁ·Î±×·¥ÀÇ µð¹ö±ë Á¤º¸¸¦ ¾Ë¾Æ³¾ ¼ö Àִ°¡? ±×·¯±â À§Çؼ­´Â -g ¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏ/¸µÅ©ÇØ¾ß ÇÑ´Ù. ±×¸®°í -fomit- frame-pointer ½ºÀ§Ä¡´Â »©ÁÖ¾î¾ß ÇÑ´Ù. »ç½Ç ¸ðµç ºÎºÐÀ» ´Ù½Ã ÄÄÆÄÀÏÇÒ ÇÊ¿ä´Â ¾ø°í, ¿©·¯ºÐÀÌ °ü½É °®°í ÀÖ´Â ºÎºÐ¸¸À» ±×·¸°Ô ÇØÁÖ¸é µÈ´Ù. a.out¿¡ À־ °øÀ¯¶óÀ̺귯¸®°¡ ¸¸¾à -fomit-frame-pointer ½ºÀ§Ä¡¸¦ °¡Áö°í ÄÄÆÄÀϵǾú´Ù¸é gdb¸¦ »ç¿ëÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. -g ¿É¼ÇÀ» ÁÖ´Â ÀÌÀ¯´Â ¹Ù·Î Á¤Àû ¸µÅ©¸¦ ÇàÇ϶ó´Â ¸»À» ÇÔÃàÇÏ°Ô µÈ´Ù. ¸¸¾à ¸µÄ¿°¡ libg.a¸¦ ãÀ» ¼ö ¾ø´Ù°í Çϸ鼭 ½ÇÆÐÇÏ°Ô µÈ´Ù¸é, ¿©·¯ºÐÀÌ /usr/lib/libg.aÀ» °®°í ÀÖÁö ¾Ê±â ¶§¹®ÀÏ °ÍÀÌ´Ù. ±× È­ÀÏÀº Ưº°ÇÑ ¶óÀ̺귯¸®·Î¼­ µð¹ö±ë °¡´É C ¶óÀ̺귯¸®ÀÌ´Ù. libc ÆÐÅ°Áö¿¡ Æ÷ÇԵǾî Àְųª ¶Ç´Â libc ¼Ò½º Äڵ带 ¹Þ¾Æ¼­ ÄÄÆÄÀÏÇÏ¸é »ý±ä´Ù. ½ÇÁ¦·Î ±×·¸°Ô ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï°í ´ëÃæ /usr/lib/libc.a¸¦ /usr/lib/libg.a·Î ¸µÅ©½ÃÄѹö·Áµµ ´ëºÎºÐ »ó°ü¾øÀ» °ÍÀÌ´Ù. 5.2.1.1. µð¹ö±ë Á¤º¸¸¦ ¾î¶»°Ô ÇÏ¸é ´Ù½Ã ²¨³¾ ¼ö Àִ°¡? ¾ÆÁÖ ¸¹Àº GNU ¼ÒÇÁÆ®¿þ¾îµéÀº -g ¿É¼ÇÀ» °¡Áö°í ÄÄÆÄÀϵǾî ÀÖÀ¸¹Ç·Î È­ÀÏ Å©±â°¡ ¸Å¿ì Å©´Ù. (Á¾Á¾ Á¤Àû ¸µÅ©µÇ¾î ÀÖÀ½) ±×·¸°Ô ±¦ÂúÀº »ý°¢ÀÎ °Í °°Áö´Â ¾Ê´Ù. ¸¸¾à ÇÁ·Î±×·¥ÀÌ autoconf¿¡ ÀÇÇØ ¸¸µé¾îÁø configure¸¦ °¡Áö°í ÀÖ´Ù¸é, º¸ÅëÀÇ °æ¿ì MakefileÀ» °Çµå¸²À¸·Î½á µð¹ö±ë Á¤º¸¸¦ ³ÖÁö ¾Ê°Ô ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ELF¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é, ÇÁ·Î±×·¥Àº -g ¼¼Æðú´Â »ó°ü¾øÀÌ µ¿Àû ¸µÅ©µÇ¸ç, ±×³É ½±°Ô strip(µð¹ö±ë Á¤º¸¸¦ ½ÇÇàÈ­ÀÏ¿¡¼­ »©¹ö¸®´Â ÇàÀ§)½Ãų ¼ö ÀÖ´Ù. 5.2.2. °ü·Ã ¼ÒÇÁÆ®¿þ¾î ´ëºÎºÐÀÇ »ç¶÷µéÀº gdb¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. gdb´Â GNU archive sites ¿¡¼­ ¼Ò½ºÀÇ ÇüÅ·Î, ¾Æ´Ï¸é tsx-11 À̳ª ¼±»çÀÌÆ®¿¡¼­ ¹ÙÀ̳ʸ®ÀÇ ÇüÅ·Π±¸ÇÒ ¼ö ÀÖ´Ù. xxgdb´Â gdb¿¡ ±âÃÊÇÑ X À©µµ¿ì µð¹ö°ÅÀÌ´Ù. Áï, ¿ì¼±ÀûÀ¸·Î gdb¸¦ ÀÌ¹Ì ¼³Ä¡Çß¾î¾ß ÇÑ´Ù´Â ¶æÀÌ´Ù. ±× ¼Ò½º´Â ¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. ¶ÇÇÑ UPS µð¹ö°Å°¡ Rick Sladkey¾¾¿¡ ÀÇÇØ Æ÷ÆõǾú´Ù. X À©µµ¿ì¿¡¼­µµ Àß µ¹¾Æ°£´Ù. ÇÏÁö¸¸ xxgdb¿Í °°ÀÌ ÅؽºÆ® µð¹ö°ÅÀÎ gdb°°Àº °Í¿¡ ÀÇÁ¸ÇÏ´Â ÇüÅ´ ¾Æ´Ï´Ù. ¾ÆÁÖ ÈǸ¢ÇÑ ±â´ÉµéÀ» ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. µû¶ó¼­ ¿©·¯ºÐÀÌ µð¹ö±ë¿¡ ¸¹Àº ½Ã°£À» ÇÒ¾ÖÇÏ°í ÀÖ´Ù¸é, ¿ì¼±ÀûÀ¸·Î UPS µð¹ö°Å¸¦ ±ÇÇÑ´Ù. ¸®´ª½º¿ëÀ¸·Î ÄÄÆÄÀÏµÈ ¹ÙÀ̳ʸ®³ª ¼Ò½º ÆÐÄ¡È­ÀÏÀº ¿¡¼­ ±¸ÇÒ ¼ö ÀÖ°í ¿À¸®Áö³Î ¼Ò½º´Â ¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. µð¹ö±ë¿¡ ¾²ÀÌ´Â ¶Ç ´Ù¸¥ Åø Çϳª¸¦ µéÀÚ¸é strace¸¦ µé ¼ö ÀÖ´Ù. strace´Â ÇÁ·Î±×·¥ÀÌ ¸¸µé¾î³»´Â ½Ã½ºÅÛ È£ÃâÀ» È­¸é¿¡ Ç¥½ÃÇØÁØ´Ù. ÀÌ°Í ¸»°íµµ ´Ù¹æ¸éÀ¸·Î »ç¿ë°¡´ÉÇѵ¥, ¿¹¸¦ µé¾î ¾î¶°ÇÑ Æнº¸íÀÌ ¼Ò½ºÄڵ带 °®°í ÀÖÁö ¾ÊÀº ¹ÙÀ̳ʸ® È­ÀÏ ¾È¿¡ ÄÄÆÄÀÏµÇ¾î µé¾î°¡ÀÖ´ÂÁö, ºÐ¸íÈ÷ ¹ÙÀ̳ʸ® ¾È¿¡ µé¾îÀÖ´Â Á¶°ÇµéÀ» ¹ß°ßÇÏ°íÀÚ ÇÒ ¶§, ÀϹÝÀûÀ¸·Î ÀϹÝÀûÀ¸·Î ¾î¶»°Ô ÀÛµ¿ÇÏ°í ÀÖ´ÂÁö¸¦ ¾Ë¾Æ³»°íÀÚ ÇÒ ¶§ »ç¿ëÇÑ´Ù. ÃֽŠstrace ¹öÀü(ÇöÀç 3.0.8)Àº ¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. 5.2.3. ¹é±×¶ó¿îµå (µ¥¸ó) ÇÁ·Î±×·¥ µ¥¸ó ÇÁ·Î±×·¥µéÀº ÀüÇüÀûÀ¸·Î fork()¸¦ ¸ÕÀú ÇÏ°í ³ª¼­, ºÎ¸ð ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃÄÑ ¹ö¸°´Ù. ÀÌ´Â µð¹ö±ë ¼¼¼Ç¿¡ ´ëÇÏ¿© °ø°ÝÀûÀÎ ¿ä¼ÒÀÓÀÌ ºÐ¸íÇÏ´Ù. ÀÌ·² ¶§ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº fork¿¡ ´ëÇÏ¿© Á¤ÁöÁ¡(breakpoint)À» ÁöÁ¤ÇØÁÖ´Â °ÍÀÌ°í ÇÁ·Î±×·¥ÀÌ ¸ØÃß¸é ´Ù½Ã±Ý ±×°ÍÀ» 0 À¸·Î ¸¸µé¾îÁÖ´Â °ÍÀÌ´Ù. (gdb) list 1 #include 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 } 5.2.4. ÄÚ¾î È­ÀÏ(Core file) º¸Åë ¸®´ª½º ºÎÆýÿ¡ ÄÚ¾î È­ÀÏÀ» ¸¸µéÁö ¾Êµµ·Ï ¼¼ÆõǾî ÀÖ´Ù. ÇÏÁö¸¸ ÄÚ¾îÈ­ÀÏ »ý¼ºÀ» °¡´ÉÄÉ ÇÏ·Á°í ÇÑ´Ù¸é ±×°ÍÀ» ´Ù½Ã °¡´ÉÄÉ ÇÏ´Â ¼ÐÀÇ ³»Àå ¸í·ÉÀ» »ç¿ëÇÑ´Ù. ¼Ð ȣȯ ¼Ð(¿¹. tcsh)À» ¾²°í ÀÖ´Ù¸é ´ÙÀ½°ú °°ÀÌ ¸í·ÉÀ» ³»¸°´Ù. % limit core unlimited ¸¸¾à º»¼Ð·ù(sh, bash, zsh, pdksh)¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é, $ ulimit -c unlimited ¸¸¾à ÄÚ¾î È­ÀÏÀÇ À̸§¿¡ ´ëÇÏ¿© À¶Å뼺À» °¡Áö°í ½Í´Ù¸é, Ä¿³Î ¼Ò½º¸¦ ¾à°£¸¸ º¯°æÇØÁÖ¸é µÈ´Ù. ÀÚ, fs/binfmt_aout.c¿Í fs/binfmt_elf.c¿Í °°Àº È­ÀÏÀ» ã¾Æº¸ÀÚ. memcpy(corefile,"core.",5); #if 0 memcpy(corefile+5,current->comm,sizeof(current->comm)); #else corefile[4] = '\0'; #endif grep °°Àº °ÍÀ» °¡Áö°í ÀÌ·± ºÎºÐÀ» ¸ðµÎ ãÀº ÈÄ¿¡ 0À̶ó°í µÇ¾î ÀÖ´Â °ÍÀ» 1À̶ó°í ¸ðµÎ °íÃÄÁØ´Ù. 5.3. Profiling ProfilingÀ̶ó°í ÇÏ´Â °ÍÀº ÇÁ·Î±×·¥ÀÇ ¾î¶² ºÎºÐÀÌ Á¦ÀÏ ÀÚÁÖ È£ÃâµÇ°í ÀÖ´ÂÁö ¶Ç´Â ¸¹Àº ½Ã°£À» ¼Ò¿äÇÏ°í ÀÖ´ÂÁö¸¦ Á¶»çÇÏ´Â °ÍÀÌ´Ù. Äڵ带 ÃÖÀûÈ­½ÃÅ°°í ½Ã°£ÀÌ °¡Àå ¸¹ÀÌ ¼ÒºñµÇ´Â °÷À» °íÃÄÁÖ´Â ÁÁÀº ¹æ¹ýÀÌ´Ù. ÀÌ·¸°Ô Çϱâ À§Çؼ­´Â -p ¿É¼ÇÀ» Á־ ½Ã°£ Á¤º¸¸¦ ¿ÀºêÁ§Æ® È­ÀϵéÀÌ °¡Áú ¼ö ÀÖµµ·Ï ´Ù½Ã ÄÄÆÄÀÏÇØÁÖ¾î¾ß ÇÑ´Ù. ¶ÇÇÑ binutil ÆÐÅ°Áö¿¡ ÀÖ´Â gprof ¶ó´Â °ÍÀ» ÇÊ¿ä·Î ÇÑ´Ù. ÀÚ¼¼ÇÑ »çÇ×Àº gprof ¸ÇÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù. 6. ¸µÅ© ȣȯµÇÁö ¾Ê´Â µÎ °³ÀÇ ¹ÙÀ̳ʸ® Çü½Ä, Á¤Àû ¶óÀ̺귯¸®¿Í µ¿Àû ¶óÀ̺귯¸®ÀÇ ±¸ºÐ, ÄÄÆÄÀÏ °úÁ¤ ÈÄ¿¡ ÀϾ´Â ÀÛ¾÷°ú ÀÌ¹Ì ÄÄÆÄÀÏÀ» ¸¶Ä£ ½ÇÇà ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¶§ ÀϾ´Â ÀÛ¾÷ µÑ ´Ù¿¡ ´ëÇÏ¿© "¸µÅ©"¶ó´Â °°Àº ¸»À» »ç¿ëÇÏ¿© »ý±â´Â È¥¶õÇÔ(»ç½ÇÀº ·Îµå(load)ÇÑ´Ù¶ó´Â ¸»¿¡ ´ëÇÑ °úºÎÇ϶ó°í ¸»ÇÒ ¼öµµ ÀÖ´Ù), ÀÌ·± ¸ðµç °Í¿¡ ´ëÇÏ¿© ´Ù·ç¹Ç·Î À̹ø ¼½¼ÇÀº Á» º¹ÀâÇÒ °ÍÀÌ´Ù. ¸»¸¸ ¾î·Á¿ï »ÓÀ̹ǷΠũ°Ô °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÀÌ·¯ÇÑ È¥¶õÀ» ¿ÏÈ­Çϱâ À§Çؼ­, ¿ì¸®´Â ½ÇÇà½Ã(runtime)¿¡ ÀϾ´Â ÀÏ¿¡ ´ëÇÏ¿© µ¿Àû ·Îµù(Dynamic Loading)À̶ó´Â ´Ü¾î¸¦ »ç¿ëÇÏ°Ú´Ù. ±×¸®°í ´ÙÀ½ ¼½¼Ç¿¡ °¡¼­ ´Ù·ç°íÀÚ ÇÑ´Ù. ¶Ç´Â µ¿Àû ¸µÅ·(Dynamic Linking)À̶ó´Â ´Ü¾î·Î Ç¥ÇöµÇ±âµµ ÇÑ´Ù. À̹ø ¼½¼Ç¿¡¼­´Â ¿À·ÎÁö ÄÄÆÄÀÏ °úÁ¤ ¹Ù·Î Á÷ÈÄ¿¡ »ý±â´Â ¸µÅ©¶ó´Â ÀÛ¾÷¿¡ ´ëÇؼ­¸¸ ´Ù·ç±â·Î ÇÑ´Ù. 6.1. Á¤Àû ¶óÀ̺귯¸® vs °øÀ¯ ¶óÀ̺귯¸® ÇÁ·Î±×·¥À» ¸¸µå´Â ¸¶Áö¸· ÀÛ¾÷ÀÌ ¹Ù·Î ¸µÅ©(Link)¶ó´Â °úÁ¤ÀÌ´Ù. ÇÊ¿äÇÑ Á¶°¢µéÀ» ¸ðµÎ ¸ðÀ¸°Å³ª ¾î¶² ºÎºÐÀÌ ºüÁ® ÀÖ´ÂÁö ¾Ë¾Æº¸±â À§ÇÑ °úÁ¤ÀÌ´Ù. ºÐ¸íÈ÷ ÇÁ·Î±×·¥µéÀº ÇؾßÇÒ ÀÏÀÌ ¸¹´Ù. ÀÌ ¸ðµç °ÍÀ» ÀÏÀÏÀÌ ´Ù Â¥ÁÖ´Â °ÍÀº ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î È­ÀÏÀ» ¿¬´ÙµçÁö ÇÏ´Â ÀÏÀε¥ ±×·¯ÇÑ ÀϵéÀº ÀÌ¹Ì ¿©·¯ºÐ¿¡°Ô ¶óÀ̺귯¸®¶ó´Â ÇüÅ·ΠÁÖ¾îÁ® ÀÖ´Ù. Æò¹üÇÑ ¸®´ª½º ½Ã½ºÅÛ¿¡¼­´Â /lib¿Í /usr/lib/¿¡¼­ ±×·¯ÇÑ ¶óÀ̺귯¸®µéÀ» ãÀ» ¼ö ÀÖ´Ù. Á¤Àû ¶óÀ̺귯¸®(Static Library)¸¦ »ç¿ëÇÒ ¶§, ¸µÄ¿´Â ÇÁ·Î±×·¥ÀÌ ÇÊ¿ä·Î ÇÏ´Â ºÎºÐÀ» ¶óÀ̺귯¸®¿¡¼­ ã¾Æ¼­ ±×³É ½ÇÇàÈ­ÀÏ¿¡´Ù Ä«ÇÇÇعö¸°´Ù. °øÀ¯ ¶óÀ̺귯¸®(¶Ç´Â µ¿Àû ¶óÀ̺귯¸®)ÀÇ °æ¿ì¿¡´Â ÀÌ·¸°Ô ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ½ÇÇàÈ­ÀÏ¿¡´Ù°¡ ´ÜÁö "½ÇÇàµÉ ¶§ ¿ì¼± ÀÌ ¶óÀ̺귯¸®¸¦ ·Îµù½Ãų °Í"À̶ó´Â ¸Þ¼¼Áö¸¸À» ³²°Ü³õ´Â´Ù. ´ç¿¬È÷ °øÀ¯ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¸é ½ÇÇàÈ­ÀÏÀÇ Å©±â°¡ ÀÛ¾ÆÁø´Ù. ±×µéÀº ¸Þ¸ð¸®µµ ¶ÇÇÑ Àû°Ô Â÷ÁöÇϸç, ÇÏµå µð½ºÅ©ÀÇ ¿ë·®µµ Àû°Ô Â÷ÁöÇÑ´Ù. ¸®´ª½ºÀÇ ±âº» ÇൿÀº ÀÏ´Ü °øÀ¯ ¶óÀ̺귯¸®°¡ ÀÖÀ¸¸é ±×°Í°ú ¸µÅ©¸¦ ½ÃÅ°°í, ±×·¸Áö ¾ÊÀ¸¸é Á¤Àû ¶óÀ̺귯¸®¸¦ °¡Áö°í ¸µÅ© ÀÛ¾÷À» ÇÑ´Ù. °øÀ¯ ¶óÀ̺귯¸®¸¦ ¾´ ½ÇÇàÈ­ÀÏÀ» ¾ò°íÀÚ Çߴµ¥, ¿ì¿¬Âú°Ô Á¤Àû ½ÇÇàÈ­ÀÏÀÌ ¸¸µé¾îÁ³´Ù¸é ¿ì¼± °øÀ¯ ¶óÀ̺귯¸®°¡ Á¦´ë·Î ÀÖ´ÂÁö(a.outÀº *.sa, ELF´Â *.so)»ìÆ캸°í Àбâ Æ۹̼ÇÀÌ ÁÖ¾îÁ® ÀÖ´ÂÁö ¾Ë¾Æº»´Ù. ¸®´ª½º¿¡¼­ Á¤Àû ¶óÀ̺귯¸®´Â libname.a °ú °°Àº ½ÄÀÇ À̸§À» °®´Â´Ù. ±×¿¡ ºñÇØ °øÀ¯ ¶óÀ̺귯¸®´Â libname.so.x.y.z ¶ó´Â ½ÄÀÇ À̸§À» °®´Âµ¥ x.y.z´Â ¹öÀüÀ» ¶æÇÑ´Ù. ¶ÇÇÑ °øÀ¯ ¶óÀ̺귯¸®´Â Á¾Á¾ ¸µÅ©µÇ¾î ÀÖ´Ù. (¾ÆÁÖ Áß¿ä) libname.so.x ±×¸®°í libname.so¶ó´Â ½ÄÀÇ ¸µÅ©¸¦ °®´Â´Ù. Ç¥ÁØ ¶óÀ̺귯¸®µéÀº ÀÌ µÑÀ» ¸ðµÎ °¡Áö°í ÀÖ´Ù. ¿©·¯ºÐÀº ldd¶ó´Â °ÍÀ» »ç¿ëÇÔÀ¸·Î½á ƯÁ¤ ÇÁ·Î±×·¥ÀÌ ¾î¶² °øÀ¯ ¶óÀ̺귯¸®¸¦ ¿øÇÏ´ÂÁö ¾Ë ¼ö ÀÖ´Ù. (ldd = List Dynamic Dependencies) $ ldd /usr/bin/lynx libncurses.so.1 => /usr/lib/libncurses.so.1.9.6 libc.so.5 => /lib/libc.so.5.2.18 À§ °á°ú´Â º»ÀÎÀÇ ½Ã½ºÅÛ¿¡¼­ ÅؽºÆ®¿ë À¥ ºê¶ó¿ìÁ®·Î »ç¿ëÇÏ°í ÀÖ´Â lynx ¶ó´Â ÇÁ·Î±×·¥¿¡ ´ëÇÏ¿© ÀÇÁ¸¼º üũ¸¦ Çغ» °á°úÀÌ´Ù. libc.so.5 (C ¶óÀ̺귯¸®)¿Í libncurses.so.1 (Å͹̳ΠÁ¦¾î¿¡ »ç¿ëµÇ´Â ¶óÀ̺귯¸®)¸¦ ÇÊ¿ä·Î ÇÏ°í ÀÖ´Ù°í Ãâ·ÂÇÏ°í ÀÖ´Ù. ¾Æ¹«·± °øÀ¯ ¶óÀ̺귯¸®µµ ÇÊ¿ä¾øÀ¸¸é ±×³É `statically linked' ¶Ç´Â `statically linked (ELF)' ¶ó°í¸¸ Ãâ·ÂÇÑ´Ù. 6.2. ¶óÀ̺귯¸® µé¿©´Ùº¸±â (µµ´ëü sin() Àº ¾îµð¿¡ µé¾îÀִ°¡?) nm libraryname À̶ó°í ½ÇÇà½ÃÅ°¸é ¶óÀ̺귯¸® ³»ÀÇ ¸ðµç ½Éº¼À» Ãâ·ÂÇØÁØ´Ù. ÀÌ´Â °øÀ¯ ¶óÀ̺귯¸®¿Í Á¤Àû ¶óÀ̺귯¸® µÑ ´Ù Àû¿ëµÈ´Ù. ¸¸¾à tcgetattr()À̶ó´Â ÇÔ¼ö¸¦ ã°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇØÁÖ¸é µÈ´Ù. $ nm libncurses.so.1 |grep tcget U tcgetattr U°¡ ¶æÇÏ´Â ¹Ù´Â "undefined" Áï ncurses ¶óÀ̺귯¸®°¡ »ç¿ëÇÏ°í´Â ÀÖÁö¸¸ ¾ÆÁ÷ Á¤ÀÇ´Â ÇÏÁö ¾Ê°í ÀÖ´Ù´Â ¶æÀÌ´Ù. ÀÌ·¸°Ôµµ ÇÒ ¼ö ÀÖ´Ù. $ nm libc.so.5 | grep tcget 00010fe8 T __tcgetattr 00010fe8 W tcgetattr 00068718 T tcgetpgrp `W'´Â "weak" Áï ½Éº¼ÀÌ Á¤ÀÇ´Â µÇ¾îÀÖÀ¸³ª ´Ù¸¥ ¶óÀ̺귯¸®¿¡ ÀÇÇØ ÀçÁ¤ÀÇµÉ ¼ö ÀÖ´Â ÇüŶó´Â ÀǹÌÀÌ´Ù. ÀϹÝÀûÀ¸·Î Á¤»óÀûÀÎ °æ¿ì¿¡´Â `T'¶ó°í ¾º¿©Áø´Ù. sin()ÀÌ ¾îµð¿¡ Àִ°¡¶ó´Â Áú¹®¿¡ ´ëÇÑ °¡Àå ªÀº ´äÀº libm.(so|a)ÀÌ´Ù. ¿¡ Á¤ÀǵǾî ÀÖ´Â ¸ðµç ÇÔ¼öµéÀº ¹Ù·Î ÀÌ ¼öÇÐ ¶óÀ̺귯¸®¿¡ µé¾îÀÖ´Ù. ±×°ÍÀ» »ç¿ëÇϱâ À§Çؼ­´Â ¸µÅ©½Ã¿¡ -lm ¿É¼ÇÀ» ÁÖ¾î¾ß ÇÑ´Ù. using any of them. 6.3. È­ÀÏ Ã£±â ld: Output file requires shared library `libfoo.so.1` ÄÄÆÄÀÏÀ» ÇÏ´Ùº¸¸é À§¿Í °°Àº ¸Þ¼¼Áö°¡ Á¾Á¾ ³ª¿À´Â °ÍÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ld ±×¸®°í À¯»çÇÑ ÇÁ·Î±×·¥µéÀÌ È­ÀÏÀ» ã´Â ¹æ½ÄÀº ¹öÀü¿¡ µû¶ó ´Ù¸£Áö¸¸ ±âº»ÀûÀ¸·Î /usr/lib¸¦ ã°Ô µÈ´Ù. ÀÌ °÷ ¸»°íµµ ´Ù¸¥ °÷¿¡ ¶óÀ̺귯¸®¸¦ °¡Áö°í ÀÖ°í ±×°ÍÀ» ld ¿¡°Ô ¾Ë·ÁÁÖ±â À§Çؼ­´Â gcc ³ª ld ¿¡°Ô ¶óÀ̺귯¸®°¡ ÀÕ´Â µð·ºÅ丮¸¦ -L ¿É¼ÇÀ» Á༭ ¾Ë¸°´Ù. -L ¿É¼ÇÀ» Á־ ¾ÈµÈ´Ù¸é, ld °¡ ¿øÇÏ´Â È­ÀÏÀÌ ÀûÀýÇÑ Àå¼Ò¿¡ °¡ ÀÖ´ÂÁö È®ÀÎÇغ¸¶ó. a.out ¿¡ ´ëÇؼ­´Â -lfoo ¶ó°í Çϸé ld´Â libfoo.sa (°øÀ¯ ¶óÀ̺귯¸®)¸¦ ã°Ô µÈ´Ù. ¸¸¾à ±×°ÍÀ» ã´Âµ¥ ½ÇÆÐÇϸé libfoo.a (Á¤Àû ¶óÀ̺귯¸®)¶ó´Â È­ÀÏÀ» ã´Â´Ù. ELF¿¡ ÇÑÇؼ­´Â libfoo.so¸¦ ã°í ³ª¼­ libfoo.a¸¦ ã´Â´Ù. libfoo.so´Â libfoo.so.x¿¡ ´ëÇÑ ¸µÅ©ÀÌ´Ù. 6.4. ¿©·¯ºÐ¸¸ÀÇ ¶óÀ̺귯¸® ¸¸µé±â 6.4.1. ¹öÀü °ü¸® ´Ù¸¥ ¸ðµç ÇÁ·Î±×·¥°ú ¸¶Âù°¡Áö·Î ¶óÀ̺귯¸® ¶ÇÇÑ °è¼ÓÀûÀ¸·Î ¹ö±×¸¦ Àâ¾Æ°¡¾ß ÇÑ´Ù. ¶Ç´Â »õ·Î¿î ±â´ÉÀ» µµÀÔÇϰųª ÇöÀç ÀÖ´Â °ÍÀ» ´õ È¿À²ÀûÀÎ °ÍÀ¸·Î ±³Ã¼ÇÑ´ÙµçÁö ±×¸®°í ÇÊ¿ä¾ø´Â °ÍÀº ¾ø¾Ö¹ö¸°´ÙµçÁö ÇÏ´Â ÀÏÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ·± °æ¿ì º¯È­ÇÏ´Â ¶óÀ̺귯¸®¸¦ °¡Áö°í ÇÁ·Î±×·¡¹ÖÇÏ´Â °ÍÀº ¹®Á¦°¡ ¾Æ´Ò ¼ö ¾ø´Ù. ¸¸¾à »ç¶óÁ®¹ö¸° ¿¾ ±â´É¿¡ ÀÇÁ¸ÇÏ´Â ÇÁ·Î±×·¥À̶ó¸é? ±×·¡¼­ ¿ì¸®´Â ¶óÀ̺귯¸® ¹öÀüÀ̶ó°í ÇÏ´Â °ÍÀ» µµÀÔÇÑ´Ù. ±×¸®°í ¶óÀ̺귯¸®ÀÇ º¯È­¸¦ ¸¶ÀÌ³Ê ¶Ç´Â ¸ÞÀÌÀú º¯È­ ÀÌ·¸°Ô ºÐ·ùÇÏ°í ¸¶ÀÌ³Ê ¾÷±×·¹À̵å´Â ±âÁ¸ÀÇ ÇÁ·Î±×·¥µé°ú Ãæµ¹ÀÌ ¾ø´Â º¯È­¸¦ ÁöĪÇÏ°Ô ÇÑ´Ù. ¶óÀ̺귯¸®ÀÇ ¹öÀüÀº È­ÀϸíÀ» º¸¸é ¾Ë ¼ö ÀÖ´Ù. (»ç½Ç ¾ö¹ÐÈ÷ ¸»ÇÏÀÚ¸é, ELF¿¡ ´ëÇؼ­´Â °ÅÁþ¸»ÀÌ´Ù. ¿Ö ±×·¯ÇÑÁö´Â °è¼Ó Àо¸é ³ª¿Ã °ÍÀÌ´Ù) libfoo.so.1.2´Â ¸ÞÀÌÀú ¹öÀü 1 ÀÌ°í ¸¶ÀÌ³Ê ¹öÀü2 ÀÌ´Ù. ¸¶ÀÌ³Ê ¹öÀüµµ ´Ù¼Ò Áß¿äÇÑ °ÍÀÌ µÉ ¼öµµ ÀÖ´Ù. libcÀÇ °æ¿ì¿¡´Â ¸¶À̳ʹöÀü¿¡´Ù ÆÐÄ¡·¹º§À» Áý¾î³Ö´Â´Ù. µû¶ó¼­ libc.so.5.2.18°ú °°Àº À̸§ÀÌ »ý±ä´Ù. ¼ýÀÚ ¸»°íµµ ¹®ÀÚ, ¾ð´õ½ºÄھÀÚ(_), ¶Ç´Â ÇÁ¸°Æ® °¡´ÉÇÑ ¹®ÀÚ¸¦ ³Ö¾îµµ ÁÁ´Ù. ELF¿Í a.out Çü½ÄÀÇ Ä¿´Ù¶õ Â÷ÀÌÁ¡ Áß¿¡ Çϳª°¡ ¹Ù·Î °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µå´Â ¹æ½Ä¿¡ ÀÖ´Ù. ¿ì¼±Àº ELF¸¦ ¾Ë¾Æº¸±â·Î ÇÏÀÚ. ¿Ö³ÄÇÏ¸é ´õ ½±±â ¶§¹®ÀÌ´Ù. 6.4.2. ELF? µµ´ëü ±×°Ô ¹«¾ùÀΰ¡? ELF (Executable and Linking Format)À̶ó°í ÇÏ´Â °ÍÀº ¿ø·¡ USL(UNIX System Laboratories)¶ó°í ÇÏ´Â °÷¿¡¼­ °³¹ßÇÑ ¹ÙÀ̳ʸ® Çü½ÄÀÌ´Ù. ±×¸®°í ÇöÀç´Â ¼Ö¶ó¸®½º¿Í SVR4¿¡¼­ »ç¿ë ÁßÀÌ´Ù. ¸®´ª½º°¡ »ç¿ëÇØ¿Ô´ø ¿À·¡µÈ a.outº¸´Ù ´õ¿í ´õ ÁÁÀº À¯¿¬¼º ¶§¹®¿¡ GCC¿Í C ¶óÀ̺귯¸® °³¹ßÀÚµéÀº Áö³­ ÇØ ¸®´ª½º Ç¥ÁØ ¹ÙÀ̳ʸ® Çü½Ä°ú ¸¶Âù°¡Áö·Î ELF·Î À̵¿Çϱâ·Î °áÁ¤ÇÏ¿´´Ù. 6.4.2.1. ´Ù½Ã ÇÑ ¹ø ´õ? À̹ø ¼½¼ÇÀº '/news-archives/comp.sys.sun.misc' ¹®¼­·ÎºÎÅÍ ³ª¿À´Â ³»¿ëÀÌ´Ù. ELF ("Executable Linking Format)¶ó°í ÇÏ´Â °ÍÀº "»õ·Ó°í Çâ»óµÈ" ¿ÀºêÁ§Æ® È­ÀÏ Çü½ÄÀ¸·Î¼­ SVR4 ¿¡ µµÀԵǾú´Ù. ELF´Â ±×³É COFF ¹æ½Äº¸´Ù ´õ¿í °­·ÂÇÏ´Ù. ¿Ö³ÄÇÏ¸é »ç¿ëÀÚ È®À强ÀÌ Àֱ⠶§¹®ÀÌ´Ù. ELF´Â ¿ÀºêÁ§Æ® È­ÀÏÀ» ÀÓÀÇÀÇ ±æÀ̸¦ °®´Â ¼½¼ÇµéÀÇ ¸®½ºÆ®¶ó°í¸¸ »ý°¢ÇÑ´Ù. ±×°ÍÀº °íÁ¤µÈ Å©±âÀÇ °´Ã¼À» °®´Â ¹è¿­°ú´Â ´Ù¸£´Ù. ÀÌ·¯ÇÑ ¼½¼ÇÀº COFF¿Í´Â ´Þ¸® ƯÁ¤ À§Ä¡¿¡ ÀÖÀ» ÇÊ¿äµµ ¾ø°í, ¶ÇÇÑ Æ¯¼öÇÑ ¼ø¼­´ë·Î ³õ¿©ÀÖÀ» ÇÊ¿äµµ ¾ø´Ù. »ç¿ëÀÚµéÀº ¿øÇÑ´Ù¸é »õ·Î¿î ¼½¼ÇÀ» ÷°¡ÇÒ ¼ö ÀÖ´Ù. ELF´Â ¶ÇÇÑ DWARF(Debugging With Attribute Record For­ mat)¶ó°í ÇÏ´Â ¾ÆÁÖ ¾ÆÁÖ °­·ÂÇÑ µð¹ö±ë Æ÷¸ËÀ» °¡Áö°í ÀÖ´Ù. - ¸®´ª½º¿¡¼­´Â ¾ÆÁ÷ ¿Ïº®È÷ ±¸ÇöµÇ°í ÀÖÁö´Â ¾Ê´Ù. ÇÏÁö¸¸ ÀÛ¾÷ÀÌ ÁøÇà ÁßÀÌ´Ù DWARF DIEµé(¶Ç´Â Debugging Information Entries) ELF ¿¡¼­ .debug ¼½¼ÇÀ» Çü¼ºÇÑ´Ù. °íÁ¤µÈ Å©±âÀÇ ÀÛÀº Á¤º¸µé ´ë½Å¿¡ DWARF DIEµéÀº °¢°¢ ÀÓÀÇÀÇ ±æÀ̸¦ °®´Â º¹ÀâÇÑ ¼Ó¼ºµéÀ» Æ÷ÇÔÇÏ°í ÀÖÀ¸¸ç ¿µ¿ªº°·Î ÇÁ·Î±×·¥ µ¥ÀÌŸÀÇ Æ®¸®±¸Á¶·Î¾º¿©Á® ÀÖ´Ù. DIE´Â COFF .debug ¼½¼Çº¸´Ù ¸¹Àº ¾çÀÇ Á¤º¸¸¦ Àâ¾Æ³¾ ¼ö ÀÖ´Ù.(COFFÀÇ °æ¿ì¿¡´Â C++ °è½Â ±×·¡ÇÁ¿Í °°Àº °ÍµéÀ» Àâ¾Æ³¾ ¼ö ¾ø´Ù.) ELF È­ÀϵéÀº SVR4(¼Ö¶ó¸®½º 2.0 ?)ÀÇ ELF Á¢±Ù ¶óÀ̺귯¸®¸¦ ÅëÇؼ­ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ±× ¶óÀ̺귯¸®´Â ELF¿¡ ´ëÇÏ¿© ½±°í ºü¸¥ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÏ°í ÀÖ´Ù. ELF Á¢±Ù ¶óÀ̺귯¸®¸¦ ¾²¸é¼­ »ý±â´Â Áß¿äÇÑ ÀÕÁ¡ÁßÀÇ Çϳª´Â ELF È­ÀÏÀ» À¯´Ð½º È­ÀϷμ­ º¼ ÇÊ¿ä°¡ ÀüÇô ¾ø´Ù´Â °ÍÀÌ´Ù. ±×°ÍÀº ´ÜÁö Elf * ·Î¼­ Á¢±Ù°¡´ÉÇÏ´Ù. elf_open() È£ÃâÀ» ÇÏ¸é ±× ´ÙÀ½ºÎÅÍ °¡´ÉÇÏ´Ù. ±× ÈÄ¿¡ elf_foobar()¿Í °°Àº ÀÛ¾÷À» ÇÑ´Ù. ÀÌ´Â ¿¹ÀüÀÇ COFF ¹æ½Ä¿¡¼­ ½ÇÁ¦ µð½ºÅ© »óÀÇ À̹ÌÁö¸¦ °¡Áö°í ÀÛ¾÷Çß´ø °Í°ú´Â ÀüÇô ´Ù¸¥ °ÍÀÌ´Ù. ELF¿¡ ´ëÇÑ Âù¼º/¹Ý´ë, ±×¸®°í ÇöÀçÀÇ a.out ½Ã½ºÅÛÀ» ELF Áö¿ø ½Ã½ºÅÛÀ¸·Î ¾÷±×·¹À̵åÇØ¾ß ÇÒ Çʿ伺µéÀº ELFÇÏ¿ìÅõ ¹®¼­¿¡¼­ ´Ù·ç°í ÀÖÀ¸¸ç º»ÀÎÀº ±×°ÍÀ» ¿©±â¿¡ Àû°íÀÚ ÇÏÁö´Â ¾Ê´Â´Ù. 6.4.2.2. ELF °øÀ¯ ¶óÀ̺귯¸® libfoo.so¶ó´Â °øÀ¯ ¶óÀ̺ñ¸£·¯¸¦ ¸¸µé±â À§ÇÑ ±âº»ÀûÀÎ ÀýÂ÷´Â ´ÙÀ½°ú °°´Ù. $ 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 ÀÌ·¸°Ô Çϸé libfoo.so.1.0À̶ó´Â °øÀ¯ ¶óÀ̺귯¸®°¡ ¸¸µé¾îÁú °ÍÀÌ´Ù. ±×¸®°í ld (libfoo.so ÇÊ¿ä)¿Í µ¿Àû ¸µÄ¿(libfoo.so.1 ÇÊ¿ä)¿¡ ÇÊ¿äÇÑ ÀûÀýÇÑ ¸µÅ©°¡ ¸¸µé¾îÁø´Ù. ±×°ÍÀ» Å×½ºÆ®Çغ¸±â À§Çؼ­ ¿ì¸®´Â LD_LIBRARY_PATH¿¡´Ù ÇöÀç µð·ºÅ丮¸¦ ÷°¡ÇÑ´Ù. ¸¸¾à ¶óÀ̺귯¸®°¡ Á¦´ë·Î ÀÛµ¿ÇÑ´Ù´Â °ÍÀ» È®ÀÎÇϸé, ±× ¶óÀ̺귯¸®¸¦ /usr/local/lib·Î À̵¿½ÃŲ´Ù. ±×¸®°í ´Ù½Ã ¸µÅ©¸¦ ¸¸µé¾îÁØ´Ù. libfoo.so.1·ÎºÎÅÍ libfoo.so.1.0¿¡ À̸£´Â ¸µÅ©´Â ldconfig¶ó°í ÇÏ´Â ÇÁ·Î±×·¥¿¡ ÀÇÇØ Ç×»ó ÃֽŠÁ¤º¸·Î °ü¸®µÈ´Ù. º¸ÅëÀº ºÎÆðúÁ¤¿¡¼­ ¾Ë¾Æ¼­ ÇØÁØ´Ù. ÇÏÁö¸¸ libfoo.so´Â ¼öµ¿À¸·Î ÇØÁÖ¾î¾ß ÇÑ´Ù. ¿©·¯ºÐÀÌ Çѹø¿¡ ÇÑ ¶óÀ̺귯¸®ÀÇ ¸ðµç ºÎºÐµé(¿¹¸¦ µé¾î Çì´õÈ­Àϵµ ÇØ´ç) ²Ä²ÄÈ÷ ¾÷±×·¹À̵åÇØÁÖ·Á°í ÇÑ´Ù¸é libfoo.so -> libfoo.so.1À̶ó´Â ¸µÅ©¸¦ ¸¸µé¾î ÁÖ¸é µÈ´Ù. ±×·¸°Ô µÇ¸é ldconfig°¡ ¾Ë¾Æ¼­ ¸µÅ©¸¦ °ü¸®ÇØÁØ´Ù. ¸¸¾à¿¡ ÀÌ·± °Í±îÁö ¸ðµÎ ¿©·¯ºÐ ½º½º·Î ¸ðµÎ ÇàÇÏ·Á°í ÇÑ´Ù¸é ³ªÁß¿¡ ¹®Á¦°¡ »ý±æ ¼öµµ ÀÖ´Ù. ºÐ¸íÈ÷ ¸»Çصξú´Ù. $ su # cp libfoo.so.1.0 /usr/local/lib # /sbin/ldconfig # ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so ) 6.4.2.3. ¹öÀü ¹øÈ£ ºÙÀ̱â, soname ±×¸®°í ½Éº¼¸¯ ¸µÅ© °¢ ¶óÀ̺귯¸®´Â sonameÀ̶ó´Â °ÍÀ» °¡Áö°í ÀÖ´Ù. ¸µÄ¿°¡ ã°í ÀÖ´Â ¶óÀ̺귯¸® ¾È¿¡¼­ ÀÌ·¯ÇÑ À̸§À» ¹ß°ßÇÏ°Ô µÇ¸é, ½ÇÁ¦ È­Àϸí(libfoo.so¿Í °°Àº À̸§)ÀÌ ¾Æ´Ï¶ó sonameÀ̶ó°í ÇÏ´Â °ÍÀ» ½ÇÇà ¹ÙÀ̳ʸ®¿¡ Ç¥½ÃÇصдÙ. ½ÇÇà½Ã¿¡´Â µ¿Àû ·Î´õ°¡ sonameÀ» °®´Â È­ÀÏÀ» ã°Ô µÈ´Ù. ÀÌ ¿ª½Ã È­ÀϸíÀÌ ¾Æ´Ï´Ù. ÀÌ´Â ¹«¾ùÀ» ÀǹÌÇϴ°¡? Çϸé libfoo.so È­ÀϸíÀ» °¡Áø ¶óÀ̺귯¸®´Â libbar.so¶ó´Â sonameÀ» °¡Áú ¼öµµ ÀÖ°í ±×°÷¿¡ ¸µÅ©µÈ ¸ðµç ÇÁ·Î±×·¥Àº °á±¹ libbar.so¸¦ ã´Â´Ù´Â °ÍÀÌ´Ù. ÀÌ°ÍÀº »ó´çÈ÷ ¹«ÀǹÌÇÑ ±â´Éó·³ º¸À̴µ¥ »ç½ÇÀº ÀÌ°ÍÀ̾߸»·Î °°Àº ¶óÀ̺귯¸®ÀÇ ¼­·Î ´Ù¸¥ ¹öÀüÀÌ ¾î¶»°Ô ÇÑ ½Ã½ºÅÛ¿¡¼­ °øÁ¸ÇÒ ¼ö Àִ°¡¸¦ ÀÌÇØÇϴµ¥ ÀÖ¾î ÇÙ½ÉÀûÀÎ ºÎºÐÀÌ´Ù. ¸®´ª½º¿¡¼­ ¶óÀ̺귯¸® À̸§Áþ´Â »ç½Ç»óÀÇ Ç¥ÁØÀº ¶óÀ̺귯¸®¸¦ libfoo.so.1.2 ÀÌ·± ½ÄÀ¸·Î ºÎ¸£°í libfoo.so.1À̶ó´Â sonameÀ» ºÎ¿©ÇÏ´Â °ÍÀÌ´Ù. ¸¸¾à Ç¥ÁØ ¶óÀ̺귯¸® µð·ºÅ丮(¿¹¸¦ µé¾î/usr/lib)¿¡ Ãß°¡µÇ¸é ldconfig´Â libfoo.so.1 -> libfoo.so.1.2¶ó´Â ¸µÅ©¸¦ ¸¸µé¾î ÁÙ °ÍÀÌ´Ù. ±×·¸°Ô ÇÔÀ¸·Î½á ½ÇÇà½Ã¿¡ ÀûÀýÇÑ À̹ÌÁö°¡ ¼±Åõǵµ·Ï ÇØÁØ´Ù. ¿©·¯ºÐÀº ¶ÇÇÑ libfoo.so -> libfoo.so.1À̶ó´Â ½Éº¼¸¯ ¸µÅ©µµ ÇÊ¿äÇÏ´Ù. ¿Ö³ÄÇϸé ld °¡ ¸µÅ©ÇÒ ¶§ Á¤È®ÇÑ soname À» ã°Ô Çϱâ À§Çؼ­ÀÌ´Ù. µû¶ó¼­ ¶óÀ̺귯¸®ÀÇ ¹ö±×¸¦ °íÄ¥ ¶§ ¶Ç´Â »õ·Î¿î ±â´ÉÀ» ÷°¡ÇÒ ¶§(±âÁ¸ÀÇ ÇÁ·Î±×·¥¿¡ ¾Ç¿µÇâÀ» ÁÖÁö ¾Ê´Â º¯È­µé), ´Ù½Ã ¶óÀ̺귯¸®¸¦ ¸¸µé°í °°Àº sonameÀ» ÁÖ°í È­ÀϸíÀº ¹Ù²Ùµµ·Ï ÇÑ´Ù. ¸¸¾à ¿©·¯ºÐÀÇ ¶óÀ̺귯¸®¿Í ¸µÅ©µÇ¾î ÀÖ´Â ±âÁ¸ÀÇ ÇÁ·Î±×·¥µé°ú Ãæµ¹ÇÏ°Ô µÇ´Â ¶óÀ̺귯¸®·Î º¯È­ÇÒ ¶§´Â sonameÀÇ ¼ýÀÚ¸¦ Çϳª ´Ã¸®¸é µÈ´Ù. ÀÌ·¯ÇÑ °æ¿ì »õ·Î¿î ¹öÀüÀÇ ¶óÀ̺귯¸®´Â libfoo.so.2.0ÀÌ µÉÅ×°í, sonameÀº libfoo.so.2°¡ µÉ °ÍÀÌ´Ù. ±×¸®°í À̹ø¿¡´Â libfoo.so¸¦ »õ·Î¿î ¹öÀüÀÇ ¶óÀ̺귯ÀÌ¿¡ ½Éº¼¸¯ ¸µÅ©½ÃÅ°µµ·Ï ÇÏÀÚ. ¿©·¯ºÐÀÌ ²À ÀÌ·± ½ÄÀ¸·Î ¶óÀ̺귯¸® À̸§À» Áö¾îÁÙ ÇÊ¿ä´Â ¾ø´Ù. ÇÏÁö¸¸ ±×°ÍÀº ±¦ÂúÀº °ü½ÀÀÌ´Ù. ELF´Â ¿©·¯ºÐ¿¡°Ô ¶óÀ̺귯¸® À̸§Áþ±â¿¡ ÀÖ¾î À¯¿¬¼ºÀ» ÁÖ°í ÀÖÁö¸¸ ±×·¸´Ù°í Çؼ­ ²À ±×·¸°Ô¸¸ Ç϶ó´Â °ÍÀº ¾Æ´Ï´Ù. ¿ä¾àÇÏÀÚ¸é, ¿©·¯ºÐÀÌ È£È¯¼ºÀ» ±ú´Â °ÍÀÌ ¸ÞÀÌÀú ¾÷±×·¹À̵åÀÌ°í ±×·¸Áö ¾ÊÀº °ÍÀÌ ¸¶ÀÌ³Ê ¾÷±×·¹À̵å¶ó´Â ÀüÅëÀ» ÁؼöÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ Ç϶ó. gcc -shared -Wl,-soname,libfoo.so.major -o libfoo.so.major.minor ¸ðµç °ÍÀÌ Á¦´ë·Î µÉ °ÍÀÌ´Ù. 6.4.3. a.out ÀüÅëÀûÀÎ Çü½Ä °øÀ¯ ¶óÀ̺귯¸® ¸¸µé±âÀÇ ¿ëÀÌÇÔÀº ELF·ÎÀÇ ¾÷±×·¹À̵忡 ´ëÇÑ Áß¿äÇÑ ÀÌÀ¯ÀÌ´Ù. a.outÀ¸·Î °¡´ÉÇϱâ´Â ÇÏ´Ù. ¸¦ ¹Þ¾Æ¿ÀÀÚ. ±×¸®°í ±× È­ÀÏÀ» Ç®¾î¼­ ³ª¿À´Â 20 ÆäÀÌÁöÂ¥¸® ¹®¼­¸¦ Àо´Ù. ³²µé¿¡°Ô »·È÷ º¸ÀÌ´Â ¿­¼ºÁöÁöÀÚ°¡ µÇ°í ½ÍÁö´Â ¾Ê´Ù. ÇÏÁö¸¸ ³ª´Â ³ª ÀÚ½ÅÀ» ±ÍÂú°Ô ÇÏ°í ½ÍÁö´Â ¾Ê´Ù. :-) 6.4.3.1. ZMAGIC vs QMAGIC QMAGIC À̶ó°í ÇÏ´Â °ÍÀº ¿¹ÀüÀÇ a.out(ZMAGIC À̶ó°í ¾Ë·ÁÁ® ÀÖ´Ù)°ú ¸¶Âù°¡Áö·Î ½ÇÇà È­ÀÏÀÇ Çü½ÄÀÌ´Ù. ÇÏÁö¸¸ ù¹ø° ÆäÀÌÁö´Â ¸ÅÇÎÇÏÁö ¾Ê´Â ¹ÙÀ̳ʸ®ÀÌ´Ù. 0-4096 ±îÁö ¾î¶°ÇÑ ¸ÅÇεµ Á¸ÀçÇÏÁö ¾Ê±â ¶§¹®¿¡ ÀÌ·¸°Ô ÇÔÀ¸·Î½á NULL µð·¹ÆÛ·±½Ã Æ®·¡ÇÎ(deference trapping)À» ¾ÆÁÖ ½±°Ô ÇÒ ¼ö ÀÖ´Ù. ºÎÂ÷ÀûÀÎ È¿°ú·Î¼­ ¿©·¯ºÐÀÇ ½ÇÇàÈ­ÀÏÀº ¾à 1K Á¤µµ ÀÛ¾ÆÁö°Ô µÈ´Ù. ±¸½Ä ¸µÄ¿µéÀº ¿À·ÎÁö ZMAGIC ¸¸À» Áö¿øÇÑ´Ù. ¾à°£ ´ú ±¸½ÄÀÇ ¸µÄ¿µéÀº µÑ ´Ù Áö¿øÇϸé, ÃֽŠ¹öÀüµéÀº ¿À·ÎÁö QMAGIC ¸¸À» Áö¿øÇÏ°í ÀÖ´Ù. ÀÌ°ÍÀº º°·Î Áß¿äÇÏÁö ¾Ê´Ù. ¿Ö³ÄÇϸé Ä¿³Î ÀÚü°¡ µÎ °¡Áö¸¦ ¸ðµÎ ½ÇÇà½Ãų ¼ö Àֱ⠶§¹®ÀÌ´Ù. file ¸í·ÉÀ» ÁÖ¸é ±×°ÍÀÌ QMAGICÀÎÁö ÆǺ°ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. 6.4.3.2. È­ÀÏ À§Ä¡(File Placement) a.out(DLL) °øÀ¯ ¶óÀ̺귯¸®´Â 2 °³ÀÇ ½ÇÁ¦ÀûÀÎ È­ÀÏ ±×¸®°í ÇϳªÀÇ ¸µÅ©·Î ±¸¼º µÇ¾î ÀÖ´Ù. ÀÌ ¹®¼­ Àüü¸¦ ÅëÇؼ­ °è¼Ó »ç¿ëÇØ¿Â À̸§ÀÎ foo ¶ó´Â ¶óÀ̺귯¸®¿¡ ´ëÇÏ¿© ¿¹¸¦ µé¾î ¾Ë¾Æº¸ÀÚ. foo ¿¡ ´ëÇÏ¿© libfoo.sa, libfoo.so.1.2 ±×¸®°í libfoo.so.1 À̶ó´Â ¸µÅ©·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ¸µÅ©´Â libfoo.so.1.2¸¦ °¡¸®Å²´Ù. ÀÌ°Íµé ¸ðµÎ ¹«¾ùÀΰ¡? ÄÄÆÄÀÏÇÒ ¶§ ld´Â libfoo.sa¸¦ ã´Â´Ù. ÀÌ°ÍÀ̾߸»·Î ¶óÀ̺귯¸®¿¡ ´ëÇÑ ±×·çÅͱâ È­ÀÏÀÌ µÈ´Ù. ±×¸®°í ¸µÅ©°úÁ¤¿¡ ´ëÇÑ ¸ðµç ¿ÜºÎ µ¥ÀÌŸ¿Í ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Áö´Ï°í ÀÖ´Ù. ÇÏÁö¸¸ ½ÇÇà½Ã¿¡´Â µ¿Àû ·Î´õ°¡ libfoo.so.1À» ã´Â´Ù. ÀÌ´Â ½ÇÁ¦ È­ÀÏÀÌ ¾Æ´Ï¶ó ½Éº¼¸¯ ¸µÅ©ÀÌ´Ù. ±× ÀÌÀ¯´Â ¾Õ¼­¿Í ¸¶Âù°¡Áö·Î ¶óÀ̺귯¸®°¡ ±âÁ¸ÀÇ ¾îÇø®ÄÉÀ̼ǰúÀÇ Ãæµ¹¾øÀÌ, ´õ »õ·Î¿î, ¹ö±×°¡ ÀâÈù »õ·Î¿î ¹öÀüÀ¸·Î ±³Ã¼µÉ ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ­ÀÌ´Ù. »õ·Î¿î ¹öÀüÀÌ ³ª¿À¸é(¿¹¸¦ µé¾î libfoo.so.1.3)À̶ó°í ÇÏÀÚ. ldconfig¸¦ ½ÇÇà½ÃÅ°¸é ÀÚµ¿À¸·Î libfoo.so.1 --> libfoo.so.1.3 ¸µÅ© ÀÛ¾÷À» ÇØ ÁÙ °ÍÀÌ´Ù. ±¸¹öÀüÀ» ¾²´Â ÇÁ·Î±×·¥µµ ¾Æ¹« ÀÌ»óÀÌ ¾øÀ» °ÍÀÌ´Ù. DLL ¶óÀ̺귯¸®(µ¿¾î¹Ýº¹À̶ó´Â »ç½ÇÀº ¾Ë°í ÀÖ´Ù. ¿ªÀÚ ÁÖ :DLL ¿¡ ÀÌ¹Ì ¶óÀ̺귯¸®¶ó´Â ¸»ÀÌ µé¾îÀÖ´Ù)´Â Á¾Á¾ Á¤Àû ¶óÀ̺귯¸®º¸´Ù Å©´Ù. DLLÀº ¹Ì·¡ÀÇ È®À强À» À§Çؼ­ »½ ¶Ô¸° ±¸¸ÛÀÇ ÇüÅ·ΠÀÚ¸®¸¦ À¯º¸ÇصдÙ. ÇÏÁö¸¸ ±× ÀÚ¸®´Â µð½ºÅ© ¿µ¿ªÀ» Â÷ÁöÇÏÁö´Â ¾Êµµ·Ï ÇÒ ¼ö ÀÖ´Ù. °£´ÜÇÑ cp³ª makeholeÀ̶ó´Â ÇÁ·Î±×·¥À¸·Î ÀÌ·¸°Ô ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ÀÌ¹Ì °íÁ¤µÈ À§Ä¡¿¡ ÁÖ¼ÒµéÀÌ ÀÖÀ¸¹Ç·Î ¶óÀ̺귯¸® »ý¼º ÈÄ¿¡ strip ÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ELF ¶óÀ̺귯¸®¿¡ ´ëÇؼ­´Â stripÇÏÁö ¸»¶ó. 6.4.3.3. libc-lite ¶õ ¹«¾ùÀΰ¡? libc-lite ¶ó°í ÇÏ´Â °ÍÀº libc ¿¡ ´ëÇÑ ¼Ò±Ô¸ð ¹öÀüÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. ÇϳªÀÇ Ç÷ÎÇÇ ¾È¿¡ µé¾î°¡°í À¯´Ð½ºÀÇ ÀÚÀßÇÑ ¸¹Àº ¾÷¹«µé¿¡ ÃæºÐÇÑ Á¤µµ¸¸À¸·Î ±¸¼ºµÈ ¶óÀ̺귯¸®ÀÌ´Ù. ±×°ÍÀº curses ³ª dbm, termcap µîÀÇ Äڵ带 Æ÷ÇÔÇÏ°í ÀÖÁö ¾Ê´Ù. ¸¸¾à ¿©·¯ºÐÀÇ /lib/libc.so.4°¡ lite ¹öÀüÀÇ ¶óÀ̺귯¸®¿¡ ¸µÅ©µÇ¾î ÀÖ´Ù¸é Áï½Ã ¿ÏÀüÇÑ libc ¹öÀüÀ¸·Î ±³Ã¼Çϱ⠹ٶõ´Ù. º¸Åë ½½·¢¿þ¾îÀÇ ·çÆ® µð½ºÄÏÀ» ¸¶¿îÆ®Çغ¸¸é ÀÌ lite ¹öÀüÀÇ C ¶óÀ̺귯¸®°¡ µé¾îÀÖÀ½À» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¼³Ä¡ Áغñ¿Í ¼³Ä¡¿¡ ÇÊ¿äÇÑ ¸¸Å­ÀÇ ÀÛÀº C ¶óÀ̺귯¸®ÀÌ´Ù. 6.4.4. ¸µÅ©Çϱâ : ÀϹÝÀûÀÎ ¹®Á¦µé ¿©·¯ºÐÀÇ ¸µÅ© ¹®Á¦¸¦ ³»°Ô º¸³»´Þ¶ó! ±×·¯¸é ±×°Í¿¡ ´ëÇؼ­ ³ª´Â ¾Æ¹« Àϵµ ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ ¸¹ÀÌ ½×ÀÌ´Â ¹®Á¦¿¡ ´ëÇؼ­´Â ±ÛÀ» ¾²°Ú´Ù. °øÀ¯ ¶óÀ̺귯¸®¿Í ¸µÅ©µÇ±æ ¹Ù¶ó´Âµ¥ Á¤Àû ¶óÀ̺귯¸®¿Í ¸µÅ©µÇ°í ÀÖ´Ù. ¿ì¼±Àº ld°¡ °øÀ¯¶óÀ̺귯¸®¸¦ Á¦´ë·Î ãÀ» ¼ö ÀÖµµ·Ï ¸µÅ©°¡ ¾Ë¸Â°Ô µÇ¾î ÀÖ´ÂÁö Á¡°ËÇÑ´Ù. ELF¿¡ ´ëÇؼ­¶ó¸é ÀÌ°ÍÀº libfoo.so ½Éº¼¸¯ ¸µÅ©¸¦ ¸»Çϸç a.outÀÇ °æ¿ì¿¡´Â libfoo.saÈ­ÀÏÀ» ¸»ÇÏ´Â °ÍÀÌ´Ù. ELF binutil 2.5 ¹öÀü¿¡¼­ 2.6 ¹öÀüÀ¸·Î ¾÷±×·¹À̵åÇÑ ¸¹Àº »ç¶÷µéÀÌ °Þ°í ÀÖ´Â ¹®Á¦ÀÌ´Ù. Àü ¹öÀüÀÌ °øÀ¯ ¶óÀ̺귯¸®¿¡ ´ëÇÏ¿© ¿ÀÈ÷·Á ´õ ¶È¶ÈÇÏ°Ô Ã£¾Æ³Â´Âµ¥, ±× »ç¶÷µéÀº ¸ðµç ¸µÅ©¸¦ Á¦´ë·Î ¸¸µéÁö ¾Ê¾Ò´ø °ÍÀÌ´Ù. ÁöÀûÀÎ Çൿ¾ç½ÄÀ» ´Ù¸¥ ¸ðµç ¼³°è¹æ½Ä°úÀÇ È£È¯¼ºÀ» À§Çؼ­ ½Å¹öÀü¿¡¼­ Á¦°ÅµÇ¾ú´Ù. ÁöÀû Çൿ¾ç½ÄÀº À߸øµÈ °¡Á¤À» °®°Ô µÇ°í ¿ÀÈ÷·Á ´õ ¸¹Àº ¹®Á¦¸¦ ³º±â ¶§¹®¿¡ ±×·¸°Ô ÇÑ °ÍÀÌ´Ù. DLL ÅøÀÎ mkimage °¡ libgcc¸¦ ã´Âµ¥ ½ÇÆÐÇÑ´Ù. libc.so.4.5.x¿Í ±× ÀÌ»óÀÇ ¹öÀü¿¡ °üÇÏ¿© libgcc´Â ´õ ÀÌ»ó °øÀ¯ ¶óÀ̺귯¸®°¡ ¾Æ´Ï´Ù. µû¶ó¼­ ¿©·¯ºÐÀº `-lgcc'¿Í °°Àº ¶óÀÎÀ» ¸ðµÎ `gcc -print-libgcc-file-name`·Î ¹Ù²ãÁÖ¾î¾ß ÇÑ´Ù. (ÁÖÀÇÇÒ °ÍÀº ¹Ù·Î ¹éÄõ¿ìÆ®¹®ÀÚ(`)ÀÇ »ç¿ëÀÌ´Ù. ²À ÀÌ ¹®ÀÚ¸¸À» »ç¿ëÇ϶ó.) ¶ÇÇÑ ¸ðµç /usr/lib/libgcc* È­ÀϵéÀ» »èÁ¦Ç϶ó. ÀÌ°ÍÀÌ Áß¿äÇÏ´Ù. __NEEDS_SHRLIB_libc_4µµ ¸¶Âù°¡Áö ¹®Á¦ÀÌ´Ù. DLL »ý¼º½Ã¿¡ ``Assertion failure'' ¸Þ½ÃÁö ÀÌ ¸Þ½ÃÁö´Â ¿©·¯ºÐÀÌ °¡Áö°í ÀÖ´Â jump table ½½·ÔÀÌ ¿ø·¡ÀÇ jump.varsÈ­ÀÏ¿¡ ³Ê¹« ÀûÀº °ø°£ ¹Û¿¡ ¿¹¾àµÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ ¿À¹öÇ÷οì·Î ÀÎÇØ »ý±â´Â ¹®Á¦ÀÌ´Ù. ¿©·¯ºÐÀº tools-2.17.tar.gz ÆÐÅ°Áö¿¡ µé¾î ÀÖ´Â `getsize' ¸í·ÉÀ» »ç¿ëÇÏ¿© ±× ¹üÀÎÀ» ã¾Æ³¾ ¼ö ÀÖ´Ù. ¾Æ¸¶µµ À¯ÀÏÇÑ ÇØ°áÃ¥Àº ¸ÞÀÌÀú ¹øÈ£ÀÇ Áõ°¡ ¹Û¿¡ ¾ø´Â °Í °°´Ù. ´ÜÁö ÀÌÀü ¹öÀü°ú ȣȯµÇµµ·Ï °í·ÁÇϸ鼭 ¸»ÀÌ´Ù. ld: output file needs shared library libc.so.4 ÀÌ·¯ÇÑ ¹®±¸´Â º¸Åë libc°¡ ¾Æ´Ñ ¶óÀ̺귯¸®µé (Áï, X À©µµ¿ì ¶óÀ̺귯¸®µé...)ÇÏ°í ¸µÅ©ÇÏ·Á°í ÇÒ ¶§ ¹ß»ýÇÑ´Ù. -staticÀ» ÇÔ²² »ç¿ëÇÏÁö ¾Ê°í ¸µÅ© ½Ã¿¡ -g ¿É¼ÇÀ» ÁÖ¾úÀ» ¶§ÀÌ´Ù. °øÀ¯ ¶óÀ̺귯¸®¿¡ ´ëÇÑ .sa È­ÀÏÀº º¸Åë Á¤ÀǵÇÁö _NEEDS_SHRLIB_libc_4 ¶ó´Â ½Éº¼À» °¡Áö°í Àִµ¥ ³ªÁß¿¡ libc.sa¿¡¼­ ÇØ°áµÈ´Ù. ÇÏÁö¸¸ -g ¿É¼ÇÀ» ÁÖ°Ô µÇ¸é libg.a ¶Ç´Â libc.a¿Í ¸µÅ©µÇ°Ô µÇ¹Ç·Î ±× ½Éº¼Àº ÇØ°áÀÌ µÇÁö ¾Ê°Ô µÇ°í À§¿Í °°Àº ¿¡·¯ ¸Þ¼¼Áö°¡ ¶ß°Ô µÇ´Â °ÍÀÌ´Ù. °á·ÐÀûÀ¸·Î -g Ç÷¡±×·Î ÄÄÆÄÀÏÇÒ ¶§´Â -static À̶ó´Â ¿É¼ÇÀ» ÇÔ²² Áֱ⠹ٶõ´Ù. ¶Ç´Â -g·Î ÄÄÆÄÀÏÇÏÁö ¾ÊÀ¸¸é µÈ´Ù. ¸µÅ©ÇÒ °Í ¾øÀÌ ¿øÇÏ´Â ºÎºÐ¸¸ -g ¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏÇصµ ÃæºÐÇÑ µð¹ö±ë Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù. 7. µ¿Àû ·Îµù(Dynamic Loading) À̹ø ¼½¼ÇÀº Áö±Ý ÇöÀç·Î¼± ¾ÆÁÖ ÀûÀº ³»¿ë¸¸À» °¡Áö°í ÀÖ´Ù. ELF ÇÏ¿ìÅõ ¹®¼­¸¦ ¹ßÃéÇÔÀ¸·Î½á ±× ³»¿ëÀÌ °è¼ÓÀûÀ¸·Î ´Ã¾î³ª°Ô µÉ °ÍÀÌ´Ù. 7.1. °³³ä Àâ±â ¸®´ª½º´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ °¡Áö°í ÀÖ´Ù. ÀÌ ±Û Àüü¸¦ Àд µ¿¾È ÀÌÁ¦´Â ÀÌ·± ¸» µè´Â °Íµµ Áú·ÈÀ» °ÍÀÌ´Ù. ÀüÅëÀûÀ¸·Î ÇÁ·Î±×·¥ ¸µÅ© °úÁ¤¿¡¼­ ÇàÇÑ ÀÛ¾÷Àº ·Îµù °úÁ¤¿¡¼­ ±× ¹Ý´ë °úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù. 7.2. ¿¡·¯ ¸Þ¼¼Áö can't load library: /lib/libxxx.so, Incompatible version a.out ¿¡¼­¸¸ ÀϾ´Âµ¥, ÀÌ ¸»Àº ¿©·¯ºÐÀÇ ¶óÀ̺귯¸® ¸ÞÀÌÀú ¹öÀüÀÌ Æ²¸®´Ù´Â ¸»ÀÌ´Ù. ´Ù¸¥ ¹öÀüÀ» °¡Áö°í ÀÖ´Ù°í Çؼ­ ´«°¡¸²½ÄÀ¸·Î ½Éº¼¸¯ ¸µÅ©ÇÏ´Â °ÍÀ¸·Î ¾ÈµÈ´Ù. µÈ´Ù ÇÒÁö¶óµµ °á±¹¿£ ¼¼±×ÆúÆ®¸¦ ÀÏÀ¸Å³ °ÍÀÌ´Ù. »õ·Î¿î ¹öÀüÀ» °¡Á®¿À¶ó.ELF¿¡¼­µµ ºñ½ºÇÑ ¸Þ¼¼Áö°¡ ³ª¿Â´Ù. ftp: can't load library 'libreadline.so.2' warning using incompatible library version xxx a.outÀÇ °æ¿ìÀÌ´Ù. ÇÁ·Î±×·¥ ÄÄÆÄÀÏÇÑ »ç¶÷º¸´Ù ³·Àº ¸¶ÀÌ³Ê ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ °®°í Àֱ⠶§¹®¿¡ ¹ß»ýÇÏ´Â °æ°í ¸Þ¼¼ÁöÀÌ´Ù. ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±â´Â ÇÒ °ÍÀÌ´Ù. ¾÷±×·¹À̵åÇÏ´Â °ÍÀÌ ¾î¶³±î? 7.3. µ¿Àû ·Î´õÀÇ ÀÛµ¿ Á¦¾îÇϱ⠸¹Àº ȯ°æ º¯¼öµéÀÌ µ¿Àû ·Î´õ¿¡ °ü°èÇÑ´Ù. ´ëºÎºÐÀº ÀÏ¹Ý »ç¿ëÀÚº¸´Ù´Â ldd¿¡°Ô À¯¿ëÇÏ´Ù. ldd¿¡ ´Ù¾çÇÑ ½ºÀ§Ä¡¸¦ ÁÜÀ¸·Î½á ½±°Ô ¼¼ÆÃÇÒ ¼ö ÀÖ´Ù. o LD_BIND_NOW --- ÀϹÝÀûÀ¸·Î ÇÔ¼ö°¡ È£ÃâµÇ±â Àü±îÁö´Â ¶óÀ̺귯¸®¿¡¼­ ã¾Æº¸Áö ¾Ê´Â´Ù. ÀÌ Ç÷¡±×¸¦ ¼¼ÆÃÇØÁÖ¸é ¶óÀ̺귯¸® ÀûÀç½Ã¿¡ ¸ðµç üũ¸¦ ÇÏ°Ô µÇ°í ½ÃÀÛÀº »ó´çÈ÷ ´À¸®°Ô µÈ´Ù. ÀÌ°ÍÀº ¿©·¯ºÐÀÌ ¸¸µç ÇÁ·Î±×·¥ÀÌ ¸ðµç °Íµé°ú Á¦´ë·Î ¸µÅ©°¡ µÇ¾ú´ÂÁö ½ÃÇèÇغ¼ ¶§ À¯¿ëÇÏ´Ù. o LD_PRELOAD --- overriding ÇÔ¼ö Á¤ÀǸ¦ °¡Áö°í ÀÖ´Â È­ÀÏ¿¡ ¼¼ÆÃµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î¼­ ¸Þ¸ð¸® ÇÒ´ç ¹æ¹ýÀ» Å×½ºÆÃÇÏ·Á°í Çϸç, malloc¸¦ ±³Ã¼ÇÏ·Á°í ÇÒ ¶§´Â ¿©·¯ºÐÀÌ ¿øÇÏ´Â ·çƾÀ¸·Î ¸¸µç ÈÄ¿¡ ±³Ã¼ÇÒ ¼ö°¡ ÀÖ´Ù. malloc.o ¶ó´Â À̸§À¸·Î ÄÄÆÄÀÏÇÑ ÈÄ ´ÙÀ½°ú °°ÀÌ Çغ¸ÀÚ. $ LD_PRELOAD=malloc.o; export LD_PRELOAD $ some_test_program LD_ELF_PRELOAD¿Í LD_AOUT_PRELOAD ÀÌ µÑÀº ºñ½ÁÇÏ´Ù. ÇÏÁö¸¸ °¢°¢ ƯÁ¤ ÇüÅ¿¡¸¸ °ü°èÇÑ´Ù. ¸¸¾à LD_ELF_PRELOAD¿Í LD_PRELOAD°¡ µÑ ´Ù »ç¿ëµÇ¾ú´Ù¸é Á» ´õ ÀÚ¼¼È÷ ÁöÁ¤ÇÑ ÀüÀÚ LD_ELF_PRELOAD°¡ »ç¿ëµÈ´Ù. o LD_LIBRARY_PATH --- ÀÌ°ÍÀº °øÀ¯ ¶óÀ̺귯¸®¸¦ ãÀ» ¶§ Âü°íÇÒ µð·ºÅ丮¸¦ ÄÝ·Ð(:)À» ºÐ¸®ÀÚ·Î ½á¼­ Ç¥ÇöÇÑ ¸®½ºÆ®ÀÌ´Ù. ±×°ÍÀº ld¿¡ ¿µÇâÀ» ÁÖÁö´Â ¸øÇÑ´Ù. ´ÜÁö ½ÇÇà½Ã¿¡¸¸ °ü°èÇÑ´Ù. ¶ÇÇÑ setuid³ª setgid¸¦ °®´Â ÇÁ·Î±×·¥¿¡ ´ëÇؼ­´Â ¹«¿ëÁö¹°ÀÌ´Ù. ¸¶Âù°¡Áö·Î LD_ELF_LIBRARY_PATH¿Í LD_AOUT_LIBRARY_PATH´Â °¢°¢ÀÇ ¹ÙÀ̳ʸ® Çü½Ä¿¡¸¸ Àû¿ëµÇµµ·Ï ÇÏ°í ÀÖ´Ù. LD_LIBRARY_PATH´Â Á¤»óÀûÀÎ °æ¿ì ±×·¸°Ô ÇÊ¿äÇÏÁø ¾Ê´Ù. ´ë½Å¿¡ /etc/ld.so.conf/¿¡ µð·ºÅ丮¸¦ Ãß°¡ÇÏ°í ldconfig¸¦ ´Ù½Ã ÇÑ ¹ø ½ÇÇà½ÃÅ°´Â°Ô ÁÁ´Ù. o LD_NOWARN --- ÀÌ´Â a.out¿¡¸¸ Àû¿ëµÈ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ ¼¼ÆÃÇϸé LD_NOWARN=true; export LD_NOWARN) ¸¶ÀÌ³Ê ¹öÀüÀÌ ´Ù¸£´ÙµçÁö ÇÏ´Â, Å©°Ô ½É°¢ÇÏÁö ¾Ê´Â °æ°í¸¦ Ç¥½ÃÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. o LD_WARN --- ÀÌ´Â ELF¿¡¸¸ ÇØ´çµÈ´Ù. ¼¼ÆõǸé ÀϹÝÀûÀ¸·Î ``Can't find library''¿Í °°Àº ½É°¢ÇÑ ¿¡·¯¸¦ °æ°í·Î ¹Ù²Ù¾îÁØ´Ù. º°·Î ÇÊ¿ä¾ø´Â ¿É¼ÇÀÌ´Ù. o LD_TRACE_LOADED_OBJECTS --- ELF¿¡¸¸ Àû¿ëµÈ´Ù. ÇÁ·Î±×·¥À¸·Î ÇÏ¿©±Ý ldd ÇÏ¿¡¼­ ½ÇÇàµÇ°í ÀÖ´Ù°í »ý°¢ÇÏ°Ô²û ¸¸µç´Ù. $ 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. µ¿Àû ·ÎµùÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ ¸¸µé±â ÀÌ´Â ¼Ö¶ó¸®½º 2.xÀÇ µ¿Àû ·Îµù Áö¿øÀÌ ÀÌ·ïÁö´Â ¹æ½Ä°ú ¸Å¿ì Èí»çÇÏ´Ù. H J LuÀÇ ELF ÇÁ·Î±×·¡¹Ö ¹®¼­¿¡ ÀÚ¼¼È÷ ³ª¿Í ÀÖÀ¸¸ç dlopen(3) ¸ÇÆäÀÌÁö¿¡ ¾ÆÁÖ Àß ³ª¿Í ÀÖ´Ù. ¸ÇÆäÀÌÁö´Â ld.so ÆÐÅ°Áö¿¡ µé¾îÀÖ´Ù. ´ÙÀ½ ÇÁ·Î±×·¥À» -ldl ¿É¼ÇÀ» ÁÖ°í ¸µÅ©Ç϶ó. #include #include 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. °³¹ßÀÚ¿Í ¿¬¶ôÇϱâ(ÀÌÇÏ´Â ¹ø¿ªµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.) 8.1. Bug reports Start by narrowing the problem down. Is it specific to Linux, or does it happen with gcc on other systems? Is it specific to the kernel version? Library version? Does it go away if you link static? Can you trim the program down to something short that demonstrates the bug? Having done that, you'll know what program(s) the bug is in. For GCC, the bug reporting procedure is explained in the info file. For ld.so or the C or maths libraries, send mail to linux-gcc@vger.rutgers.edu. If possible, include a short and self-contained program that exhibits the bug, and a description both of what you want it to do, and what it actually does. 8.2. Helping with development If you want to help with the development effort for GCC or the C library, the first thing to do is join the linux-gcc@vger.rutgers.edu mailing list. If you just want to see what the discussion is about, there are list archives at . The second and subsequent things depend on what you want to do! 9. The Remains 9.1. The Credits Only presidents, editors, and people with tapeworms have the right to use the editorial ``we''. (Mark Twain) This HOWTO is based very closely on Mitchum DSouza's GCC-FAQ; most of the information (not to mention a reasonable amount of the text) in it comes directly from that document. Instances of the first person pronoun in this HOWTO could refer to either of us; generally the ones that say ``I have not tested this; don't blame me if it toasts your hard disk/system/spouse'' apply to both of us. Contributors to this document have included (in ASCII ordering by first name) 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, and of course Linus Torvalds, without whom the whole exercise would have been pointless, let alone impossible :-) Please do not feel offended if your name has not appeared here and you have contributed to this document (either as HOWTO or as FAQ). Email me and I will rectify it. 9.2. Translations At this time, there are no known translations of this work. If you wish to produce one, please go right ahead, but do tell me about it! The chances are (sadly) several hundred to one against that I speak the language you wish to translate to, but that aside I am happy to help in whatever way I can. 9.3. Feedback is welcomed. Mail me atdan@detached.demon.co.uk. My PGP public key (ID 5F263625) is available from myweb pages , if you feel the need to be secre­ tive about things. 9.4. Legalese All trademarks used in this document are acknowledged as being owned by their respective owners. This document is copyright (C) 1996 Daniel Barlow 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. 10. Index Entries starting with a non-alphabetical character are listed in ASCII order. o -fwritable-strings ``39'' ``56'' o /lib/cpp ``16'' o a.out ``1'' o ar ``10'' o as ``8'' o ``19'' o atoi() ``40'' o atol() ``41'' o binaries too big ``63'' ``65'' ``77'' o chewing gum ``3'' o cos() ``68'' o debugging ``59'' o dlopen() ``82'' o dlsym() ``83'' o documentation ``4'' o EINTR ``52'' o elf ``0'' ``71'' o execl() ``57'' o fcntl ``47'' o FD_CLR ``44'' o FD_ISSET ``45'' o FD_SET ``43'' o FD_ZERO ``46'' o file ``2'' o ``20'' o gcc ``6'' o gcc -fomit-frame-pointer ``61'' o gcc -g ``60'' o gcc -v ``14'' o gcc, bugs ``15'' ``28'' ``29'' ``84'' o gcc, flags ``13'' ``25'' ``26'' o gdb ``64'' o header files ``17'' o interrupted system calls ``51'' o ld ``9'' o LD_* environment variables ``80'' o ldd ``81'' o libc ``7'' o libg.a ``62'' o libgcc ``79'' o ``21'' o lint ``58'' o ``18'' o manual pages ``5'' o ``70'' o maths ``69'' o mktemp() ``55'' o optimisation ``27'' o QMAGIC ``76'' o segmentation fault ``30'' ``54'' o segmentation fault, in GCC ``33'' o select() ``50'' o SIGBUS ``34'' o SIGEMT ``35'' o SIGIOT ``36'' o SIGSEGV ``31'' ``53'' o SIGSEGV, in gcc ``32'' o SIGSYS ``38'' o SIGTRAP ``37'' o sin() ``67'' o soname ``73'' o sprintf() ``42'' o statically linked binaries, unexpected ``66'' ``78'' o ``23'' o ``24'' o strings ``11'' o ``48'' o ``49'' o ``22'' o version numbers ``12'' ``74'' o weird things ``72'' o ZMAGIC ``75''