GCC ÇÏ¿ìÅõ Daniel Barlow 1996³â 2¿ù 28ÀÏ v1.17 ¿ªÀÚ : ÀÌ ¸¸ ¿ë ÀÌ ¹®¼­´Â GNU C ÄÄÆÄÀÏ·¯¿Í °³¹ß ¶óÀ̺귯¸®¸¦ ¸®´ª½º »ó¿¡¼­ ¾î¶»°Ô ¼Â¾÷ÇÏ´Â Áö¿¡ ´ëÇØ ´Ù·ç°í ÀÖ´Ù. ±×¸®°í ¸®´ª½º »ó¿¡¼­ ÄÄÆÄÀÏ, ¸µÅ·, ½ÇÇà, µð¹ö±ëÀ» ¾î¶» °Ô ÇÏ´ÂÁö¿¡ ´ëÇÏ¿© °³·«ÀûÀÎ Áö½ÄÀ» Á¦°øÇÑ´Ù. ´ëºÎºÐÀÇ ³»¿ëÀº Mitch D'Souza¾¾ÀÇ GCC-FAQ·ÎºÎÅÍ Â÷¿ëÇØ¿Â °ÍÀ̸ç( ¸¹Àº ºÎºÐ ±³Ã¼Çß´Ù. ) ¶ÇÇÑ ELF-HOWTO·ÎºÎÅ͵µ Â÷¿ëÀ» ÇØ¿Â °ÍÀÌ´Ù.( À̰͵µ ¶ÇÇÑ ´ëºÎºÐ ¹Ù²î°Ô µÉ °ÍÀÌ´Ù. ) ÀÌ ¹®¼­´Â ù¹øÂ° °ø°³ ¹öÀüÀÌ´Ù. ( ¹öÀü ¹øÈ£´Â RCS ÀÇ Àå³­ÀÏ »ÓÀÌ´Ù ) ¿©·¯ºÐÀÇ ÀǰßÀ» ȯ¿µÇÑ´Ù. 1. ½ÃÀÛÇÏ´Â ¸» 1.1. ELF ¿Í a.out ¸®´ª½º °³¹ßÀº Áö±Ý ÇöÀç¿¡µµ ²÷ÀÓ¾ø´Â º¯È­ °úÁ¤¿¡ ³õ¿© ÀÖ´Ù. °£´ÜÈ÷ ¸»Çؼ­, ¸®´ª½ºÀÇ Ãø¸é¿¡¼­ ¾î¶»°Ô ½ÇÇàÇØ¾ß ÇÏ´ÂÁö ¾Ë°í ÀÖ´Â ¹ÙÀ̳ʸ®´Â ¹Ù·Î ÀÌ 2 °¡Áö Á¾·ù°¡ ÀÖ´Ù. ¿©·¯ºÐÀÇ ½Ã½ºÅÛÀÌ ¾î¶»°Ô ±¸¼ºµÇ¾î ÀÖ´ÂÁö¿¡ µû¶ó µÑ ´Ù °¡Áö°í ÀÖÀ» ¼öµµ ÀÖ´Ù. ±×¸®°í Áö±Ý ÀÌ ÇÏ¿ìÅõ ¹®¼­¸¦ Àд °ÍÀº ¹«¾ùÀÌ ¹«¾ùÀÎÁö¸¦ ¾Æ´Âµ¥ µµ¿òÀÌ µÉ °ÍÀÌ´Ù. 2 °¡Áö¸¦ ¾î¶»°Ô ±¸º°Çϴ°¡? file À̶ó°í ÇÏ´Â À¯Æ¿¸®Æ¼¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ELF ÇÁ·Î±×·¥¿¡ ´ëÇØ¼­´Â ELF ¶ó°í ¾î¼±¸ Àú¼±¸ ¸»ÇÒ °ÍÀ̸ç, a.out ÇÁ·Î±×·¥¿¡ ´ëÇØ ¼­´Â Linux/i386 À̶ó´Â ´Ü¾î°¡ µé¾î°¡´Â ¸»·Î ¾ê±âÇØÁÙ °ÍÀÌ´Ù. µÑ °£ÀÇ Â÷ÀÌ´Â ¹®¼­ ÈĹݺο¡¼­ ¼³¸íµÉ °ÍÀÌ´Ù. ELF ´Â »õ·Î¿î ½ÇÇàÈ­ÀÏ Çü½ÄÀÌ ¸ç, ÀϹÝÀûÀ¸·Î ´õ ¶Ù¾î³ª´Ù°í ¿©°ÜÁö°í ÀÖ´Ù. 1.2., 1.3. Àº »ý·« 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-¿¡ ´ëÇØ ¾ÆÁÖ »ó¼¼È÷ ¼³¸íÇϰí ÀÖ´Ù. ¸Ç ÆäÀÌÁö´Â ±× ³»¿ë¿¡ µû¶ó ¼½¼Ç(Section)À¸·Î ±¸ºÐÇÏ°Ô µÇ´Âµ¥ /usr/man/man1Àº ¼½¼Ç 1, /usr/man/man2 ´Â ¼½¼Ç 2, ÀÌ·± ½ÄÀ¸·Î µð·ºÅ丮¿Í ¼½¼ÇÀÌ ¿¬°üµÇ¾î ÀÖ´Ù. 2.3. GCC µÎ °¡Áö ´äÀÌ ÀÖ´Ù. (a) ¸®´ª½º GCC ÀÇ °ø½ÄÀûÀÎ ¹èÆ÷ÆÇÀº ¿¡¼­ ¹ÙÀ̳ʸ® ÇüÅ·Π±¸ÇÒ ¼ö ÀÖ´Ù. Áï ÀÌ¹Ì ÄÄÆÄÀϵǾî ÀÖ´Â °ÍÀ» ¸»ÇÑ´Ù. Áö±Ý ±ÛÀ» ¾²°í ÀÖ´Â ÀÌ ¼ø°£¿¡ ÃֽйöÀüÀº 2.7.2 ·Î¼­ È­ÀϸíÀº gcc-2.7.2.bin.tar.gz ÀÌ´Ù. (b) FSF·ÎºÎÅÍÀÇ ÃֽŠ¼Ò½º ¹öÀüÀº GNU ÇÁ·Î±×·¥ ÀúÀå¼ÒÀÎ ¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. ¼Ò½º ¹öÀüÀÌ Ç×»ó °ø½Ä¹èÆ÷ÆÇ ¹ÙÀ̳ʸ® ¹öÀü°ú °°Àº °ÍÀº ¾Æ´Ï´Ù. ¸®´ª½º GCC °ü¸®ÀÚ´Â ¿©·¯ºÐÀÌ ÄÄÆÄÀÏÀ» ÇÏ±â ÆíÇÏ°Ô ¸ðµç °ÍÀ» ¼¼ÆÃÇØ ³õ¾ÒÀ» °ÍÀÌ´Ù. tsx-11 µµ ¸¶Àú »ìÆìº¸µµ·Ï ÇÏÀÚ. ÆÐġȭÀÏÀÌ ÇÊ¿äÇÒ Áöµµ ¸ð¸£±â ¶§¹®ÀÌ´Ù. ¾î¶² °ÍÀ̵ç ÄÄÆÄÀÏÀ̶ó´Â °ÍÀ» Çϱâ À§Çؼ­´Â ´ÙÀ½ÀÌ ÇÊ¿äÇÏ´Ù. 2.4. C ¶óÀ̺귯¸®¿Í Çì´õ È­ÀÏµé ¿©±â¼­ ¿©·¯ºÐ¿¡°Ô ÇÊ¿äÇÑ °ÍÀº ÀÏ´Ü (1)¿©·¯ºÐÀÇ ½Ã½ºÅÛÀÌ ELFÀΰ¡? 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 µîµî ) ÇöÀç ¹öÀüÀº 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 $ ¿©±â¼­ ¾Ë¾ÆµÎ¾î¾ß ÇÒ ÇÙ½ÉÀûÀÎ ³»¿ëÀº ´ÙÀ½°ú °°´Ù. i486 ÀÌ´Â ¿©·¯ºÐÀÌ 486 ÇÁ·Î¼¼¼­ ¿ëÀ¸·Î ÄÄÆÄÀÏµÈ gcc ¸¦ »ç¿ëÇϰí ÀÖ´Ù´Â ¸»ÀÌ ´Ù. ÀÌ ºÎºÐÀº ´Ù¸¦ ¼ö Àִµ¥ ¾î¶² »ç¶÷Àº 386, 586 ¿¡ µû¶ó ´Ù¸¦ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ 3 °¡Áö Ĩ¿¡¼­ ÄÄÆÄÀÏµÈ °ÍµéÀº »ó°ü¾øÀÌ ¼­·Î Àß ½ÇÇàµÈ´Ù. Â÷ÀÌÁ¡À̶ó °í ÇÑ´Ù¸é 486 Äڵ尡 ¾îµð¿£°¡ ´õÇØÁüÀ¸·Î½á 486 ¿¡¼­´Â ´õ¿í ´õ »¡¸® ½ÇÇàµÈ´Ù´Â Á¤µµÀÌ´Ù. 386 ¿¡¼­ ½ÇÇàÇϴµ¥ ÇØ°¡ µÈ´Ù°Å³ª ÇÏÁö´Â ¾Ê´Â´Ù. ÇÏÁö¸¸ ¾à°£ ¹ÙÀÌ ³Ê¸®°¡ Ä¿Áú °ÍÀÌ´Ù. box ÀÌ°Ç ÀüÇô Áß¿äÇÑ ºÎºÐÀÌ ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î¼­ box ¶ó´Â ¸» ´ë½Å¿¡ slackware ³ª debian µîÀÇ ´Ü¾î·Î ±³Ã¼µÉ ¼öµµ ÀÖ°í ¾Æ¿¹ ÀÌ ºÎºÐÀÌ ¾øÀ» ¼öµµ ÀÖ´Ù. º¸ÅëÀº i486-linux ÀÌ·± ½ÄÀÏ °ÍÀÌ´Ù. ¸¸¾à gcc ¸¦ ÄÄÆÄÀÏÇØ¼­ »ç¿ëÇÑ´Ù¸é º»ÀÎÀÌ µû·Î i486-box-linux ¶ó°í ÁöÁ¤ÇßµíÀÌ gcc¸¦ ¸¸µé ¶§ Á¤ÇØÁÙ ¼ö ÀÖ´Ù. linux ÀÌ ´Ü¾î ´ë½Å¿¡ linuxelf ¶óµç°¡ linuxaout À̶ó´Â ´Ü¾î°¡ µé¾î°¥ ¼öµµ ÀÖ´Ù. ¶Ç´Â ¸®´ª½º Ä¿³Î ¹öÀüÀÌ µé¾î°¡µµ·Ï ÇÒ ¼öµµ ÀÖ´Ù. ¾Ïư ¸®´ª½º¿ëÀÓÀ» Àß ³ªÅ¸³»°í ÀÖ´Ù. 2.7.0 ÀÌ»óÀÇ ¹öÀü¿¡¼­´Â ±×³É linux À̸é ELF ¸¦ ÀǹÌÇϰí a.outÀº linuxaout °ú °°Àº À̸§À» °®´Â´Ù. ¸®´ª½º°¡ ELF ÂÊÀ¸·Î ³ª¾Æ°¡¸é¼­ À̸§ÀÌ linux ¿¡¼­ ¹Ð·Á³µ´Ù°íµµ ÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ 2.7.0 ±× ÀÌÇÏ¿¡¼­´Â linuxaout À̶ó´Â ¸»À» ã¾Æº¼ ¼ö ¾øÀ» °ÍÀÌ´Ù. linuxelf ¶ó´Â À̸§Àº »ç¶óÁø ¸»ÀÌ´Ù. gcc ¹öÀü 2.6.3 ½ÃÀý ¿¡ ELF ½ÇÇàÈ­ÀÏÀ» ¸¸µé±â À§Çؼ­ Áö¾îÁ³´ø À̸§ÀÌ´Ù. gcc 2.6.3 Àº ELF ½ÇÇàÈ­ÀÏÀ» ¸¸µå´Âµ¥ ¹ö±×°¡ ÀÖ´Ù°í ¾Ë·ÁÁ® ÀÖ´Ù. ¾÷±×·¹À̵åÇϱ⠹ٶõ´Ù. 2.7.2 À̰ÍÀº ¹öÀü ¹øÈ£ÀÌ´Ù. µû¶ó¼­ Á¾ÇÕÇØº¸¸é ÇÊÀÚ´Â Áö±Ý ELF ½ÇÇàÄڵ带 »ý¼º½ÃŰ´Â gcc 2.7.2 ¸¦ °¡Áö°í ÀÖ´Ù´Â °ÍÀÌ´Ù. 3.2. µµ´ëü ³» gcc °¡ ¾îµð¿¡ Àִ°ǰ¡? ±×³É ¾Æ¹« »ý°¢¾øÀÌ gcc ¸¦ ¼³Ä¡Ç߰ųª ¹èÆ÷ÆÇÀ» ¼³Ä¡ÇÒ ¶§ ÀÚµ¿À¸·Î ¼³Ä¡ÇÏ°Ô Çß´Ù¸é, µµ´ëü ¸®´ª½º È­ÀÏ ½Ã½ºÅÛ »ó¿¡¼­ ¾îµð¿¡ À§Ä¡ÇÏ´ÂÁö ¾Ë°í ½ÍÀ» °ÍÀÌ´Ù. ´ë´äÀº ÀÌ·¸´Ù. /usr/lib/gcc-lib/// ( ±×¸®°í ¸ðµç ÇÏÀ§ µð·ºÅ丮µé )ÀÌ ÄÄÆÄÀÏ ·¯ÀÇ ´ëºÎºÐÀÌ À§Ä¡ÇÏ´Â Àå¼ÒÀÌ´Ù. ÄÄÆÄÀÏÀ» ¼öÇàÇÏ´Â ½ÇÇàÈ­ÀÏ ±× ÀÚü¿Í gcc ¹öÀü ¿¡ µû¸¥ ¶óÀ̺귯¸®¿Í Çì´õÈ­ÀϵéÀÌ µé¾îÀÖ´Ù. /usr/bin/gcc ´Â ÄÄÆÄÀÏ·¯ ¿îÀü»ç(Compiler Driver)¿ªÇÒÀ» ÇÑ´Ù. Ä¿¸Çµå »ó¿¡¼­´Â gcc ¶ó°í¸¸ ¸í·ÉÇÑ´Ù. ¸¸¾à ¿©·¯ ¹öÀüÀÇ ÄÄÆÄÀÏ·¯¸¦ °¡Áö°í ÀÖ´Ù¸é ¿©·¯ ¹öÀü°ú ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Ù. gcc °¡ »ç¿ëÇÏ°Ô µÉ µðÆúÆ® ¹öÀüÀÇ ÄÄÆÄÀÏ·¯¸¦ ¾Ë¾Æ³»±â À§Çؼ­´Â gcc -v ¶ó°í ÇØº¸¸é µÈ´Ù. ´Ù¸¥ ¹öÀüÀ¸·Î °­Á¦·Î ÄÄÆÄÀÏÇÏ°Ô ÇÏ·Á¸é gcc -V <¹öÀü> ÀÌ·± ½ÄÀ¸·Î »ç¿ëÇÏ¸é µÈ´Ù. ¿¹¸¦ µé¾î¼­... $ 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//( bin | lib | include )/. ¿©·¯ºÐÀÌ ¿©·¯ °³ÀÇ ¸ñÇ¥ Çü½ÄÀ» °¡Áö°í ÀÖ´Ù¸é ( ÀÏ´Ü ELFÀΰ¡ a.out Àΰ¡ ¶Ç´Â ¿©·¯ ÇüÅÂÀÇ Å©·Î½º ÄÄÆÄÀÏ·¯ µî ) µðÆúÆ® ¸ñÇ¥ Çü½Ä¿ëÀÌ ¾Æ´Ñ ¶óÀ̺귯¸®, ¹ÙÀ̳ʸ® À¯Æ¿¸®Æ¼( as, ld µî... ), Çì´õ È­ÀÏµé µµ ã¾Æº¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿À·ÎÁö ÇÑ Á¾·ùÀÇ gcc ¸¦ °¡Áö°í ÀÖ´Ù ÇÏ´õ¶óµµ ¸Å¿ì ¸¹Àº °ÍµéÀÌ ±× µð·ºÅ丮¿¡ ±ò·ÁÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö ¾Ê´Ù¸é ¾Æ¸¶µµ /usr/( bin | lib | include ) ¿¡ ÀÖÀ» °ÍÀÌ´Ù. /lib, /usr/lib ±×¸®°í ¿©Å¸ ¶óÀ̺귯¸® µð·ºÅ丮µéÀÌ ±âº» ½Ã½ºÅÛÀ» À§ÇÑ ¶óÀÌ ºê·¯¸® µð·ºÅ丮ÀÌ´Ù. ¿©·¯ºÐÀº ¶ÇÇÑ »ó´çÈ÷ ¸¹Àº ÇÁ·Î±×·¥¿¡ ´ëÇÏ¿© /lib/cpp ¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. ( X °¡ ½ÇÁ¦·Î ¸¹ÀÌ »ç¿ëÇϰí ÀÖ´Ù ) /usr/lib/gcc-lib/ /¿¡ ÀÖ´Â cpp ¸¦ Ä«ÇÇÇØ³õ´ø°¡? ¾Æ´Ï¸é ½Éº¼¸¯ ¸µÅ©¸¦ ÇØÁØ´Ù. 3.3. Çì´õ È­ÀϵéÀº ¾îµð¿¡ Àִ°¡? ¿©·¯ºÐÀÌ ¼Õ¼ö /usr/local/include ¿¡ ¼³Ä¡ÇÑ °Íµé »©°í ¸®´ª½º¿¡´Â 3 °¡Áö Áß¿ä Çì´õ µð·ºÅ丮°¡ ÀÖ´Ù. ´ëºÎºÐÀÇ /usr/include/ ¿Í ±× ÇϺΠµð·ºÅ丮µéÀº H J Lu ÀÇ libc ¹ÙÀ̳ʸ® ¹èÆ÷ ÆÇ¿¡ ÀÇÇØ¼­ Á¦°øµÈ´Ù. ¿©±â¼­ º»ÀÎÀº "´ëºÎºÐ"À̶ó´Â Ç¥ÇöÀ» ½è´Âµ¥ ±× ÀÌÀ¯´Â ´Ù¸¥ ¼Ò½º( ¿¹¸¦ µé¾î curses, dbm ¶óÀ̺귯¸® )¿¡¼­ ¿Â Çì´õÈ­Àϵ鵵 Àֱ⠶§¹®ÀÌ ´Ù. ƯÈ÷³ª ÃÖ±Ù libc ¹èÆ÷ÆÇÀ» °¡Á®¿À¸é ±×·¯ÇÑ Çì´õÈ­ÀϵéÀº ¾ø´Ù.( ¿¹Àü¿¡´Â °°ÀÌ ´Þ·Á¼­ ¿ÔÁö¸¸ ) /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 ¾î¼±¸ Àú¼±¸ Ä¿³Î ÄÄÆÄÀÏ °ü·Ã±ÛÀ» Àо±â ¹Ù¶õ´Ù. # cd /usr/include # ln -s ../src/linux/include/linux . # ln -s ../src/linux/include/asm . , , , ±×¸®°í µîÀÇ È­ÀÏ µéÀº ÄÄÆÄÀÏ·¯ ¹öÀü¸¶´Ù ´Ù¸¦ °ÍÀÌ´Ù. ±×¸®°í ±×µéÀº /usr/lib/gcc-lib/i486-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-linux/2.7.2/specs gcc version 2.7.2 /usr/lib/gcc-lib/i486-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 ÀÇ Ã³¸®¹æ½ÄÀº ÀüÇô µµ¿òÀÌ µÇÁú ¾Ê´Â´Ù ) Strength ReductionÀº ÀüÇüÀûÀ¸·Î °ö¼ÀÀ» µ¡¼ÀÀ¸·Î ±³Ã¼Çϱâ À§ÇÏ¿© ´Ù¸¥ ·¹Áö½ºÅÍ µéÀ» »ç¿ëÇÏ°Ô µÈ´Ù. -fcaller-saves ¶ÇÇÑ ÀÌ·± ¹®Á¦Á¡ÀÌ ÀÖÁö ¾Ê³ª »ý°¢ÇÏ °í ÀÖ´Ù. ¶Ç ´Ù¸¥ ¿¹°¨Àº ÀÌ·¸´Ù. -fomit-frame-pointer ´Â µµ¿òÀÌ µÉ ¼öµµ ÀÖ°í ±×·¸Áö ¾ÊÀ» ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. ÇÑ ÆíÀ¸·Î´Â ¶Ç ´Ù¸¥ ·¹Áö½ºÅͰ¡ ÇÒ´ç°¡´É ÇÏ´Ù´Â °ÍÀ» ÀǹÌÇÒ ¼öµµ ÀÖ°í, ´Ù¸¥ ÇÑ ÆíÀ¸·Î´Â x86 ÀÌ ¿¬»êÁö½Ã(instruc tion)¿¡ ´ëÇÏ¿© ÀÎÄÚµùÇÏ´Â ¹æ½ÄÀ¸·Î¼­, ½ºÅà »ó´ëÀû ÁÖ¼Ò°¡ ÇÁ·¹ÀÓ »ó´ë Àû ÁÖ¼Òº¸´Ùµµ ´õ ¸¹Àº °ø°£À» Â÷ÁöÇÑ´Ù´Â °ÍÀ» ÀǹÌÇϱ⵵ ÇÑ´Ù. ÀÌ·¸°Ô µÇ ¸é ÇÁ·Î±×·¥¿¡ »ç¿ëµÉ ¼ö ÀÖ´Â IcacheÀÌ ¾à°£ ÁÙ¾îµç´Ù. ¶ÇÇÑ -fomit-frame -pointer ´Â ÄÄÆÄÀÏ·¯°¡ °è¼ÓÀûÀ¸·Î È£Ãâ ÈÄ¿¡µµ ½ºÅà Æ÷ÀÎÅ͸¦ Á¶Á¤ÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ¶æÇÑ´Ù. µû¶ó¼­ ÇÁ·¹ÀÓÀ» °®´Â °æ¿ì, ¸î ¹øÀÇ È£Ã⸸À¸·Îµµ ½ºÅÃÀÌ °¡µæ Â÷°Ô µÈ´Ù. ¸¶Áö¸· ¸»Àº ¸®´©½º ¶ÇÇÑ ¾ð±ÞÇϰí ÀÖ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ ÃÖÀûÈ­µÈ È¿À²À» ¿øÇÑ´Ù¸é, ³ª¸¦ ¹ÏÁö ¸»¶ó. ½ÇÁ¦·Î Å×½ºÆ®¸¦ ÇØºÁ ¾ß ÇÑ´Ù. gcc ÄÄÆÄÀÏ·¯ÀÇ ¿É¼ÇÀº Á¤¸»·Î ¸¹´Ù. ±×¸®°í ¸î °³ÀÇ Æ¯Á¤ Á¶ÇÕÀÌ °¡Àå ÁÁÀº ÃÖÀûÈ­¸¦ ÀÌ·ïÁÙ °ÍÀÌ´Ù. 4.2.2. Internel 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. BSDism ( bsd_ioctl, µ¥¸ó ±×¸®°í ) ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥À» -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 ÀÌ µÇ¾ú À» °ÍÀÌ´Ù. ±×¸®°í °°Àº ŸÀӾƿô ±¸Á¶Ã¼¸¦ °¡Áö°í È£ÃâÀ» ÇÏ°Ô µÇ¸é È£Ãâ Áï½Ã µÇµ¹¾Æ¿Ã °ÍÀÌ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â ŸÀӾƿô °ªÀ» ¸Å¹ø 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)À» ½ÇÇà½Ãų °ÍÀÌ´Ù. - ŸÀ̸Ӱ¡ ±±ï´î ¶§¸¶´Ù ºñµ¿±âÀûÀ¸·Î. - - ¸ðµç ½Ã½ºÅÛ È£Ãâ ¹Ýȯ½Ã¿¡. - ±×¸®°í ´ÙÀ½°ú °°Àº ½Ã½ºÅÛ È£Ãâ µ¿¾È¿¡µµ ±×·¯ÇÏ´Ù. : 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 ¿É¼ÇÀ» ÁÖ´Â ÀÌÀ¯´Â ¹Ù·Î Á¤Àû ¸µÅ©¸¦ ÇàÇ϶ó´Â ¸»À» ÇÔÃàÇÏ°Ô µÈ´Ù. -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¿¡ ÀÇÇØ ¸¸µé¾îÁø ¼³Á¤ ½ºÅ©¸³Æ®¸¦ °¡Áö°í ÀÖ´Ù¸é, º¸ÅëÀÇ °æ¿ì MakefileÀ» °Çµå¸²À¸·Î½á µð¹ö±ë Á¤º¸¸¦ ³ÖÁö ¾Ê°Ô ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ELF¸¦ »ç¿ëÇϰí ÀÖ´Ù¸é, ÇÁ·Î±×·¥Àº -g ¼¼ÆÃ°ú´Â »ó°ü¾øÀÌ µ¿Àû ¸µÅ©µÇ¸ç, ±×³É ½±°Ô strip( µð¹ö±ë Á¤º¸¸¦ ½ÇÇàÈ­ÀÏ¿¡¼­ »©¹ö¸®´Â ÇàÀ§)½Ãų ¼ö ÀÖ´Ù. 5.2.2. °ü·Ã ¼ÒÇÁÆ®¿þ¾î ´ëºÎºÐÀÇ »ç¶÷µéÀº gdb ¸¦ »ç¿ëÇϰí ÀÖ´Ù. gdb´Â ¿¡¼­ ¼Ò½ºÀÇ ÇüÅ·Î, ¾Æ´Ï¸é À̳ª ¼±»çÀÌÆ®¿¡¼­ ¹ÙÀ̳ʸ®ÀÇ Çü Å·Π±¸ÇÒ ¼ö ÀÖ´Ù. 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) º¸Åë ¸®´ª½º ºÎÆÃ½Ã¿¡ ÄÚ¾î È­ÀÏÀ» ¸¸µéÁö ¾Êµµ·Ï ¼¼ÆÃµÇ¾î ÀÖ´Ù. ÇÏÁö¸¸ ÄÚ¾î È­ÀÏ »ý¼ºÀ» °¡´ÉÄÉ ÇÏ·Á°í ÇÑ´Ù¸é ±×°ÍÀ» ´Ù½Ã °¡´ÉÄÉ ÇÏ´Â ¼ÐÀÇ ³»Àå ¸í·ÉÀ» »ç ¿ëÇÑ´Ù. ¸¸¾à C ¼Ð ȣȯ ¼Ð( ¿¹. 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 ¿É¼ÇÀ» ÁÖ¾î¾ß ÇÑ´Ù. 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 Format) ¶ó°í ÇÏ´Â ¾ÆÁÖ ¾ÆÁÖ °­·ÂÇÑ µð¹ö±ë Æ÷¸ËÀ» °¡Áö°í ÀÖ´Ù. - ¸®´ª½º¿¡¼­´Â ¾ÆÁ÷ ¿Ïº®È÷ ±¸ÇöµÇ°í ÀÖÁö´Â ¾Ê´Ù. ÇÏÁö¸¸ ÀÛ¾÷ÀÌ ÁøÇà ÁßÀÌ´Ù 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 ¿¡ ´Ù¾çÇÑ ½ºÀ§Ä¡¸¦ ÁÜÀ¸·Î½á ½±°Ô ¼¼ÆÃÇÒ ¼ö ÀÖ´Ù. ¡Ü LD_BIND_NOW ÀϹÝÀûÀ¸·Î ÇÔ¼ö°¡ È£ÃâµÇ±â Àü±îÁö´Â ¶óÀ̺귯¸®¿¡¼­ ã¾Æº¸Áö ¾Ê´Â´Ù. ÀÌ Ç÷¡ ±×¸¦ ¼¼ÆÃÇØÁÖ¸é ¶óÀ̺귯¸® ÀûÀç½Ã¿¡ ¸ðµç üũ¸¦ ÇÏ°Ô µÇ°í ½ÃÀÛÀº »ó´çÈ÷ ´À ¸®°Ô µÈ´Ù. À̰ÍÀº ¿©·¯ºÐÀÌ ¸¸µç ÇÁ·Î±×·¥ÀÌ ¸ðµç °Íµé°ú Á¦´ë·Î ¸µÅ©°¡ µÇ¾ú´Â Áö ½ÃÇèÇØº¼ ¶§ À¯¿ëÇÏ´Ù. ¡Ü 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°¡ »ç¿ëµÈ´Ù. ¡Ü LD_LIBRARY_PATH À̰ÍÀº °øÀ¯ ¶óÀ̺귯¸®¸¦ ãÀ» ¶§ Âü°íÇÒ µð·ºÅ丮¸¦ ÄÝ·Ð(:)À» ºÐ¸®ÀÚ·Î ½á¼­ Ç¥ÇöÇÑ ¸®½ºÆ®ÀÌ´Ù. ±×°ÍÀº ld ¿¡ ¿µÇâÀ» ÁÖÁö´Â ¸øÇÑ´Ù. ´ÜÁö ½ÇÇà½Ã¿¡¸¸ °ü°èÇÑ ´Ù. ¶ÇÇÑ setuid³ª setgid ¸¦ °®´Â ÇÁ·Î±×·¥¿¡ ´ëÇØ¼­´Â ¹«¿ëÁö¹°ÀÌ´Ù. ¸¶Âù°¡Áö ·Î LD_ELF_LIBRARY_PATH ¿Í LD_AOUT_LIBRARY_PATH ´Â °¢°¢ÀÇ ¹ÙÀ̳ʸ® Çü½Ä¿¡¸¸ Àû¿ëµÇµµ·Ï Çϰí ÀÖ´Ù. LD_LIBRARY_PATH´Â Á¤»óÀûÀÎ °æ¿ì ±×·¸°Ô ÇÊ¿äÇÏÁø ¾Ê´Ù. ´ë½Å¿¡ /etc/ld.so.conf/ ¿¡ µð·ºÅ丮¸¦ Ãß°¡Çϰí ldconfig ¸¦ ´Ù½Ã ÇÑ ¹ø ½ÇÇà ½ÃŰ´Â°Ô ÁÁ´Ù. ¡Ü LD_NOWARN ÀÌ´Â a.out ¿¡¸¸ Àû¿ëµÈ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ ¼¼ÆÃÇϸé LD_NOWARN=true; export LD_NOWARN) ¸¶ÀÌ³Ê ¹öÀüÀÌ ´Ù¸£´ÙµçÁö ÇÏ´Â, Å©°Ô ½É°¢ÇÏÁö ¾Ê´Â °æ°í ¸¦ Ç¥½ÃÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. ¡Ü LD_WARN ÀÌ´Â ELF ¿¡¸¸ ÇØ´çµÈ´Ù. ¼¼ÆÃµÇ¸é ÀϹÝÀûÀ¸·Î ``Can't find library''¿Í °°Àº ½É°¢ÇÑ ¿¡·¯¸¦ °æ°í·Î ¹Ù²Ù¾îÁØ´Ù. º°·Î ÇÊ¿ä¾ø´Â ¿É¼ÇÀÌ´Ù. ¡Ü 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. °³¹ßÀÚ¿Í ¿¬¶ôÇϱâ 9. ³ª¸ÓÁö ÀÌÈÄ´Â »ý·«ÇÕ´Ï´Ù. Á¶¸¸°£ ¿ÏÀüÇÑ ¹öÀüÀÇ ¹ø¿ª¹®À» ¿Ã¸®°Ú½À´Ï´Ù.