The Linux GCC HOWTO <author>Daniel Barlow <tt><dan@detached.demon.co.uk></tt> <date>v1.17, 28 February 1996 <abstract> GNU C ÄÄÆÄÀÏ·¯¿Í ¶óÀ̺귯¸®¸¦ ¸®´ª½º »ó¿¡¼­ ¾î¶»°Ô ¼Â¾÷ÇÏ´ÂÁö¿¡ ´ëÇØ ´Ù·ç°í ÀÖ´Ù. ±×¸®°í ¸®´ª½º »ó¿¡¼­ ÄÄÆÄÀÏ, ¸µÅ·, ½ÇÇà, µð¹ö±ëÀ» ¾î¶»°Ô ÇÏ´ÂÁö¿¡ ´ëÇÏ¿© °³·«ÀûÀÎ Áö½ÄÀ» Á¦°øÇÑ´Ù. ´ëºÎºÐÀÇ ³»¿ëÀº Mitch D'Souza¾¾ÀÇ GCC-FAQ·ÎºÎÅÍ Â÷¿ëÇØ¿Â °ÍÀ̸ç (¸¹Àº ºÎºÐ ±³Ã¼Çß´Ù.) ¶ÇÇÑ ELF-HOWTO·ÎºÎÅ͵µ Â÷¿ëÀ» ÇØ¿Â °ÍÀÌ´Ù. (À̰͵µ ¶ÇÇÑ ´ëºÎºÐ ¹Ù²î°Ô µÉ °ÍÀÌ´Ù.) ÀÌ ¹®¼­´Â ù¹ø° °ø°³ ¹öÀüÀÌ´Ù. (¹öÀü ¹øÈ£´Â RCS ÀÇ Àå³­ÀÏ »ÓÀÌ´Ù.) ¿©·¯ºÐÀÇ ÀÇ°ßÀ» ȯ¿µÇÑ´Ù. </abstract> <!-- *********************** SECTION ************************** --> <!-- Preliminaries --> <sect>½ÃÀÛÇÏ´Â ¸» <sect1>ELF vs. a.out <label id="index.0"> <!-- elf --> <label id="index.1"> <!-- a.out --> <p> ¸®´ª½º °³¹ßÀº Áö±Ý ÇöÀç¿¡µµ ²÷ÀÓ¾ø´Â º¯È­ °úÁ¤¿¡ ³õ¿© ÀÖ´Ù. °£´ÜÈ÷ ¸»Çؼ­, ¸®´ª½ºÀÇ Ãø¸é¿¡¼­ ¾î¶»°Ô ½ÇÇàÇØ¾ß ÇÏ´ÂÁö ¾Ë°í ÀÖ´Â ¹ÙÀ̳ʸ®´Â ¹Ù·Î ÀÌ 2 °¡Áö Á¾·ù°¡ ÀÖ´Ù. ¿©·¯ºÐÀÇ ½Ã½ºÅÛÀÌ ¾î¶»°Ô ±¸¼ºµÇ¾î ÀÖ´ÂÁö¿¡ µû¶ó µÑ ´Ù °¡Áö°í ÀÖÀ»¼öµµ ÀÖ´Ù. <label id="index.2"> <!-- <tt/file/ --> 2 °¡Áö¸¦ ¾î¶»°Ô ±¸º°Çϴ°¡? <tt>file</tt>À̶ó°í ÇÏ´Â À¯Æ¿¸®Æ¼¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ELFÇÁ·Î±×·¥¿¡ ´ëÇؼ­´Â ELF ¶ó°í ¾î¼±¸ Àú¼±¸ ¸»ÇÒ °ÍÀ̸ç, a.out ÇÁ·Î±×·¥¿¡ ´ëÇؼ­´Â <tt>Linux/i386</tt>À̶ó´Â ´Ü¾î°¡ µé¾î°¡´Â ¸»·Î ¾ê±âÇØÁÙ °ÍÀÌ´Ù. µÑ °£ÀÇ Â÷ÀÌ´Â ¹®¼­ ÈĹݺο¡¼­ ¼³¸íµÉ °ÍÀÌ´Ù. ELF ´Â »õ·Î¿î ½ÇÇàÈ­ÀÏ Çü½ÄÀ̸ç, ÀϹÝÀûÀ¸·Î ´õ ¶Ù¾î³ª´Ù°í ¿©°ÜÁö°í ÀÖ´Ù. <!-- ºÎºÐ¹ø¿ª: ¾ö±â¼º <jurist@kldp.org> º» GCC HOWTO¿Í ¹«°üÇÏ´Ù°í »ý°¢µÇ´Â ºÎºÐÀº »èÁ¦Çß½À´Ï´Ù. --> <sect1>Ã¥ÀÓ(Admistrata) <label id="index.3"> <!-- chewing gum --> <p>ÀúÀ۱ǿ¡ °ü·ÃµÈ Á¤º¸´Â ÀÌ ¹®¼­ÀÇ <em>¸¶Áö¸·</em>À» Âü°íÇ϶ó. ¶ÇÇÑ, ÈĹݺο¡¼­ ÀÌ ±ÛÀ» Àаí, Usenet¿¡ ¹Ùº¸°°Àº Áú¹®(Á¸ÀçÇÏÁö ¾Ê´Â GCCÀÇ ¹ö±×¸¦ ¹ßÇ¥ÇÏ´Â µî)À» ¿Ã¸®Áö ¸»¶ó´Â <em>°æ°í</em>¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. <!-- *********************** SECTION ************************** --> <!-- Where to get things --> <sect>ÇÊ¿äÇÑ °ÍÀ» ¾îµð¿¡¼­ ¾òÀ» ¼ö Àִ°¡? <sect1>Áö±Ý ÀÌ ¹®¼­ <p> ÀÌ ¹®¼­´Â ¸®´ª½º ÇÏ¿ìÅõ ¹®¼­ ½Ã¸®ÁîÀÇ ÇϳªÀÌ´Ù. µû¶ó¼­ ¸ðµç ¸®´ª½º ÇÏ¿ìÅõ ¹®¼­°¡ ÀúÀåµÇ¾î ÀÖ´Â °÷À̶ó¸é ¾îµðµç ÀÖ´Ù. ¿¹¸¦ µé¾î¼­ <url url="http://sunsite.unc.edu/pub/linux/docs/HOWTO/">¿Í °°Àº °÷ÀÌ ¹Ù·Î ±×°÷ÀÌ´Ù. HTML ¹öÀüÀº <url url="http://ftp.linux.org.uk/~barlow/howto/gcc-howto.html">¿¡¼­ ãÀ» ¼ö ÀÖÀ¸¸ç ¾à°£ ¹öÀüÀÌ ³ôÀ» Áöµµ ¸ð¸¥´Ù. <sect1>´Ù¸¥ ¹®¼­µé <label id="index.4"> <!-- documentation --> <p> gcc ¿¡ ´ëÇÑ °ø½ÄÀûÀÎ ¹®¼­´Â ¼Ò½º ¹èÆ÷ È­ÀÏ¿¡ µé¾îÀÖ´Ù. texinfo È­ÀÏ, <tt>.info</tt>È­ÀÏÀÇ Çü½ÄÀ¸·Î µé¾îÀÖ´Ù. ³×Æ®¿öÅ© ¼Óµµ°¡ ºü¸£´Ù°Å³ª, ½Ãµð·Ò¿¡ °¡Áö°í Àְųª, ¶Ç´Â Àγ»½ÉÀÌ ¸¹´Ù°í »ý°¢µÉ ¶§¿¡´Â ±×°ÍÀ» untar ÇÑ ÈÄ¿¡ ÇØ´ç È­ÀÏÀ» <tt>/usr/info</tt>µð·ºÅ丮¿¡ Ä«ÇÇÇϵµ·Ï ÇÏÀÚ. ¸¸¾à ¾ø´Ù¸é <url url="ftp://tsx-11.mit.edu:/pub/linux/packages/GCC/" name="tsx-11">¿¡ °¡¼­ ÀڷḦ ã¾Æº¸ÀÚ. Ç×»ó ÃֽŠ¹öÀüÀÌ ÀÖ´Â °ÍÀº ¾Æ´Ò °ÍÀÌ´Ù. <label id="index.5"> <!-- manual pages --> <p>libc ¿¡ ´ëÇÑ ¹®¼­´Â 2 °¡Áö°¡ ÀÖ´Ù. GNU libc ÀÇ °æ¿ì¿¡´Â info È­ÀϵéÀ» °¡Áö°í Àִµ¥ stdio ºÎºÐÀ» »©°í´Â ¾ÆÁÖ ÀÚ¼¼È÷ ¸®´ª½º libc ¿¡ ´ëÇؼ­ ¾Ë·ÁÁÖ°í ÀÖ´Ù. <url name="¸ÇÆäÀÌÁö" url="ftp://sunsite.unc.edu/pub/Linux/docs/">µµ ±¸ÇÒ ¼ö Àִµ¥ ½Ã½ºÅÛ È£Ãâ(system call ¼½¼Ç 2), ¸¹Àº libc ÇÔ¼ö(¼½¼Ç 3)¿¡ ´ëÇØ ¾ÆÁÖ »ó¼¼È÷ ¼³¸íÇÏ°í ÀÖ´Ù. <sect1>GCC <label id="index.6"> <!-- gcc --> <p>µÎ °¡Áö ´äÀÌ ÀÖ´Ù. (a) ¸®´ª½º GCC ÀÇ °ø½ÄÀûÀÎ ¹èÆ÷ÆÇÀº <url url= "ftp://tsx-11.mit.edu:/pub/linux/packages/GCC/">¿¡¼­ ¹ÙÀ̳ʸ® ÇüÅ·Π±¸ÇÒ ¼ö ÀÖ´Ù. Áï ÀÌ¹Ì ÄÄÆÄÀϵǾî ÀÖ´Â °ÍÀ» ¸»ÇÑ´Ù. Áö±Ý ±ÛÀ» ¾²°í ÀÖ´Â ÀÌ ¼ø°£¿¡ ÃֽŠ¹öÀüÀº 2.7.2 ·Î¼­ È­ÀϸíÀº <tt/gcc-2.7.2.bin.tar.gz/ÀÌ´Ù. (ÆíÁýÀÚÁÖ: ÀÌ ¹®¼­ÀÇ ÀÛ¼º½Ã±â°¡ 96³âµµÀÓÀ» »ó±âÇ϶ó!) (b) FSF·ÎºÎÅÍÀÇ ÃֽŠ¼Ò½º ¹öÀüÀº GNU ÇÁ·Î±×·¥ ÀúÀå¼ÒÀÎ <url name="GNU archives" url="ftp://prep.ai.mit.edu/pub/gnu/">¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. ¼Ò½º ¹öÀüÀÌ Ç×»ó °ø½Ä¹èÆ÷ÆÇ ¹ÙÀ̳ʸ® ¹öÀü°ú °°Àº °ÍÀº ¾Æ´Ï´Ù. <tt/configure/ ½ºÅ©¸³Æ®¸¦ ÀÌ¿ëÇؼ­ ¸ðµç ¼³Á¤À» ÇÒ ¼ö ÀÖ´Ù. <url name="tsx-11" url="ftp://tsx-11.mit.edu:/pub/linux/packages/GCC/">µµ ¸¶Àú »ìÆ캸µµ·Ï ÇÏÀÚ. ÆÐÄ¡È­ÀÏÀÌ ÇÊ¿äÇÒ Áöµµ ¸ð¸£±â ¶§¹®ÀÌ´Ù. ¾î¶² °ÍÀ̵ç ÄÄÆÄÀÏÀ̶ó´Â °ÍÀ» Çϱâ À§Çؼ­´Â ´ÙÀ½ÀÌ ÇÊ¿äÇÏ´Ù. <sect1>C ¶óÀ̺귯¸®¿Í Çì´õ È­Àϵé <label id="index.7"> <!-- libc --> <p>¿©±â¼­ ¿©·¯ºÐ¿¡°Ô ÇÊ¿äÇÑ °ÍÀº ÀÏ´Ü (1)¿©·¯ºÐÀÇ ½Ã½ºÅÛÀÌ a.out Àΰ¡? (2) ¾Æ´Ï¸é µÑ ´Ù ÀÖ´Â °æ¿ì¿¡ µÑ Áß¿¡ ¹«¾ùÀ» ÅÃÇÏ°í ½ÍÀº°¡? ¿¡ µû¶ó ´Þ¶óÁø´Ù. ¸¸¾à ¿©·¯ºÐÀÌ libc 4 ¿¡¼­ libc 5 ·Î ¾÷±×·¹À̵åÇÏ·Á°í ÇÑ´Ù¸é ¿ì¼±Àº ELF-HOWTO¹®¼­¸¦ ºÁ¾ßÇÒ °ÍÀÌ´Ù. <url name ="tsx-11" url="ftp://tsx-11.mit.edu:/pub/linux/packages/GCC/">¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. <descrip> <tag><tt>libc-5.2.18.bin.tar.gz</tt></tag> --- ELF °øÀ¯ ¶óÀ̺귯¸® À̹ÌÁö, Á¤Àû ¶óÀ̺귯¸® ±×¸®°í C ¶óÀ̺귯¸®¿Í ¼öÇÐ ¶óÀ̺귯¸®¸¦ À§ÇÑ Çì´õÈ­Àϵé <tag><tt>libc-5.2.18.tar.gz</tt></tag> --- À§ ¶óÀ̺귯¸®¿¡ ´ëÇÑ ¼Ò½º. ¿©·¯ºÐÀº Çì´õ È­ÀÏÀ» ±¸ÇØ¾ß Çϱ⠶§¹®¿¡ À§¿¡ ÀÖ´Â <tt>¹ÙÀ̳ʸ®</tt>¹èÆ÷Æǵµ ÇÊ¿äÇÏ´Ù. ¼Õ¼ö ÄÄÆÄÀÏÀ» ÇÒ °ÍÀÎÁö ¾Æ´Ï¸é ±×³É ¹ÙÀ̳ʸ®¸¦ »ç¿ëÇÒ °ÍÀÎÁö¿¡ ´ëÇÑ ´äÀº °£´ÜÇÏ´Ù. ¹ÙÀ̳ʸ®¸¦ »ç¿ëÇ϶ó! ÇÏÁö¸¸ NYS³ª ¼Îµµ¿ì Æнº¿öµå ±â´ÉÀ» ¿øÇÒ ¶§´Â ¼Õ¼ö ÄÄÆÄÀÏÇÏ´Â ¼ö ¹Û¿¡ ¾ø´Ù. <tag><tt>libc-4.7.5.bin.tar.gz</tt></tag> --- a.out °øÀ¯ ¶óÀ̺귯¸® À̹ÌÁö, Á¤Àû ¶óÀ̺귯¸®(C ÇÔ¼ö, ¼öÇÐ ÇÔ¼ö), À§¿¡ ÀÖ´Â libc 5 ¿Í °øÁ¸ÇÒ ¼ö ÀÖ°Ô²û µðÀÚÀεǾî ÀÖ´Ù. ÇÏÁö¸¸ ¿©·¯ºÐÀÌ a.out ÇÁ·Î±×·¥À» ¾ÆÁ÷µµ °®°í Àְųª °³¹ßÇÏ·Á°í ÇÒ ¶§¸¸ ÇÊ¿äÇÏ´Ù. </descrip> <sect1>°ü·ÃµÈ µµ±¸µé (as, ld, ar, strings µîµî) <label id="index.8"> <!-- <tt/as/ --> <label id="index.9"> <!-- <tt/ld/ --> <label id="index.10"> <!-- <tt/ar/ --> <label id="index.11"> <!-- <tt/strings/ --> <p><url name ="tsx-11" url="ftp://tsx-11.mit.edu:/pub/linux/packages/GCC/">¿¡¼­ ±¸ÇÒ ¼ö ÀÖÀ¸¸ç, ÇöÀç ¹öÀüÀº <tt/binutils-2.6.x.x.bin.tar.gz/ÀÌ´Ù. <p>¹ÙÀ̳ʸ® À¯Æ¿¸®Æ¼µéÀº ¿À·ÎÁö ELF ¸¸ ÀÖ´Ù´Â »ç½Ç¿¡ À¯ÀÇÇÏÀÚ. ÇöÀç ¶óÀ̺귯¸®´Â ELF ·Î¸¸ °³¹ßµÇ°í ÀÖÀ¸¸ç a.out ¶óÀ̺귯¸®´Â ELF ¿Í °°ÀÌ ¾µ ¶§¸¸ ÀǹÌÀÖ´Ù°í »ý°¢ÇÑ´Ù. C ¶óÀ̺귯¸® °³¹ßÀº ELF ÂÊÀ¸·Î¸¸ ÁøÇàµÇ°í ÀÖÀ¸¸ç, a.outÀ¸·Î ÇؾßÇÒ Ä¿´Ù¶õ ÀÌÀ¯ °°Àº°Ô ¾ø´Ù¸é ±×¿¡ µû¸£´Â °ÍÀÌ ÁÁ´Ù. <!-- to insert: 29) Where can I get Objective C for Linux ?--> <!-- *********************** SECTION ************************** --> <!-- installation and setup --> <sect>GCC¼³Ä¡¿Í ¼³Á¤ <sect1>GCC ¹öÀü <label id="index.12"> <!-- version numbers --> <label id="index.13"> <!-- gcc, flags --> <label id="index.14"> <!-- gcc -v --> <p>ÇöÀç »ç¿ë ÁßÀÎ gcc ÀÇ ¹öÀüÀ» ¾Ë°í ½ÍÀº °æ¿ì¿¡´Â <tt>gcc -v</tt>¶ó°í ¼Ð ÇÁ·ÒÇÁÆ®¿¡¼­ ½ÇÇà½ÃÅ°¸é µÈ´Ù. ¶ÇÇÑ ÀÌ·¸°Ô ¸í·ÉÀ» ³»¸®¸é ¿©·¯ºÐÀÇ ½Ã½ºÅÛÀÌ ELF·Î ¼¼ÆõǾî ÀÖ´ÂÁö ¾Æ´Ï¸é a.out À¸·Î µÇ¾î ÀÖ´ÂÁö È®½ÇÇÏ°Ô ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. ÇÊÀÚÀÇ ½Ã½ºÅÛ¿¡¼­´Â ´ÙÀ½°ú °°ÀÌ ³ª¿Â´Ù. <tscreen><verb> $ gcc -v Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs gcc version 2.7.2 </verb></tscreen> <p>¿©±â¼­ ¾Ë¾ÆµÎ¾î¾ß ÇÒ ÇÙ½ÉÀûÀÎ ³»¿ëÀº ´ÙÀ½°ú °°´Ù. <itemize> <item> <tt/i486/. ÀÌ´Â ¿©·¯ºÐÀÌ 486 ÇÁ·Î¼¼¼­ ¿ëÀ¸·Î ÄÄÆÄÀÏµÈ gcc¸¦ »ç¿ëÇÏ°í ÀÖ´Ù´Â ¸»ÀÌ´Ù. ÀÌ ºÎºÐÀº ´Ù¸¦ ¼ö Àִµ¥ ¾î¶² »ç¶÷Àº 386, 586 ¿¡ µû¶ó ´Ù¸¦ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ 3 °¡Áö Ĩ¿¡¼­ ÄÄÆÄÀÏµÈ °ÍµéÀº »ó°ü¾øÀÌ ¼­·Î Àß ½ÇÇàµÈ´Ù. Â÷ÀÌÁ¡À̶ó°í ÇÑ´Ù¸é 486 Äڵ尡 ¾îµð¿£°¡ ´õÇØÁüÀ¸·Î½á 486 ¿¡¼­´Â ´õ¿í ´õ »¡¸® ½ÇÇàµÈ´Ù´Â Á¤µµÀÌ´Ù. 386 ¿¡¼­ ½ÇÇàÇϴµ¥ ÇØ°¡ µÈ´Ù°Å³ª ÇÏÁö´Â ¾Ê´Â´Ù. ÇÏÁö¸¸ ¾à°£ ¹ÙÀ̳ʸ®°¡ Ä¿Áú °ÍÀÌ´Ù. <item> <tt/box/. ÀÌ°Ç <em>ÀüÇô Áß¿äÇÑ ºÎºÐÀÌ ¾Æ´Ï´Ù.</em> ¿¹¸¦ µé¾î¼­ box¶ó´Â ¸» ´ë½Å¿¡ <tt>slackware</tt> ³ª <tt>debian</tt> µîÀÇ ´Ü¾î·Î ±³Ã¼µÉ ¼öµµ ÀÖ°í ¾Æ¿¹ ÀÌ ºÎºÐÀÌ ¾øÀ» ¼öµµ ÀÖ´Ù. º¸ÅëÀº <tt>i486-linux</tt> ÀÌ·± ½ÄÀÏ °ÍÀÌ´Ù. ¸¸¾à gcc ¸¦ ÄÄÆÄÀÏÇؼ­ »ç¿ëÇÑ´Ù¸é º»ÀÎÀÌ µû·Î i486-box-linux ¶ó°í ÁöÁ¤ÇßµíÀÌ gcc¸¦ ¸¸µé ¶§ Á¤ÇØÁÙ ¼ö ÀÖ´Ù. <item> <tt/linux/. ÀÌ ´Ü¾î ´ë½Å¿¡ <tt>linuxelf</tt> ¶óµç°¡ <tt>linuxaout</tt>À̶ó´Â ´Ü¾î°¡ µé¾î°¥ ¼öµµ ÀÖ´Ù. ¶Ç´Â ¸®´ª½º Ä¿³Î ¹öÀüÀÌ µé¾î°¡µµ·Ï ÇÒ ¼öµµ ÀÖ´Ù. ¾ÏÆ° ¸®´ª½º¿ëÀÓÀ» Àß ³ªÅ¸³»°í ÀÖ´Ù. °£´ÜÈ÷ °á·ÐÀ» ¸»ÇÏÀÚ¸é, ÀÌ ´Ü¾îÀÇ ¶æÀº »ç¿ëÁßÀÎ GCC ¹öÀü¿¡ µû¶ó ´Ù¸£°Ô Çؼ®µÈ´Ù. <itemize> <item> 2.7.0 ÀÌ»óÀÇ ¹öÀü¿¡¼­´Â ±×³É <tt>linux</tt>À̸é ELF ¸¦ ÀǹÌÇÏ°í a.outÀº <tt>linuxaout</tt> °ú °°Àº À̸§À» °®´Â´Ù. <item> ¸®´ª½º°¡ ELF ÂÊÀ¸·Î ³ª¾Æ°¡¸é¼­ À̸§ÀÌ linux¿¡¼­ ¹Ð·Á³µ´Ù°íµµ ÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ 2.7.0 ±× ÀÌÇÏ¿¡¼­´Â <tt>linuxaout</tt> À̶ó´Â ¸»À» ã¾Æº¼ ¼ö ¾øÀ» °ÍÀÌ´Ù. <label id="index.15"> <!-- gcc, bugs --> <item> <tt/linuxelf/¶ó´Â À̸§Àº »ç¶óÁø ¸»ÀÌ´Ù. gcc ¹öÀü 2.6.3 ½ÃÀý¿¡ ELF ½ÇÇàÈ­ÀÏÀ» ¸¸µé±â À§Çؼ­ Áö¾îÁ³´ø À̸§ÀÌ´Ù. gcc 2.6.3 Àº ELF ½ÇÇàÈ­ÀÏÀ» ¸¸µå´Âµ¥ ¹ö±×°¡ ÀÖ´Ù°í ¾Ë·ÁÁ® ÀÖ´Ù. ¾÷±×·¹À̵åÇϱ⠹ٶõ´Ù. </itemize> <item> <tt/2.7.2/ ÀÌ°ÍÀº ¹öÀü ¹øÈ£ÀÌ´Ù. </itemize> µû¶ó¼­ Á¾ÇÕÇغ¸¸é ÇÊÀÚ´Â Áö±Ý ELF ½ÇÇàÄڵ带 »ý¼º½ÃÅ°´Â gcc 2.7.2 ¸¦ °¡Áö°í ÀÖ´Ù´Â °ÍÀÌ´Ù. <sect1>µµ´ëü ³» gcc °¡ ¾îµð¿¡ Àִ°ǰ¡? <p>±×³É ¾Æ¹« »ý°¢¾øÀÌ gcc ¸¦ ¼³Ä¡Ç߰ųª ¹èÆ÷ÆÇÀ» ¼³Ä¡ÇÒ ¶§ ÀÚµ¿À¸·Î ¼³Ä¡ÇÏ°Ô Çß´Ù¸é, µµ´ëü ¸®´ª½º È­ÀÏ ½Ã½ºÅÛ »ó¿¡¼­ ¾îµð¿¡ À§Ä¡ÇÏ´ÂÁö ¾Ë°í ½ÍÀ» °ÍÀÌ´Ù. ´ë´äÀº ÀÌ·¸´Ù. <itemize> <item> <tt>/usr/lib/gcc-lib/</tt><em>target</em><tt>/</tt><em/version/<tt>/</tt> (±×¸®°í ¸ðµç ÇÏÀ§ µð·ºÅ丮µé)ÀÌ ÄÄÆÄÀÏ·¯ÀÇ ´ëºÎºÐÀÌ À§Ä¡ÇÏ´Â Àå¼ÒÀÌ´Ù. ÄÄÆÄÀÏÀ» ¼öÇàÇÏ´Â ½ÇÇàÈ­ÀÏ ±× ÀÚü¿Í gcc ¹öÀü¿¡ µû¸¥ ¶óÀ̺귯¸®¿Í Çì´õÈ­ÀϵéÀÌ µé¾îÀÖ´Ù. <item> <tt>/usr/bin/gcc</tt>´Â ÄÄÆÄÀÏ·¯ ¿îÀü»ç(Compiler Driver)¿ªÇÒÀ» ÇÑ´Ù. Ä¿¸Çµå »ó¿¡¼­´Â gcc ¶ó°í¸¸ ¸í·ÉÇÑ´Ù. ¸¸¾à ¿©·¯ ¹öÀüÀÇ ÄÄÆÄÀÏ·¯¸¦ °¡Áö°í ÀÖ´Ù¸é ¿©·¯ ¹öÀü°ú ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Ù. gcc °¡ »ç¿ëÇÏ°Ô µÉ µðÆúÆ® ¹öÀüÀÇ ÄÄÆÄÀÏ·¯¸¦ ¾Ë¾Æ³»±â À§Çؼ­´Â <tt/gcc -v/¶ó°í Çغ¸¸é µÈ´Ù. ´Ù¸¥ ¹öÀüÀ¸·Î °­Á¦·Î ÄÄÆÄÀÏÇÏ°Ô ÇÏ·Á¸é <tt/gcc -V /<em/version/ ÀÌ·± ½ÄÀ¸·Î »ç¿ëÇÏ¸é µÈ´Ù. ¿¹¸¦ µé¾î¼­... <tscreen><verb> # 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 </verb></tscreen> <item> <tt>/usr/</tt><em>target</em><tt>/(bin|lib|include)/</tt>. ¿©·¯ºÐÀÌ ¿©·¯ °³ÀÇ ¸ñÇ¥ Çü½ÄÀ» °¡Áö°í ÀÖ´Ù¸é (ÀÏ´Ü ELFÀΰ¡ a.out Àΰ¡ ¶Ç´Â ¿©·¯ ÇüÅÂÀÇ Å©·Î½º ÄÄÆÄÀÏ·¯ µî) µðÆúÆ® ¸ñÇ¥ Çü½Ä¿ëÀÌ ¾Æ´Ñ ¶óÀ̺귯¸®, ¹ÙÀ̳ʸ® À¯Æ¿¸®Æ¼ (<tt/as/, <tt/ld/ µî...), Çì´õ È­Àϵ鵵 ã¾Æº¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿À·ÎÁö ÇÑ Á¾·ùÀÇ gcc ¸¦ °¡Áö°í ÀÖ´Ù ÇÏ´õ¶óµµ ¸Å¿ì ¸¹Àº °ÍµéÀÌ ±× µð·ºÅ丮¿¡ ±ò·ÁÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö ¾Ê´Ù¸é ¾Æ¸¶µµ <tt>/usr/(bin|lib|include)</tt>¿¡ ÀÖÀ» °ÍÀÌ´Ù. <item> <tt>/lib/</tt>,<tt>/usr/lib</tt> ±×¸®°í ¿©Å¸ ¶óÀ̺귯¸® µð·ºÅ丮µéÀÌ ±âº» ½Ã½ºÅÛÀ» À§ÇÑ ¶óÀ̺귯¸® µð·ºÅ丮ÀÌ´Ù. ¿©·¯ºÐÀº ¶ÇÇÑ »ó´çÈ÷ ¸¹Àº ÇÁ·Î±×·¥¿¡ ´ëÇÏ¿© <tt>/lib/cpp</tt>¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. (X °¡ ½ÇÁ¦·Î ¸¹ÀÌ »ç¿ëÇÏ°í ÀÖ´Ù.) <tt>/usr/lib/gcc-lib/</tt><em>target</em><tt>/</tt><em/version/<tt>/</tt>¿¡ ÀÖ´Â cpp ¸¦ Ä«ÇÇÇسõ´ø°¡? ¾Æ´Ï¸é ½Éº¼¸¯ ¸µÅ©¸¦ ÇØÁØ´Ù. <label id="index.16"> <!-- /lib/cpp --> </itemize> <sect1>Çì´õ È­ÀϵéÀº ¾îµð¿¡ Àִ°¡? <label id="index.17"> <!-- header files --> <p>¿©·¯ºÐÀÌ ¼Õ¼ö <tt>/usr/local/include</tt>¿¡ ¼³Ä¡ÇÑ °Íµé »©°í ¸®´ª½º¿¡´Â 3 °¡Áö Áß¿ä Çì´õ µð·ºÅ丮°¡ ÀÖ´Ù. <itemize> <item> ´ëºÎºÐÀÇ<tt>/usr/include/</tt>¿Í ±× ÇϺΠµð·ºÅ丮µéÀº H J Lu ÀÇ libc ¹ÙÀ̳ʸ® ¹èÆ÷ÆÇ¿¡ ÀÇÇؼ­ Á¦°øµÈ´Ù. ¿©±â¼­ º»ÀÎÀº "´ëºÎºÐ"À̶ó´Â Ç¥ÇöÀ» ½è´Âµ¥, ±× ÀÌÀ¯´Â ´Ù¸¥ ¼Ò½º (¿¹¸¦ µé¾î <tt/curses/, <tt/dbm/ ¶óÀ̺귯¸®)¿¡¼­ ¿Â Çì´õÈ­Àϵ鵵 Àֱ⠶§¹®ÀÌ´Ù. ƯÈ÷³ª ÃÖ±Ù libc ¹èÆ÷ÆÇÀ» °¡Á®¿À¸é ±×·¯ÇÑ Çì´õÈ­ÀϵéÀº ¾ø´Ù. (¿¹Àü¿¡´Â °°ÀÌ ´Þ·Á¼­ ¿ÔÁö¸¸) <label id="index.18"> <!-- <linux/*.h> --> <label id="index.19"> <!-- <asm/*.h> --> <item> <tt>/usr/include/linux</tt>¿Í <tt>/usr/include/asm</tt>(<tt><linux/*.h></tt>È­ÀÏ°ú <tt><asm/*.h></tt>¿¡ ÀÇÇØ ÂüÁ¶µÇ´Â Çì´õÈ­ÀϵéÀÌ ÀÖ´Â Àå¼Ò)´Â °¢°¢ Ä¿³Î ¼Ò½º¿¡¼­ <tt>linux/include/linux</tt>¿Í <tt>linux/include/asm</tt>À» °¡¸®Å°´Â ½Éº¼¸¯ ¸µÅ©¿©¾ß ÇÑ´Ù. <em>¹º°¡ Á¶±ÝÀÌ¶óµµ Å« ÀÛ¾÷À»</em> ÇÏ·Á°í ÇÑ´Ù¸é ºÐ¸íÈ÷ ¼³Ä¡ÇØ¾ß ÇÑ´Ù. Ä¿³Î ÄÄÆÄÀÏÀ» Çϱâ À§Çؼ­¸¸ ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. <p>¶ÇÇÑ Ä¿³Î ¼Ò½º¸¦ Ç®°í ³ª¼­ <tt>make config</tt>¶ó´Â ÀÛ¾÷À» ÇØÁÖ¾î¾ß ÇÒ °ÍÀÌ´Ù. ¸¹Àº È­ÀϵéÀÌ ±× °úÁ¤À» ÅëÇؼ­ »ý°Ü³ª´Â <tt><linux/autoconf.h></tt>¶ó´Â È­ÀÏ¿¡ ÀÇÁ¸Çϱ⠶§¹®ÀÌ´Ù. ±×¸®°í ¾î¶² ¹öÀüÀÇ Ä¿³Î¿¡¼­´Â <tt/asm/ À̶ó°í ÇÏ´Â °ÍÀÌ ½Éº¼¸¯ ¸µÅ©ÀÏ »Ó, <tt/make config/ ÇÒ ¶§¸¸ »ý±â´Â °æ¿ì°¡ ÀÖ´Ù. <p>asm Àº º¸Åë <tt>asm-i386</tt>À¸·Î ¸µÅ©µÇ¾î ÀÖ´Ù. ±×Àü¿¡´Â ¿À·ÎÁö ÀÎÅÚ ¸Ó½Å¿ë Çì´õÈ­Àϸ¸ÀÌ ÀÖ¾ú±â ¶§¹®¿¡ asm ¸¸ÀÌ ÀÖ¾úÁö¸¸ ÀÌÁ¦´Â ¸®´ª½º°¡ ¸í½Ç»óºÎÇÏ°Ô ¸ÖƼÇ÷§Æû ¿î¿µÃ¼Á¦·Î ³ª¾Æ°¡°í Àֱ⠶§¹®ÀÌ´Ù. <tt>asm-i386</tt>¸»°íµµ <tt>asm-alpha</tt>, <tt>asm-generic</tt>, <tt>asm-m68k</tt>, <tt>asm-mips</tt>, <tt>asm-ppc</tt>, <tt>asm-sparc</tt>µîÀÇ Çì´õ È­ÀÏ µð·ºÅ丮°¡ ÀÖ´Â °ÍÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ <tt>/usr/src/linux</tt>¶ó°í ÇÏ´Â µð·ºÅ丮¿¡ ÀÌ¹Ì ¼Ò½º¸¦ Ç®¾î³õ¾Ò´Ù¸é... <tscreen><verb> $ 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 . </verb></tscreen> <label id="index.20"> <!-- <float.h> --> <label id="index.21"> <!-- <limits.h> --> <label id="index.22"> <!-- <varargs.h> --> <label id="index.23"> <!-- <stdarg.h> --> <label id="index.24"> <!-- <stddef.h> --> <item> <tt/<float.h>/, <tt/<limits.h>/, <tt/<varargs.h>/, <tt/<stdarg.h>/ ±×¸®°í <tt/<stddef.h>/ µîÀÇ È­ÀϵéÀº ÄÄÆÄÀÏ·¯ ¹öÀü¸¶´Ù ´Ù¸¦ °ÍÀÌ´Ù. ±×¸®°í ±×µéÀº <tt>/usr/lib/gcc-lib/i486-box-linux/2.7.2/include/</tt>¿¡ À§Ä¡ÇÏ°í ÀÖ´Ù. </itemize> <sect1>Å©·Î½º ÄÄÆÄÀÏ·¯(Cross Compiler) ¸¸µé±â <sect2>¸ñÇ¥ Ç÷§ÆûÀ¸·Î¼­ÀÇ ¸®´ª½º <p>¿©·¯ºÐÀÌ Áö±Ý gcc ¼Ò½º Äڵ带 °¡Áö°í ÀÖ´Ù°í »ý°¢ÇÏ°Ú´Ù. º¸ÅëÀº GCC ¿¡ ´ëÇÑ INSTALL È­ÀÏ¿¡¼­ Áö½ÃÇÏ´Â ´ë·Î µû¸£¸é µÈ´Ù. <tt/configure --target=i486-linux --host=XXX/ ÀÌ·± ½ÄÀ¸·Î ÇØÁִµ¥, <tt/XXX/´Â Ç÷§ÆûÀ» ¸»ÇÑ´Ù. ´ÙÀ½¿¡´Â <tt/make/ °úÁ¤À» °ÅÄ¡¸é µÈ´Ù. ¸®´ª½º Çì´õÈ­ÀÏ, Ä¿³Î Çì´õÈ­ÀÏÀÌ ÇÊ¿äÇϸç, Å©·Î½º ÄÄÆÄÀÏ·¯¿Í Å©·Î½º ¸µÄ¿¸¦ ¸¸µé±â À§Çؼ­µµ ÇÊ¿äÇÏ´Ù. <url url="ftp://tsx-11.mit.edu/pub/linux/packages/GCC/">¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. <sect2>¼Ò½º Ç÷§ÆûÀ¸·Î¼­ÀÇ ¸®´ª½º, ¸ñÇ¥ Ç÷§ÆûÀ¸·Î¼­ÀÇ MSDOS <p>Èì. ¼Ò½º¸¦ ¸®´ª½º¿¡¼­ ÀÛ¼ºÇÑ µÚ¿¡ µµ½º¿¡¼­ µ¹¾Æ°¡´Â ÇÁ·Î±×·¥À¸·Î ÄÄÆÄÀÏÇϱâ À§Çؼ­´Â <tt>emx</tt> ÆÐÅ°Áö³ª <tt>go extender</tt>¶ó´Â °ÍÀ» ÇÊ¿ä·Î ÇÑ´Ù. <url url="ftp://sunsite.unc.edu/pub/Linux/devel/msdos">¿¡ °¡¼­ °ü·Ã È­ÀÏÀ» ã¾Æº¸±â ¹Ù¶õ´Ù. º»ÀÎÀ¸·Î¼­´Â Å×½ºÆ®Çغ» ÀûÀÌ ¾øÀ¸¸ç, ¾µ¸¸ÇÏ´Ù°í ´Ü¾ðÇϱâ´Â Èûµé´Ù. <!-- *********************** SECTION ************************** --> <!-- * Porting and Compiling --> <sect>Æ÷Æðú ÄÄÆÄÀϸµ <sect1>ÀÚµ¿ÀûÀ¸·Î Á¤ÀǵǴ ½Éº¼µé <label id="index.25"> <!-- gcc, flags --> <p>¿©·¯ºÐÀº ¿©·¯ºÐÀÌ °®°í ÀÖ´Â ¹öÀüÀÇ gcc°¡ <tt/-v/ ¿É¼ÇÀ» ºÙÀÓÀ¸·Î½á ¾î¶°ÇÑ ½Éº¼À» ÀÚµ¿ÀûÀ¸·Î Á¤ÀÇÇÏ´ÂÁö ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î º»ÀÎÀÇ °ÍÀº ´ÙÀ½°ú °°´Ù. <tscreen><verb> $ 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__ - </verb></tscreen> ¸¸¾à ¿©·¯ºÐÀÇ Äڵ尡 ¸®´ª½º¿¡¸¸ °ü°èµÇ´Â ÄÚµå¶ó¸é, ´ÙÀ½°ú °°ÀÌ ÇØÁÖ´Â °ÍÀÌ ÁÁ´Ù. <tscreen><verb> #ifdef __linux__ /* ... funky stuff ... */ #endif /* linux */ </verb></tscreen> <tt>__linux__</tt>¶ó´Â À̸§À» »ç¿ëÇ϶ó. <tt/linux/°¡ <em>¾Æ´Ï´Ù</em>. ÈÄÀÚ°¡ Á¤ÀǵǾî ÀÖ±â´Â ÇÏÁö¸¸ POSIX ±Ô°Ý¿¡´Â ¸ÂÁö ¾Ê±â ¶§¹®ÀÌ´Ù. <!-- what does this mean? are we talking namespace issues here? --> <sect1>ÄÄÆÄÀÏ·¯ ºÎ¸£±â <p>ÄÄÆÄÀÏ·¯ ½ºÀ§Ä¡µé¿¡ ´ëÇÑ ¹®¼­´Â gcc info ÆäÀÌÁö¸¦ º¸¸é µÈ´Ù. (¿©·¯ºÐÀÌ Emacs¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é <tt>C-h i</tt>±×¸®°í ³ª¼­ gcc ¿É¼ÇÀ» ¼±ÅÃÇ϶ó) ¿©·¯ºÐÀÌ °®°í ÀÖ´Â ¹èÆ÷ÆÇÀ» ¸¸µç »ç¶÷ÀÌ gcc info ÆäÀÌÁö¸¦ ³Ö¾îÁö ¾Ê¾ÒÀ» ¼öµµ ÀÖ°í, ¶Ç´Â ¿¾ ¹öÀüÀÇ °ÍÀÌ µé¾î°¡ ÀÖÀ» ¼öµµ ÀÖ´Ù. °¡Àå ÁÁÀº ¹æ¹ýÀº <url url="ftp://prep.ai.mit.edu/pub/gnu">³ª ¶Ç´Â ¹Ì·¯ »çÀÌÆ®·Î °¡¼­ gcc ¼Ò½º Äڵ带 ¹Þ¾Æ¿À´Â °ÍÀÌ´Ù. ±×¸®°í ±× ¼Ò½º ¾È¿¡¼­ Ä«ÇÇÇؿ´Ù. gcc ¿¡ ´ëÇÑ ¸ÇÆäÀÌÁö(<tt/gcc.1/)´Â ÀϹÝÀûÀ¸·Î ½Ã´ë¿¡ µÚ¶³¾îÁ® ÀÖ´Ù°í ¸»ÇÒ ¼ö ÀÖ´Ù. ¸ÇÆäÀÌÁö¸¦ º¸·Á°í ÇÏ¸é ±×·¯ÇÑ °æ°í ¹®±¸¸¦ º¼ ¼ö ÀÖ´Ù. <sect2>ÄÄÆÄÀÏ·¯ Ç÷¡±×(flag) <label id="index.26"> <!-- gcc, flags --> <label id="index.27"> <!-- optimisation --> <p>gcc¸¦ »ç¿ëÇÒ ¶§, <tt/-O/<em/n/(¿©±â¼­ <em/n/Àº ÀÛÀº ¾çÀÇ Á¤¼öµé, »ý·«Çصµ µÈ´Ù)À» Ä¿¸Çµå ¶óÀÎ ¿É¼ÇÀ¸·Î ³Ö¾îÁÖ¸é Ãâ·Â Äڵ尡 ÃÖÀûÈ­µÈ´Ù. ¿©±â¼­ »ç¿ëµÇ´Â <em/n/ °ª Áß¿¡¼­ ½ÇÁ¦ Àǹ̸¦ °®´Â °ªµéÀº gccÀÇ ¹öÀü¿¡ µû¶ó ´Ù¸¥µ¥, ÀϹÝÀûÀ¸·Î 0 (ÃÖÀûÈ­ÇÏÁö ¾ÊÀ½)ºÎÅÍ ½ÃÀÛÇؼ­ 2(»ó´çÈ÷ ¸¹ÀÌ ÃÖÀûÈ­), 3(¾ÆÁÖ¾ÆÁÖ ¸¹ÀÌ ÃÖÀûÈ­)±îÁö ¾²ÀδÙ. ³»ºÎÀûÀ¸·Î gcc´Â ÀÌ ¿É¼ÇÀ» <tt/-f/¿Í <tt/-m/ À̶ó´Â ¿É¼Çµé·Î ¹Ù²Ù¾î¼­ ó¸®ÇÏ°Ô µÈ´Ù. <tt>-O</tt>ÀÇ Æ¯Á¤ ·¹º§ÀÌ ¾î¶² Àǹ̸¦ °®´ÂÁö¿¡ ´ëÇؼ­´Â gcc ½ÇÇà½Ã¿¡ <tt/-v/¿Í <tt/-Q/(¹®¼­È­µÇÁö ¾Ê¾ÒÀ½)Ç÷¡±×¸¦ ºÙ¿©ÁÜÀ¸·Î½á È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î <tt>-O2</tt>´Â ´ÙÀ½°ú °°ÀÌ ³ªÅ¸³­´Ù. (»ç¶÷µé¸¶´Ù ¼­·Î ´Ù¸¦ ¼ö ÀÖ´Ù) <tscreen><verb> 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 </verb></tscreen> ¿©·¯ºÐÀÇ ÄÄÆÄÀÏ·¯°¡ Áö¿øÇÏ°í ÀÖ´Â ÃÖÀûÈ­ ·¹º§º¸´Ù Å« ¼ýÀÚ¸¦ »ç¿ëÇÑ´Ù¸é (¿¹¸¦ µé¾î <tt>-O6</tt>), <em>±× ÄÄÆÄÀÏ·¯°¡ Áö¿øÇÏ´Â ÃÖÀûÀÇ ·¹º§·Î</em> ÃÖÀûÈ­½ÃÄÑÁØ´Ù. ÀÌ·± ½ÄÀ¸·Î ÄÄÆÄÀϵǵµ·Ï ¼¼ÆõǾî ÀÖ´Â Äڵ带 ¹èÆ÷ÇÏ´Â °ÍÀº º°·Î ÁÁÀº »ý°¢Àº ¾Æ´Ñ °Í °°´Ù. ´õ ¸¹Àº ÃÖÀûÈ­ ·¹º§µéÀÌ Â÷ÈÄ gcc ¹öÀü¿¡ »ý±ä´Ù¸é, À߸øÇÏ¸é ¿©·¯ºÐÀÇ ¼Ò½º Äڵ尡 ¾û¶×ÇÏ°Ô ÄÄÆÄÀϵǴ ¼öµµ ÀÖ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ Áö±Ý <tt>-O3</tt>ÀÌ ÃÖ°í ·¹º§À̶ó´Â °¡Á¤ÇÏ¿¡¼­ <tt>-O6</tt>¸¦ »ç¿ëÇß´Ù°í Ä¡ÀÚ. ÇÏÁö¸¸ ´ÙÀ½ ¹öÀü(¿¹¸¦ µé¾î¼­ 2.7.3.?)¿¡¼­ <tt>-O8</tt>±îÁö Áö¿øÇÏ°Ô µÈ´Ù¸é <tt>-O6</tt>´Â ÀüÇô ¾û¶×ÇÑ Àǹ̸¦ °¡Áú ¼öµµ ÀÖ´Ù. <label id="index.28"> <!-- gcc, bugs --> gcc ¹öÀü 2.7.0 ºÎÅÍ 2.7.2 ±îÁöÀÇ »ç¿ëÀÚµéÀº <tt>-O2</tt> ÃÖÀûÈ­ Ç÷¡±×¿¡ ¹ö±×°¡ ÀÖ´Ù´Â »ç½ÇÀ» Àß ¾Ë¾ÆµÎ±â ¹Ù¶õ´Ù. Strength ReductionÀ̶ó°í ÇÏ´Â °ÍÀÌ Á¦´ë·Î ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Â ÆÐÄ¡°¡ ÀÖ°í ´Ù½Ã gcc ¸¦ ÄÄÆÄÀÏÇØ¾ß ÇÒ°ÍÀÌ´Ù. ¶Ç´Â ¾ðÁ¦³ª <tt/-fno-strength-reduce/ ¶ó´Â ¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏÇϱ⠹ٶõ´Ù. <!-- I need a source for this patch --> <sect3>ÇÁ·Î¼¼¼­º° ¿É¼Ç <p><tt/-O/ ¿É¼ÇÀ» Á־ ÀÚµ¿ÀûÀ¸·Î ÀÛµ¿ÇÏÁö ¾Ê´Â <tt/-m/ Ç÷¡±×µéÀÌ ÀÖ´Ù. ÇÏÁö¸¸ À̵éÀº »ó´çÈ÷ À¯¿ëÇÏ´Ù. Áß¿äÇÑ °ÍÀ¸·Î´Â <tt/-m386/°ú <tt/-m486/ÀÌ ÀÖ´Ù. ÀÌ Ç÷¡±×µéÀº gcc´õ·¯ °¢°¢ 386, 486Áß ¾î¶² °Í¿¡ ´õ ¸ÂÃç¼­ ÄÄÆÄÀÏÇÒ °ÍÀÎÁö¸¦ ¾Ë·ÁÁÖ´Â °ÍÀÌ´Ù. -m486À¸·Î ÄÄÆÄÀÏÇÏ¿´´Ù°í ÇÏ´õ¶óµµ 386 ¿¡¼­ ½ÇÇàµÇ´Âµ¥´Â ÁöÀå¾ø´Ù. ±×·¯´Ï °ÆÁ¤ÇÒ ÇÊ¿ä¾ø´Ù. 486 Äڵ尡 Á¶±Ý ´õ Å©Áö¸¸ 386 ¿¡¼­ ´À·ÁÁö°Å³ª ÇÏÁö´Â ¾Ê´Â´Ù. ¾ÆÁ÷±îÁö´Â <tt>-mpentium</tt>À̳ª <tt>-m586</tt>°ú °°Àº °ÍÀº ¾ø´Ù. ¸®´©½º(Linus)´Â 486 ÄÚµå¿ÉƼ¸¶ÀÌÁîµÈ Äڵ带 ¾òÀ¸¸é¼­µµ ÆæƼ¾öÀÌ »ç¿ëÇÏÁö ¾Ê´Â Á¤·Ä¹æ½Ä°úÀÇ Ä¿´Ù¶õ Â÷ÀÌÁ¡ÀÌ ¾ø´Â Äڵ带 ¾ò±â À§Çؼ­´Â, <tt/-m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2/¸¦ »ç¿ëÇÒ °ÍÀ» Á¦¾ÈÇÏ°í ÀÖ´Ù. Michael Meissner(Cygnus¿¡ ÀÖ´Â)´Â ´ÙÀ½°ú °°ÀÌ ¸»ÇÏ°í ÀÖ´Ù. <quote> ³» À°°¨À¸·Î´Â <tt/-mno-strength-reduce/¸¦ °°ÀÌ ¾²¸é ¶ÇÇÑ x86 ¿¡¼­ ´õ ºü¸¥ Äڵ带 ¾ò¾î³¾ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. (ÁÖÀÇ! ³ª´Â Áö±Ý strength reduction ¹ö±×¿¡ ´ëÇؼ­ ¸»ÇÏ°í ÀÖ´Â °ÍÀÌ ¾Æ´Ï´Ù. ±×°ÍÀº ÀüÇô ´Ù¸¥ ¹®Á¦ÀÌ´Ù) ¿Ö³ÄÇϸé x86Àº ´Ù¼Ò ·¹Áö½ºÅÍ ¼ýÀÚ°¡ Àû±â ¶§¹®ÀÌ´Ù. (±×¸®°í ´Ù¸¥ ·¹Áö½ºÅÍ¿¡ ´ëÇÏ¿© ·¹Áö½ºÅ͵éÀ» ±×·ìÀ¸·Î ¹­¾î¼­ spill ·¹Áö½ºÅÍ ¼ÓÀ¸·Î ó¸®ÇÏ´Â GCC ÀÇ Ã³¸®¹æ½ÄÀº ÀüÇô µµ¿òÀÌ µÇÁú ¾Ê´Â´Ù) StrengthReductionÀº ÀüÇüÀûÀ¸·Î °ö¼ÀÀ» µ¡¼ÀÀ¸·Î ±³Ã¼Çϱâ À§ÇÏ¿© ´Ù¸¥ ·¹Áö½ºÅ͵éÀ» »ç¿ëÇÏ°Ô µÈ´Ù. <tt/-fcaller-saves/ ¶ÇÇÑ ÀÌ·± ¹®Á¦Á¡ÀÌ ÀÖÁö ¾Ê³ª »ý°¢ÇÏ°í ÀÖ´Ù. </quote> <quote> ¶Ç ´Ù¸¥ ¿¹°¨Àº ÀÌ·¸´Ù. <tt/-fomit-frame-pointer/´Â µµ¿òÀÌ µÉ ¼öµµ ÀÖ°í, ±×·¸Áö ¾ÊÀ» ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. ÇÑ ÆíÀ¸·Î´Â ¶Ç ´Ù¸¥ ·¹Áö½ºÅÍ°¡ ÇÒ´ç°¡´ÉÇÏ´Ù´Â °ÍÀ» ÀǹÌÇÒ ¼öµµ ÀÖ°í, ´Ù¸¥ ÇÑ ÆíÀ¸·Î´Â x86 ÀÌ ¿¬»êÁö½Ã(instruction)¿¡ ´ëÇÏ¿© ÀÎÄÚµùÇÏ´Â ¹æ½ÄÀ¸·Î¼­, ½ºÅà »ó´ëÀû ÁÖ¼Ò°¡ ÇÁ·¹ÀÓ »ó´ëÀû ÁÖ¼Òº¸´Ùµµ ´õ ¸¹Àº °ø°£À» Â÷ÁöÇÑ´Ù´Â °ÍÀ» ÀǹÌÇϱ⵵ ÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é ÇÁ·Î±×·¥¿¡ »ç¿ëµÉ ¼ö ÀÖ´Â IcacheÀÌ ¾à°£ ÁÙ¾îµç´Ù. ¶ÇÇÑ <tt/-fomit-frame-pointer/´Â ÄÄÆÄÀÏ·¯°¡ °è¼ÓÀûÀ¸·Î È£Ãâ ÈÄ¿¡µµ ½ºÅà Æ÷ÀÎÅ͸¦ Á¶Á¤ÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ¶æÇÑ´Ù. µû¶ó¼­ ÇÁ·¹ÀÓÀ» °®´Â °æ¿ì, ¸î ¹øÀÇ È£Ã⸸À¸·Îµµ ½ºÅÃÀÌ °¡µæ Â÷°Ô µÈ´Ù. </quote> ¸¶Áö¸· ¸»Àº ¸®´©½º ¶ÇÇÑ ¾ð±ÞÇÏ°í ÀÖ´Ù. <quote> ¸¸¾à ¿©·¯ºÐÀÌ ÃÖÀûÈ­µÈ È¿À²À» ¿øÇÑ´Ù¸é, ³ª¸¦ ¹ÏÁö ¸»¶ó. ½ÇÁ¦·Î Å×½ºÆ®¸¦ ÇغÁ¾ß ÇÑ´Ù. gcc ÄÄÆÄÀÏ·¯ÀÇ ¿É¼ÇÀº Á¤¸»·Î ¸¹´Ù. ±×¸®°í ¸î °³ÀÇ Æ¯Á¤ Á¶ÇÕÀÌ °¡Àå ÁÁÀº ÃÖÀûÈ­¸¦ ÀÌ·ïÁÙ °ÍÀÌ´Ù. </quote> <!-- TODO: url for pentium gcc--> <sect2> <tt/Internal compiler error: cc1 got fatal signal 11/ <label id="index.29"> <!-- gcc, bugs --> <label id="index.30"> <!-- segmentation fault --> <label id="index.31"> <!-- SIGSEGV --> <label id="index.32"> <!-- SIGSEGV, in gcc --> <label id="index.33"> <!-- segmentation fault, in GCC --> <p>½Ã±×³Î 11¹øÀº SIGSEGV, Áï ¼¼±×¸ÕÅ×ÀÌ¼Ç À§¹Ý¿¡ ´ëÇÑ ½Ã±×³ÎÀÌ´Ù. ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¥ÀÌ Æ÷ÀÎÅ͸¦ À߸ø ½è´Ù´Â ¸»À̰ųª ÀڱⰡ ¼ÒÀ¯ÇÏ°í ÀÖÁö ¾ÊÀº ¸Þ¸ð¸®¿¡´Ù ¾²±â ÀÛ¾÷À» ÇÏ·Á°í ÇÒ ¶§ ¹ß»ýÇÑ´Ù. ±×·¡¼­ ÀÌ´Â gccÀÇ ¹ö±×ÀÏ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ gcc´Â ´ëºÎºÐÀÇ ÀÛ¾÷¿¡¼­ ¸Å¿ì ¾ÈÁ¤ÀûÀÌ°í Å×½ºÆÃÀ» ¸¹ÀÌ °ÅÄ£ ¼ÒÇÁÆ®¿þ¾î¶ó´Â »ç½ÇÀ» ±â¾ïÇ϶ó. gcc´Â ¶ÇÇÑ º¹ÀâÇÑ ÀÚ·á ±¸Á¶¿Í Æ÷ÀÎÅ͸¦ ¾öû³ª°Ô ¸¹ÀÌ »ç¿ëÇÏ°í ÀÖ´Ù. °£´ÜÈ÷ ¸»ÇÏÀÚ¸é ÇöÀç±îÁö ¼ÒÇÁÆ®¿þ¾î Áß¿¡¼­ °¡Àå ¶Ù¾î³­ ·¥ Å×½ºÆà ÇÁ·Î±×·¥(RAM Tester)À̶ó°í ¸»ÇÒ ¼öµµ ÀÖ´Ù. <em>¸¸¾à ¸Å¹ø ÄÄÆÄÀÏÇÒ ¶§¸¶´Ù ¸ØÃß´Â À§Ä¡°¡ ´Ù¸£´Ù¸é</em> ÀÌ´Â °ÅÀÇ ´ëºÎºÐ ¿©·¯ºÐ Çϵå¿þ¾îÀÇ ¹®Á¦¶ó°í ºÁµµ µÈ´Ù. (CPU, ¸Þ¸ð¸®, ¸¶´õº¸µå³ª ij½¬) ¿©·¯ºÐÀÇ ÄÄÇ»ÅÍ°¡ ÆÄ¿ö ¿Â üŷÀ» °ÅÃļ­ Àß ºÎÆõǾú°í ±×¸®°í À©µµ¿ìÁî °°Àº °Íµµ Àß µ¹¾Æ°£´Ù°í Çؼ­ <bf>±×°ÍÀ» gccÀÇ ¹ö±×·Î µ¹¸®Áö´Â ¸»¶ó</bf>. ÀÌ·¯ÇÑ »ç½ÇÀº ¹«ÀǹÌÇÏ´Ù. ±×¸®°í Ä¿³Î ÄÄÆÄÀÏÇϸ鼭 <tt>make zImage</tt>¿¡¼­ ²À ¸ØÃá´Ù°í Çؼ­ gccÀÇ ¹ö±×¶ó°í ¸»ÇÒ ¼ö´Â ¾ø´Ù. <tt>make zImage</tt>´Â ¹«·Á 200°³ ÀÌ»óÀÇ È­ÀÏÀ» ÄÄÆÄÀÏÇÏ°í ÀÖ´Ù. ±×°Íº¸´Ù´Â <em>Á» ÀÛÀº °æ¿ì</em>¸¦ ã¾Æº¸µµ·Ï ÇÏÀÚ. <p>¸¸¾à °è¼ÓÀûÀ¸·Î ¹ö±×°¡ ¶È°°ÀÌ ³ªÅ¸³ª°í Àڱ׸¶ÇÑ ÇÁ·Î±×·¥ ÄÄÆÄÀÏ¿¡¼­µµ ±×·¯ÇÏ´Ù¸é, FSF¿¡´Ù°¡ ¹ö±× ¸®Æ÷Æ®¸¦ Çصµ µÇ°í, ¶Ç´Â linux-gcc ¸ÞÀϸµ ¸®½ºÆ®¿¡ ±ÛÀ» ¿Ã·Áµµ µÈ´Ù. ±×·¯±â À§Çؼ­´Â ¿ì¼± gcc ¹®¼­¸¦ Àо°í ¾î¶² ÀýÂ÷°¡ ÇÊ¿äÇÑÁö ¼÷ÁöÇÑ ´ÙÀ½ Çϱ⠹ٶõ´Ù. <!-- pointer to the sig11 faq --> <sect1>Æ÷ÆÃ(Portability) <!-- 25) How do I port program XXX to Linux ? --> <p>¿äÁòÀº ¸¸¾à ±× ¼ÒÇÁÆ®¿þ¾î°¡ ¸®´ª½º·Î Æ÷ÆÃµÉ ¼ö ¾ø´Ù¸é ±× ¼ÒÇÁÆ®¿þ¾î´Â °¡Ä¡°¡ ¾ø´Â ÇÁ·Î±×·¥À̶ó°í ¸»ÇÑ´Ù. :-) ÁøÁöÇÏ°Ô ¸»ÇÏÀÚ¸é, ÀϹÝÀûÀ¸·Î ¸®´ª½ºÀÇ 100% POSIX ȣȯ¼ºÀ» ÀÌ·ç±â À§Çؼ­´Â ¾ÆÁÖ ¾à°£ÀÇ ¼öÁ¤ÀÛ¾÷¸¸ÀÌ ÇÊ¿äÇÏ´Ù. ¶ÇÇÑ ´ÜÁö make ¶ó°í¸¸ ÇÏ¸é ½ÇÇàÈ­ÀÏÀÌ ¸¸µé¾îÁú ¼ö ÀÖµµ·Ï Çϱâ À§ÇÏ¿© ÄÚµåÀÇ ¿øÀúÀÚ¿¡°Ô ¼öÁ¤ Äڵ带 º¸³»´Â °ÍÀ̾߸»·Î °¡Ä¡ÀÖ´Â ÀÏÀÌ´Ù. <sect2> BSDisms (<tt/bsd_ioctl/, <tt/daemon/ ±×¸®°í <tt/<sgtty.h>/) <p>¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥À» <tt>-I/usr/include/bsd</tt>¸¦ ³Ö¾î¼­ ÄÄÆÄÀÏÇÑ ÈÄ, <tt>-lbsd</tt> ¿É¼ÇÀ» ³Ö°í ¸µÅ©ÇÒ ¼öµµ ÀÖ´Ù. (Áï Makefile ¾È¿¡¼­ <tt>-I/usr/include/bsd</tt>¸¦ <tt>CFLAGS º¯¼ö</tt>¿¡ ³Ö°í, <tt>-lbsd</tt>¸¦ <tt>LDFLAGS</tt>¿¡ ³ÖÀ½À¸·Î½á) ÀÌÁ¨ BSD ŸÀÔÀÇ ½Ã±×³Î ÇൿÀ» ¾ò¾î³»±â À§Çؼ­ <tt>-D__USE_BSD_SIGNAL</tt>¸¦ <em>µ¡ºÙÀÏ ÇÊ¿ä°¡ ¾ø´Ù</em>. ¿Ö³ÄÇϸé <tt>-I/usr/include/bsd</tt>¶ó°í ÇØÁÖ°í <tt/<signal.h>/¸¦ ¼Ò½º ¾È¿¡¼­ Æ÷ÇÔÇÏ¸é ¸ðµç ÀÏÀÌ Á¦´ë·Î ÀÌ·ç¾îÁø´Ù. <sect2> ¾ø¾îÁø ½Ã±×³Îµé (<tt/SIGBUS/, <tt/SIGEMT/, <tt/SIGIOT/, <tt/SIGTRAP/, <tt/SIGSYS/ µî) <label id="index.34"> <!-- <tt/SIGBUS/ --> <label id="index.35"> <!-- <tt/SIGEMT/ --> <label id="index.36"> <!-- <tt/SIGIOT/ --> <label id="index.37"> <!-- <tt/SIGTRAP/ --> <label id="index.38"> <!-- <tt/SIGSYS/ --> <p>¸®´ª½º´Â POSIX¸¦ ÁؼöÇÏ°í ÀÖ´Ù. ÀÌ·¯ÇÑ ½Ã±×³ÎµéÀº POSIX Á¤ÀÇ ½Ã±×³ÎµéÀÌ ¾Æ´Ï´Ù. ÀÌ´Â ISO/IEC 9945-1:1990 (IEEE Std 1003.1-1990), paragraph B.3.3.1.1 ¿¡¼­ ´ÙÀ½°ú °°ÀÌ ¸»ÇÏ°í ÀÖ´Â ¹ÙÀÌ´Ù. <quote> SIGBUS, SIGEMT, SIGIOT, SIGTRAP, ±×¸®°í SIGSYS¿Í °°Àº ½Ã±×³ÎµéÀº POSIX.1À¸·ÎºÎÅÍ Á¦¿ÜµÇ¾ú´Ù. ¿Ö³ÄÇÏ¸é ±×µéÀÇ ÇൿÀº ÇÔÃàÀûÀÌ°í ¾î¶»°Ô ºÎ¸£´À³Ä¿¡ µû¶ó ´Ù¸£±â ¶§¹®¿¡ ÀûÀýÇÏ°Ô ¹üÁÖÈ­½Ãų ¼ö°¡ ¾ø´Ù. ÀÌ·¯ÇÑ ½Ã±×³ÎµéÀ» ¾ø¾Ö¹ö¸®´Â °ÍÀÌ ±Ô¾à ÁؼöÀÏ ¼öµµ ÀÖÁö¸¸, ¿Ö ±× ½Ã±×³ÎµéÀ» Á¦¿ÜÇعö·È´ÂÁö¿¡ ´ëÇؼ­ ¹®¼­È­ÇØ¾ß ÇÑ´Ù. ±×¸®°í ±× ½Ã±×³ÎµéÀ» ¾î¶»°Ô ó¸®ÇÒ °ÍÀΰ¡¿¡ ´ëÇؼ­´Â ¾Æ¹«·± °­Á¦ ±ÔÁ¤µµ ¾ø´Ù. </quote> <p>ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Â °¡Àå °£´ÜÇÑ ¹æ¹ýÀº ÀÌ·¯ÇÑ ½Ã±×³ÎµéÀ» ¸ðµÎ <tt/SIGUNUSED/·Î ÀçÁ¤ÀÇÇÏ´Â °ÍÀÌ´Ù. <em>¹Ù¸¥</em>¹æ¹ýÀº ¹°·Ð ÀÌ·¯ÇÑ ½Ã±×³ÎÀ» ó¸®ÇÏ´Â ºÎºÐÀ» <tt>#ifdef</tt> ¹®ÀåÀ» ½á¼­ ó¸®Çϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù. <tscreen><verb> #ifdef SIGSYS /* ... POSIX ±ÔÁ¤ÀÌ ¾Æ´Ñ SIGSYS Äڵ尡 ¿©±â¿¡ ¿Â´Ù .... */ #endif </verb></tscreen> <sect2> K & R ÄÚµå <label id="index.39"> <!-- <tt/-fwritable-strings/ --> <p>GCC´Â ANSI ÄÄÆÄÀÏ·¯ÀÌ´Ù. ÇÏÁö¸¸ ¾ÆÁÖ ¸¹Àº ÄÚµåµéÀÌ ANSI°¡ ¾Æ´Ï´Ù. ÀÌ·² ¶§´Â ÄÄÆÄÀÏ·¯ Ç÷¡±×¿¡ <tt>-traditional</tt> À̶ó°í¸¸ ºÙ¿©ÁÖ¸é µÈ´Ù°í ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ±«·Ó°Ô ¼öÀÛ¾÷À» ÇØÁà¾ß ÇÏ´Â ºÎºÐµµ ¸¹ÀÌ ÀÖ´Ù. gcc info ÆäÀÌÁö¸¦ »ìÆ캸±â ¹Ù¶õ´Ù. <tt/-traditional/¶ó´Â ¿É¼ÇÀº gcc °¡ ÀÌ¿ëÇÏ·Á°í ÇÏ´Â C ¾ð¾î ¹æ½ÄÀ» ¹Ù²Ù´Â °Í ¸»°íµµ ´Ù¸¥ È¿°ú¸¦ Áö´Ï°í ÀÖ´Ù. ¿¹¸¦ µé¾î ±× ¿É¼ÇÀº <tt>-fwritable-strings</tt>À» ÀÛµ¿½ÃÅ°´Âµ¥, ¹®ÀÚ¿­ »ó¼ö¸¦ µ¥ÀÌŸ ¿µ¿ªÀ¸·Î º¸³»´Â ¿ªÇÒÀ» ÇÑ´Ù. (ÅؽºÆ® ¿µ¿ª, Áï ±×µéÀÌ ¾µ ¼ö ¾ø´Â ¿µ¿ªÀ» ¸»ÇÑ´Ù) ÀÌ·± °æ¿ì ÇÁ·Î±×·¥ÀÇ ¸Þ¸ð¸® »ç¿ëÈçÀû(footprint)ÀÌ Áõ°¡ÇÏ°Ô µÈ´Ù. <sect2>Àü󸮱⠽ɺ¼ÀÌ ÄÚµåÀÇ ÇÁ·ÎÅäŸÀÔ°ú Ãæµ¹ÇÒ ¶§ <label id="index.40"> <!-- <tt/atoi()/ --> <label id="index.41"> <!-- <tt/atol()/ --> <p>¸¹ÀÌ ¹ß»ýÇÏ´Â ¹®Á¦µé Áß¿¡ Çϳª°¡ ¹Ù·Î ¸î¸î ÇÔ¼öµéÀÌ ÀÌ¹Ì ¸®´ª½º Çì´õÈ­Àϵ鿡 ¸ÅÅ©·Î·Î Á¤ÀǵǾî ÀÖ°í Àü󸮱Ⱑ ÄÚµå ³»¿¡¼­ À¯»çÇÑ ÇÁ·ÎÅäŸÀÔ¿¡ ´ëÇÏ¿© ó¸® °ÅºÎ¸¦ ÇÏ´Â °æ¿ìÀÌ´Ù. º¸Åë <tt/atoi()/¿Í <tt/atol()/ÀÎ °æ¿ì°¡ ¸¹´Ù. <sect2><tt>sprintf()</tt> <label id="index.42"> <!-- <tt/sprintf()/ --> <p><tt/sprintf(string, fmt, ...)/ÀÌ ¸¹Àº À¯´Ð½º ½Ã½ºÅÛ¿¡¼­´Â <tt>¹®ÀÚ¿­</tt>¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÏ´Â ¹Ý¸é¿¡ ANSI¸¦ µû¸£´Â ¸®´ª½º´Â ¹®ÀÚ¿­¿¡ »ðÀÔµÈ ¹®ÀÚÀÇ °¹¼ö¸¦ ¹ÝȯÇÑ´Ù. À̴ ƯÈ÷³ª SunOS¿Í °°Àº °ÍÀ¸·ÎºÎÅÍ Æ÷ÆÃÇÏ´Â °æ¿ì¿¡ ´õ¿í ÁÖÀÇÇØ¾ß ÇÑ´Ù. <sect2><tt/FD_*/ °°Àº °Íµé? <tt/fcntl/°ú ±× ºñ½ÁÇÑ ³à¼®µé. µµ´ëü Á¤ÀǺκÐÀÌ ¾îµð¿¡ Àִ°¡? <label id="index.43"> <!-- <tt/FD_SET/ --> <label id="index.44"> <!-- <tt/FD_CLR/ --> <label id="index.45"> <!-- <tt/FD_ISSET/ --> <label id="index.46"> <!-- <tt/FD_ZERO/ --> <label id="index.47"> <!-- <tt/fcntl/ --> <label id="index.48"> <!-- <tt><sys/time.h></tt> --> <label id="index.49"> <!-- <tt><unistd.h></tt> --> <p><tt><sys/time.h></tt>¿¡ ÀÖ´Ù. ¸¸¾à <tt/fcntl/À» ÀÌ¿ëÇÏ°íÀÚ ÇÑ´Ù¸é ½ÇÁ¦ ÇÁ·ÎÅäŸÀÔÀ» À§ÇÏ¿© <tt/<unistd.h>/ ¶ÇÇÑ Æ÷ÇÔ½ÃÅ°°í ½ÍÀ» °ÍÀÌ´Ù. ÀϹÝÀûÀ¸·Î ¸»ÇÏÀÚ¸é ¾î¶² ÇÔ¼ö¿¡ ´ëÇÑ ¸ÇÆäÀÌÁö¸¦ º¸¸é SYNOPSYS ºÎºÐ¿¡¼­ ¾î¶² Çì´õÈ­ÀÏÀ» <tt/#include/ ÇؾßÇÏ´ÂÁö ÀÚ¼¼È÷ ³ªÅ¸³»ÁÖ°í ÀÖÀ¸´Ï ±×°ÍÀ» Âü°íÇϱ⠹ٶõ´Ù. <!-- These courtesy of Bruno Haible--> <sect2><tt>select()</tt>¿¡¼­ ŸÀӾƿôÀÌ °É¸®°í ÇÁ·Î±×·¥ÀÌ °è¼Ó ±â´Ù¸®±â¸¸ ÇÑ´Ù. <label id="index.50"> <!-- select() --> <P>¿¹Àü¿¡´Â <tt>select()</tt>¿¡ ´ëÇÑ Å¸ÀӾƿô ÆĶó¹ÌÅÍ°¡ ÀбâÀü¿ëÀ¸·Î¸¸ »ç¿ëµÇ¾ú´Ù. ±×¸®°í ±× ¶§¿¡µµ ¸ÇÆäÀÌÁö¿¡´Â ´ÙÀ½°ú °°Àº °æ°í°¡ ÀÖ¾ú´Ù. <quote> select()´Â ¾Æ¸¶µµ ÀûÀýÇÑ °÷¿¡ ÀÖ´Â ½Ã°£°ªÀ» º¯°æÇÔÀ¸·Î½á ¸¸¾à¿¡ ±×·¯ÇÑ ÀÏÀÌ ¹ß»ýÇÑ´Ù¸é ¿ø·¡ÀÇ Å¸ÀӾƿôºÎÅÍ ³²Àº ½Ã°£À» ¹ÝȯÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÌ ±â´ÉÀº Â÷±â ¹öÀü¿¡¼­³ª ±¸ÇöµÉ °ÍÀÌ´Ù. µû¶ó¼­ ŸÀÓ ¾Æ¿ô Æ÷ÀÎÅÍ°¡ select() È£Ãâ¿¡ ÀÇÇÏ¿© ¼öÁ¤µÇÁö ¾ÊÀ» °ÍÀ̶ó°í »ý°¢ÇÏ´Â °ÍÀº ¹Ù¶÷Á÷ÇÏÁö ¸øÇÏ´Ù. </quote> ¹Ù·Î ±× ³¯ÀÌ ¿Ô´Ù! ÃÖ¼ÒÇÑ ±×°ÍÀÌ ÀÌ·ç¾îÁö°í ÀÖ´Ù. <tt/select()/È£Ãâ·ÎºÎÅÍ µ¹¾Æ¿Ã ¶§, ŸÀӾƿô Àμö´Â µ¥ÀÌÅÍ°¡ µµÂøÇÏÁö ¾Ê´Â´Ù¸é ±â´Ù¸®·Á°í Çß´ø ÀÜ·ù ½Ã°£À¸·Î ¼¼ÆõȴÙ. ¸¸¾à ¾Æ¹« µ¥ÀÌÅ͵µ µµÂøÇÏÁö ¾Ê¾Ò¾ú´Ù¸é ÀÌ °ªÀº 0(zero)ÀÌ µÇ¾úÀ» °ÍÀÌ´Ù. ±×¸®°í °°Àº ŸÀӾƿô ±¸Á¶Ã¼¸¦ °¡Áö°í È£ÃâÀ» ÇÏ°Ô µÇ¸é È£Ãâ Áï½Ã µÇµ¹¾Æ¿Ã °ÍÀÌ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â ŸÀӾƿô °ªÀ» ¸Å¹ø <tt/select()/¸¦ È£ÃâÇÒ ¶§¸¶´Ù °ü·Ã ±¸Á¶Ã¼¿¡ Àû¾îÁÖ¾î¾ß ÇÑ´Ù. ´ÙÀ½°ú °°Àº Äڵ尡 ÀÖ´Ù¸é, <tscreen><verb> struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; while (some_condition) select(n,readfds,writefds,exceptfds,&ero;timeout); </verb></tscreen> ¾Æ·¡¿Í °°ÀÌ ¹Ù²Ùµµ·Ï Ç϶ó. <tscreen><verb> struct timeval timeout; while (some_condition) { timeout.tv_sec = 1; timeout.tv_usec = 0; select(n,readfds,writefds,exceptfds,&ero;timeout); } </verb></tscreen> ¸ðÀÚÀÍ(Mosaic)ÀÇ ¸î¸î ¹öÀüÀÌ ÇÑ ¶§ ÀÌ·¯ÇÑ ¹®Á¦·Î ¶°µé½âÇß¾ú´Ù. ȸÀüÇÏ´Â Áö±¸ ¾Ö´Ï¸ÅÀ̼ÇÀÇ ¼Óµµ°¡ ³×Æ®¿öÅ©¸¦ ÅëÇØ µé¾î¿À´Â ÀÚ·áÀÇ ¼Óµµ¿¡ ¹Ýºñ·¹ÇÏ´Â ÀÏÀÌ ¹ú¾îÁø °ÍÀÌ´Ù! <sect2>½Ã½ºÅÛ È£ÃâÀÌ ÀÎÅÍ·´Æ®µÉ ¶§ <label id="index.51"> <!-- interrupted system calls --> <label id="index.52"> <!-- EINTR --> <sect3>Áõ»ó: <p>ÇÁ·Î±×·¥ÀÌ Ctrl+Z·Î ¼­½ºÆæµåµÇ°í ´Ù½Ã ½ÃÀÛµÇ¾î ¹ö¸°´Ù. ¶Ç´Â ´Ù¸¥ ¶§¿¡´Â Ctrl+C¿Í °°Àº ½Ã±×³ÎÀ» ¹ß»ý½ÃÅ°°í ÀÚ½Ä ÇÁ·Î¼¼½ºµéÀ» Á×Àδ٠µîµî... "interrupted system calls" ¶Ç´Â "write: unknown error" ¶Ç´Â ±×·± °Í ºñ½ÁÇÑ ¿¡·¯¸¦ ³½´Ù. <sect3>¹®Á¦Á¡: <p>POSIX ½Ã½ºÅÛÀº ´Ù¸¥ ±¸½Ä À¯´Ð½º üÁ¦¿¡¼­º¸´Ù ¾à°£ ´õ ¸¹ÀÌ ½Ã±×³Î¿¡ ´ëÇؼ­ üŷÀ» ÇàÇÑ´Ù. ¸®´ª½º´Â ½Ã±×³Î Çڵ鷯µé(signal handler)À» ½ÇÇà½Ãų °ÍÀÌ´Ù. <itemize> <item> ŸÀ̸Ӱ¡ °±ï´î ¶§¸¶´Ù ºñµ¿±âÀûÀ¸·Î. <item> ¸ðµç ½Ã½ºÅÛ È£Ãâ ¹Ýȯ½Ã¿¡. <item> ±×¸®°í ´ÙÀ½°ú °°Àº ½Ã½ºÅÛ È£Ãâ µ¿¾È¿¡µµ ±×·¯ÇÏ´Ù: <tt>select()</tt>, <tt>pause()</tt>, <tt>connect()</tt>, <tt>accept()</tt>, Å͹̳Π»ó¿¡¼­ÀÇ <tt>read()</tt>, ¼ÒÄÏ, ÆÄÀÌÇÁ³ª ¶óÀÎ ÇÁ¸°ÅÍ, FIFO¿¡ ´ëÇÑ <tt>open()</tt>, PTY³ª ½Ã¸®¾ó ¶óÀÎ, Å͹̳ο¡ ´ëÇÑ <tt>ioctl()</tt>, <tt/F_SETLKW/ ¸í·ÉÀ» ³»¸®´Â <tt>fcntl()</tt>, <tt>wait4()</tt>, <tt>syslog()</tt>, ¸ðµç TCP ¶Ç´Â NFS ÀÛ¾÷ </itemize> ´Ù¸¥ ¿î¿µÃ¼Á¦ÀÇ °æ¿ì¿¡´Â ´ÙÀ½°ú °°Àº ½Ã½ºÅÛ È£Ãâ¿¡ ´ëÇؼ­µµ üũÇÒ °ÍÀÌ´Ù. À§¿¡¼­ ¸»ÇÑ °Í ÀÌ¿Ü¿¡µµ ´ÙÀ½°ú °°Àº ½Ã½ºÅÛ È£Ãâµé: <tt>creat()</tt>, <tt>close()</tt>, <tt>getmsg()</tt>, <tt>putmsg()</tt>, <tt>msgrcv()</tt>, <tt>msgsnd()</tt>, <tt>recv()</tt>, <tt>send()</tt>, <tt>wait()</tt>, <tt>waitpid()</tt>, <tt>wait3()</tt>, <tt>tcdrain()</tt>, <tt>sigpause()</tt>, <tt>semop()</tt> <!-- What does this MEAN? --> <p>¸¸¾à ½Ã±×³Î(ÇÁ·Î±×·¥¿¡¼­ Çڵ鷯¸¦ ÀνºÅçÇÑ °æ¿ì)ÀÌ ½Ã½ºÅÛ È£Ãâ Áß¿¡ ¹ß»ýÇÑ´Ù¸é, ±×¿¡ ´ëÇÑ Çڵ鷯°¡ È£ÃâµÈ´Ù. ±×¸®°í Çڵ鷯°¡ ¹ÝȯµÇ¸é (½Ã½ºÅÛ È£Ãâ·Î), ½Ã½ºÅÛ È£ÃâÀº Áß°£¿¡ °¡·Îä±â¸¦ ´çÇß´ÂÁö »ìÆ캸°í Áï½Ã -1 °ªÀ» °¡Áö°í ¹ÝȯµÈ´Ù. ±×¸®°í<tt>errno ¸¦ EINTR ·Î ¼¼ÆÃÇÑ´Ù.</tt> ÇÁ·Î±×·¥Àº ±×·¯ÇÑ ÀÏÀÌ ÀÖÀ» °ÍÀ̶ó°í ¿¹»óÇÏÁö ¸øÇÏ°í Á×´Â °ÍÀÌ´Ù. ¿©·¯ºÐÀº ´ÙÀ½ 2 °¡Áö ÇØ°áÃ¥ Áß¿¡ Çϳª¸¦ °í¸£¸é µÈ´Ù. (1) ¿©·¯ºÐÀÌ ¼³Ä¡ÇÑ ¸ðµç ½Ã±×³Î Çڵ鷯¿¡ ´ëÇÏ¿© <tt/SA_RESTART/¸¦ sigaction Ç÷¡±×¿¡ ÷°¡ÇÑ´Ù. ´ÙÀ½°ú °°Àº °ÍÀÌ ÀÖ´Ù¸é, <tscreen><verb> signal (sig_nr, my_signal_handler); </verb></tscreen> ¸¦ ´ÙÀ½°ú °°ÀÌ ¹Ù²Û´Ù. <tscreen><verb> signal (sig_nr, my_signal_handler); { struct sigaction sa; sigaction (sig_nr, (struct sigaction *)0, &ero;sa); #ifdef SA_RESTART sa.sa_flags |= SA_RESTART; #endif #ifdef SA_INTERRUPT sa.sa_flags &ero;= ~ SA_INTERRUPT; #endif sigaction (sig_nr, &ero;sa, (struct sigaction *)0); } </verb></tscreen> ÀÌ ¹æ¹ýÀÌ ´ëºÎºÐÀÇ ½Ã½ºÅÛ È£Ãâ¿¡ Àû¿ëµÇ±â´Â ÇÏÁö¸¸, <tt/read()/, <tt/write()/, <tt/ioctl()/, <tt/select()/, <tt/pause()/, <tt/connect()/¿¡ ´ëÇؼ­´Â ¿©·¯ºÐ ½º½º·Î <tt/EINTR/¸¦ üũÇØÁÖ¾î¾ß ÇÑ´Ù. ´ÙÀ½À» »ìÆ캸ÀÚ. (2) ¿©·¯ºÐÀÌ Á÷Á¢ ¸í½ÃÀûÀ¸·Î <tt/EINTR/À» üũÇØÁØ´Ù. <tt/read()/¸¦ »ç¿ëÇÏ´Â Äڵ尡 ¿ø·¡ ÀÌ·¸°Ô µÇ¾î ÀÖ´Ù°í Ä¡ÀÚ. <tscreen><verb> int result; while (len > 0) { result = read(fd,buffer,len); if (result < 0) break; buffer += result; len -= result; } </verb></tscreen> ÀÌ Äڵ带 ´ÙÀ½°ú °°ÀÌ ¹Ù²Ù¾îÁÖ¸é µÈ´Ù. <tscreen><verb> int result; while (len > 0) { result = read(fd,buffer,len); if (result < 0) { if (errno != EINTR) break; } else { buffer += result; len -= result; } } </verb></tscreen> À̹ø¿¡ ÀÌ·± Äڵ尡 ÀÖ´Ù¸é, <tscreen><verb> int result; result = ioctl(fd,cmd,addr); </verb></tscreen> ±×°ÍÀº ¶ÇÇÑ ´ÙÀ½°ú °°ÀÌ ¹Ù²î¾î¾ß ÇÑ´Ù. <tscreen><verb> int result; do { result = ioctl(fd,cmd,addr); } while ((result == -1) && (errno == EINTR)); </verb></tscreen> BSD À¯´Ð½ºÀÇ ¸î¸î ¹öÀü¿¡¼­´Â ½Ã½ºÅÛ È£ÃâÀ» Àç°³ÇÏ´Â °ÍÀÌ ±âº» ÇൿÀ¸·Î µÇ¾î ÀÖ´Â °æ¿ìµµ ÀÖÀ¸¹Ç·Î ÁÖÀÇÇÏÀÚ. ½Ã½ºÅÛ È£ÃâÀÌ °¡·Îä±â¸¦ Çã¿ëÇϱâ À§Çؼ­´Â <tt/SV_INTERRUPT/ ¶Ç´Â <tt/SA_INTERRUPT/ Ç÷¡±×¸¦ »ç¿ëÇϵµ·Ï ÇÏÀÚ. <!-- according to some comments in /usr/include this may no longer be --> <!-- the case. Should check --> <sect2>¾²±â °¡´É ¹®ÀÚ¿­ (ÇÁ·Î±×·¥ÀÌ ·£´ýÇÏ°Ô ¼¼±×ÆúÆ®¸¦ ³½´Ù) <label id="index.53"> <!-- SIGSEGV --> <label id="index.54"> <!-- segmentation fault --> <label id="index.55"> <!-- <tt/mktemp()/ --> <label id="index.56"> <!-- <tt/-fwritable-strings/ --> <p>GCC´Â gcc¸¦ »ç¿ëÇÏ´Â »ç¶÷µéÀÌ ¹®ÀÚ¿­ »ó¼ö¿¡ ´ëÇÏ¿© Á¤È®È÷ »ó¼ö·Î¼­ °è¼Ó »ç¿ëÇÒ °ÍÀ̶ó°í ³«°üÇÏ°í ÀÖ´Â µí ÇÏ´Ù. µû¶ó¼­ ±× ¹®ÀÚ¿­ »ó¼ö¸¦ ÇÁ·Î±×·¥ÀÇ ÅؽºÆ® ¿µ¿ª¿¡ Áý¾î³Ö´Â´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ½º¿Ò ¿µ¿ªÀ» »ç¿ëÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÇÁ·Î±×·¥ÀÇ µð½ºÅ© À̹ÌÁö·ÎºÎÅÍ ÆäÀÌÁö ÀÎ & ¾Æ¿ôÀ» ÇàÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ±×·¯¹Ç·Î ¹®ÀÚ¿­ »ó¼ö¿¡ ´ëÇÏ¿© ´Ù½Ã ¾²±â ÀÛ¾÷À» ÇÏ°Ô µÇ¸é ¼¼±×¸àÅ×ÀÌ¼Ç ÆúÆ®¸¦ ÀÏÀ¸Å°°Ô µÇ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î¼­ ¹®ÀÚ¿­ »ó¼ö¸¦ Àμö·Î ÇÏ¿© <tt>mktemp()</tt>¸¦ È£ÃâÇÏ´Â ¿¾³¯ ÇÁ·Î±×·¥µé¿¡¼­´Â ¹®Á¦°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. <tt>mktemp()</tt>´Â ÁÖ¾îÁø Àμö¿¡ ´Ù½Ã ¾²·Á°í Çϱ⠶§¹®ÀÌ´Ù. ÀÌ ¹®Á¦¸¦ °íÄ¡±â À§Çؼ­´Â (a) <tt/-fwritable-strings/ À̶ó´Â ¿É¼ÇÀ» Á־ ÄÄÆÄÀÏÇÑ´Ù. ÀÌ·¸°Ô ÇØÁÖ¸é gcc´Â ¹®ÀÚ¿­ »ó¼ö¸¦ µ¥ÀÌŸ ¿µ¿ª¿¡ ³Ö°Ô µÈ´Ù. ¶Ç´Â (b) ¹®Á¦°¡ µÇ´Â ºÎºÐÀ» ¼öÁ¤Çؼ­ »ó¼ö°¡ ¾Æ´Ï¶ó º¯¼ö·Î ÁÖ¾îÁö°Ô ¸¸µé°í È£Ãâ Àü¿¡ strcpy ¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ±×°÷À¸·Î Ä«ÇÇÇØÁØ´Ù. <sect2>¿Ö <tt>execl()</tt>È£ÃâÀÌ ½ÇÆÐÇϴ°¡? <label id="index.57"> <!-- <tt/execl()/ --> <p>¿øÀÎÀº °£´ÜÇÏ´Ù. Á¦´ë·Î È£ÃâÀ» ÇÏÁö ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. <tt/execl/¿¡ ´ëÇÑ Ã¹¹ø° Àμö´Â ½ÇÇàÇÏ°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ±×¸®°í µÎ¹ø°ºÎÅʹ ȣÃâÇÏ´Â ÇÁ·Î±×·¥¿¡ Àü´ÞÇÒ <tt/argv/¹è¿­ÀÌ´Ù. ±â¾ïÇ϶ó! <tt/argv[0]/´Â ÀüÅëÀûÀ¸·Î ¾Æ¹«·± Àμö ¾øÀÌ ½ÇÇàµÇ´õ¶óµµ ¼¼ÆÃÀÌ µÈ´Ù´Â »ç½ÇÀ»! µû¶ó¼­ ´ÙÀ½°ú °°ÀÌ Äڵ带 ½á¾ßÇÑ´Ù. <tscreen><verb> execl("/bin/ls","ls",NULL); </verb></tscreen> Àý´ë·Î ´ÙÀ½°ú °°ÀÌ ¾²¸é ¾ÈµÈ´Ù. <tscreen><verb> execl("/bin/ls", NULL); </verb></tscreen> <p>¾Æ¹«·± Àü´ÞÀμö ¾øÀÌ ½ÇÇà½ÃÅ°´Â °æ¿ì¿¡µµ ½ÇÇàÇü½ÄÀº ÀÚ½ÅÀÇ µ¿Àû ¶óÀ̺귯¸® ÀÇÁ¸¼ºÀ» ³ªÅ¸³¾ ¼ö ÀÖ´Â ¹æ½ÄÀ¸·Î ±¸¹®À» ¸ÂÃçÁØ ÇüŶó¾ß ÇÑ´Ù. ÃÖ¼ÒÇѵµ a.outÀÇ °æ¿ì´Â ±×·¯ÇÏ´Ù. ELF´Â Á» ´Ù¸¥ ¹æ½ÄÀ¸·Î ÀÛµ¿ÇÑ´Ù. <p>(¸¸¾à ÀÌ·¯ÇÑ ¶óÀ̺귯¸® Á¤º¸¸¦ ¿øÇÑ´Ù¸é ¾ÆÁÖ °£´ÜÇÑ ÀÎÅÍÆäÀ̽º°¡ ÀÖ´Ù. µ¿Àû ·ÎµùDynamic Loading¿¡ ´ëÇÑ ¼½¼ÇÀ» º¸°Å³ª <tt/ldd/¿¡ ´ëÇÑ ¸ÇÆäÀÌÁö¸¦ Âü°íÇ϶ó) <!-- *********************** SECTION ************************** --> <!-- * Debugging --> <sect>µð¹ö±ë°ú Profiling <sect1>¿¹¹æÀûÀÎ °ü¸®(lint) <label id="index.58"> <!-- lint --> <p>¹®Á¦°¡ ¹ß»ýÇÏ°í ³ª¼­ ÇØ°áÇÏ´Â °Íº¸´Ù´Â ¹®Á¦¸¦ ¹Ì¿¬¿¡ ¹æÁöÇÏ´Â °ÍÀÌ Áß¿äÇÏÁö ¾ÊÀ»±î? ¸®´ª½º¿¡ ³Î¸® ¾²ÀÌ´Â lint´Â ¾ø´Ù. ¾Æ¸¶µµ ´ëºÎºÐÀÇ »ç¶÷µéÀÌ gcc°¡ ³»³õ´Â ÀÚ¼¼ÇÑ °æ°í ¸Þ¼¼Áö¿¡ ¸¸Á·ÇÏ°í Àֱ⠶§¹®ÀÎ °Í °°´Ù. ¾Æ¸¶µµ °¡Àå À¯¿ëÇϾ²ÀÌ´Â °ÍÀº <tt/-Wall/ ½ºÀ§Ä¡ÀÏ °ÍÀÌ´Ù. ÀÌ°ÍÀÌ ÀǹÌÇÏ´Â ¹Ù´Â "Warnings, all"·Î¼­ ¸ðµç °æ°í ¸Þ¼¼Áö¸¦ ¹ß»ý½ÃÅ°¶ó´Â ¸»ÀÌ´Ù. ¶ÇÇÑ ¾ÆÁÖ ÀÚ¼¼ÇÏ°Ô ³ª¿Â´Ù. Public Domain lint´Â <url url="ftp://larch.lcs.mit.edu/pub/Larch/lclint">¿¡¼­ ¾òÀ» ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¾ó¸¶³ª ±¦ÂúÀºÁö º»ÀÎÀº ¸ð¸¥´Ù. <sect1>µð¹ö±ë <label id="index.59"> <!-- debugging --> <sect2>¾î¶»°Ô Çϸé ÇÁ·Î±×·¥ÀÇ µð¹ö±ë Á¤º¸¸¦ ¾Ë¾Æ³¾ ¼ö Àִ°¡? <label id="index.60"> <!-- <tt/gcc -g/ --> <label id="index.61"> <!-- <tt/gcc -fomit-frame-pointer/ --> <label id="index.62"> <!-- <tt/libg.a/ --> <p>±×·¯±â À§Çؼ­´Â <tt/-g/ ¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏ/¸µÅ©ÇØ¾ß ÇÑ´Ù. ±×¸®°í <tt/-fomit-frame-pointer/ ½ºÀ§Ä¡´Â »©ÁÖ¾î¾ß ÇÑ´Ù. »ç½Ç ¸ðµç ºÎºÐÀ» ´Ù½Ã ÄÄÆÄÀÏÇÒ ÇÊ¿ä´Â ¾ø°í, ¿©·¯ºÐÀÌ °ü½É °®°í ÀÖ´Â ºÎºÐ¸¸À» ±×·¸°Ô ÇØÁÖ¸é µÈ´Ù. <p>a.out¿¡ À־ °øÀ¯¶óÀ̺귯¸®°¡ ¸¸¾à <tt/-fomit-frame-pointer/ ½ºÀ§Ä¡¸¦ °¡Áö°í ÄÄÆÄÀϵǾú´Ù¸é gdb¸¦ »ç¿ëÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. <tt/-g/ ¿É¼ÇÀ» ÁÖ´Â ÀÌÀ¯´Â ¹Ù·Î Á¤Àû ¸µÅ©¸¦ ÇàÇ϶ó´Â ¸»À» ÇÔÃàÇÏ°Ô µÈ´Ù. <p>¸¸¾à ¸µÄ¿°¡ libg.a¸¦ ãÀ» ¼ö ¾ø´Ù°í Çϸ鼭 ½ÇÆÐÇÏ°Ô µÈ´Ù¸é, ¿©·¯ºÐÀÌ <tt>/usr/lib/libg.a</tt>À» °®°í ÀÖÁö ¾Ê±â ¶§¹®ÀÏ °ÍÀÌ´Ù. ±× È­ÀÏÀº Ưº°ÇÑ ¶óÀ̺귯¸®·Î¼­ µð¹ö±ë °¡´É C ¶óÀ̺귯¸®ÀÌ´Ù. libc ÆÐÅ°Áö¿¡ Æ÷ÇԵǾî Àְųª ¶Ç´Â libc ¼Ò½º Äڵ带 ¹Þ¾Æ¼­ ÄÄÆÄÀÏÇÏ¸é »ý±ä´Ù. ½ÇÁ¦·Î <em>±×·¸°Ô ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï°í</em> ´ëÃæ <tt>/usr/lib/libc.a</tt>¸¦ <tt>/usr/lib/libg.a</tt>·Î ¸µÅ©½ÃÄѹö·Áµµ ´ëºÎºÐ »ó°ü¾øÀ» °ÍÀÌ´Ù. <sect3>µð¹ö±ë Á¤º¸¸¦ ¾î¶»°Ô ÇÏ¸é ´Ù½Ã ²¨³¾ ¼ö Àִ°¡? <label id="index.63"> <!-- binaries too big --> <p>¾ÆÁÖ ¸¹Àº GNU ¼ÒÇÁÆ®¿þ¾îµéÀº <tt>-g</tt> ¿É¼ÇÀ» °¡Áö°í ÄÄÆÄÀϵǾî ÀÖÀ¸¹Ç·Î È­ÀÏ Å©±â°¡ ¸Å¿ì Å©´Ù. (Á¾Á¾ Á¤Àû ¸µÅ©µÇ¾î ÀÖÀ½) ±×·¸°Ô ±¦ÂúÀº »ý°¢ÀÎ °Í °°Áö´Â ¾Ê´Ù. <p>¸¸¾à ÇÁ·Î±×·¥ÀÌ autoconf¿¡ ÀÇÇØ ¸¸µé¾îÁø <tt>configure</tt>¸¦ °¡Áö°í ÀÖ´Ù¸é, º¸ÅëÀÇ °æ¿ì MakefileÀ» °Çµå¸²À¸·Î½á µð¹ö±ë Á¤º¸¸¦ ³ÖÁö ¾Ê°Ô ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ELF¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é, ÇÁ·Î±×·¥Àº <tt>-g</tt> ¼¼Æðú´Â »ó°ü¾øÀÌ µ¿Àû ¸µÅ©µÇ¸ç, ±×³É ½±°Ô <tt>strip</tt>(µð¹ö±ë Á¤º¸¸¦ ½ÇÇàÈ­ÀÏ¿¡¼­ »©¹ö¸®´Â ÇàÀ§)½Ãų ¼ö ÀÖ´Ù. <!--- gdb; where on sunsite? xxgdb almost certainly has wrong url--> <sect2>°ü·Ã ¼ÒÇÁÆ®¿þ¾î <label id="index.64"> <!-- gdb --> <p>´ëºÎºÐÀÇ »ç¶÷µéÀº <bf>gdb</bf>¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. gdb´Â <url url="ftp://prep.ai.mit.edu/pub/gnu" name="GNU archive sites">¿¡¼­ ¼Ò½ºÀÇ ÇüÅ·Î, ¾Æ´Ï¸é <url url="ftp://tsx-11.mit.edu/pub/linux/packages/GCC" name="tsx-11">À̳ª ¼±»çÀÌÆ®¿¡¼­ ¹ÙÀ̳ʸ®ÀÇ ÇüÅ·Π±¸ÇÒ ¼ö ÀÖ´Ù. <bf/xxgdb/´Â gdb¿¡ ±âÃÊÇÑ X À©µµ¿ì µð¹ö°ÅÀÌ´Ù. Áï, ¿ì¼±ÀûÀ¸·Î gdb¸¦ ÀÌ¹Ì ¼³Ä¡Çß¾î¾ß ÇÑ´Ù´Â ¶æÀÌ´Ù. ±× ¼Ò½º´Â <url url="ftp://ftp.x.org/contrib/xxgdb-1.08.tar.gz">¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. ¶ÇÇÑ <bf>UPS</bf> µð¹ö°Å°¡ Rick Sladkey¾¾¿¡ ÀÇÇØ Æ÷ÆõǾú´Ù. X À©µµ¿ì¿¡¼­µµ Àß µ¹¾Æ°£´Ù. ÇÏÁö¸¸ xxgdb¿Í °°ÀÌ ÅؽºÆ® µð¹ö°ÅÀÎ gdb°°Àº °Í¿¡ ÀÇÁ¸ÇÏ´Â ÇüÅ´ ¾Æ´Ï´Ù. ¾ÆÁÖ ÈǸ¢ÇÑ ±â´ÉµéÀ» ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. µû¶ó¼­ ¿©·¯ºÐÀÌ µð¹ö±ë¿¡ ¸¹Àº ½Ã°£À» ÇÒ¾ÖÇÏ°í ÀÖ´Ù¸é, ¿ì¼±ÀûÀ¸·Î UPS µð¹ö°Å¸¦ ±ÇÇÑ´Ù. ¸®´ª½º¿ëÀ¸·Î ÄÄÆÄÀÏµÈ ¹ÙÀ̳ʸ®³ª ¼Ò½º ÆÐÄ¡È­ÀÏÀº <url url="ftp://sunsite.unc.edu/pub/Linux/devel/debuggers/">¿¡¼­ ±¸ÇÒ ¼ö ÀÖ°í ¿À¸®Áö³Î ¼Ò½º´Â <url url="ftp://ftp.x.org/contrib/ups-2.45.2.tar.Z">¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. µð¹ö±ë¿¡ ¾²ÀÌ´Â ¶Ç ´Ù¸¥ Åø Çϳª¸¦ µéÀÚ¸é <bf>strace</bf>¸¦ µé ¼ö ÀÖ´Ù. strace´Â ÇÁ·Î±×·¥ÀÌ ¸¸µé¾î³»´Â ½Ã½ºÅÛ È£ÃâÀ» È­¸é¿¡ Ç¥½ÃÇØÁØ´Ù. ÀÌ°Í ¸»°íµµ ´Ù¹æ¸éÀ¸·Î »ç¿ë°¡´ÉÇѵ¥, ¿¹¸¦ µé¾î ¾î¶°ÇÑ Æнº¸íÀÌ ¼Ò½ºÄڵ带 °®°í ÀÖÁö ¾ÊÀº ¹ÙÀ̳ʸ® È­ÀÏ ¾È¿¡ ÄÄÆÄÀÏµÇ¾î µé¾î°¡ÀÖ´ÂÁö, ºÐ¸íÈ÷ ¹ÙÀ̳ʸ® ¾È¿¡ µé¾îÀÖ´Â Á¶°ÇµéÀ» ¹ß°ßÇÏ°íÀÚ ÇÒ ¶§, ÀϹÝÀûÀ¸·Î ÀϹÝÀûÀ¸·Î ¾î¶»°Ô ÀÛµ¿ÇÏ°í ÀÖ´ÂÁö¸¦ ¾Ë¾Æ³»°íÀÚ ÇÒ ¶§ »ç¿ëÇÑ´Ù. ÃֽŠstrace ¹öÀü(ÇöÀç 3.0.8)Àº <url url="ftp://ftp.std.com/pub/jrs/">¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. <sect2>¹é±×¶ó¿îµå (µ¥¸ó) ÇÁ·Î±×·¥ <p>µ¥¸ó ÇÁ·Î±×·¥µéÀº ÀüÇüÀûÀ¸·Î <tt/fork()/¸¦ ¸ÕÀú ÇÏ°í ³ª¼­, ºÎ¸ð ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃÄÑ ¹ö¸°´Ù. ÀÌ´Â µð¹ö±ë ¼¼¼Ç¿¡ ´ëÇÏ¿© °ø°ÝÀûÀÎ ¿ä¼ÒÀÓÀÌ ºÐ¸íÇÏ´Ù. <p>ÀÌ·² ¶§ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº <tt/fork/¿¡ ´ëÇÏ¿© Á¤ÁöÁ¡(breakpoint)À» ÁöÁ¤ÇØÁÖ´Â °ÍÀÌ°í ÇÁ·Î±×·¥ÀÌ ¸ØÃß¸é ´Ù½Ã±Ý ±×°ÍÀ» 0 À¸·Î ¸¸µé¾îÁÖ´Â °ÍÀÌ´Ù. <tscreen><verb> (gdb) list 1 #include <stdio.h> 2 3 main() 4 { 5 if(fork()==0) printf("child\n"); 6 else printf("parent\n"); 7 } (gdb) break fork Breakpoint 1 at 0x80003b8 (gdb) run Starting program: /home/dan/src/hello/./fork Breakpoint 1 at 0x400177c4 Breakpoint 1, 0x400177c4 in fork () (gdb) return 0 Make selected stack frame return now? (y or n) y #0 0x80004a8 in main () at fork.c:5 5 if(fork()==0) printf("child\n"); (gdb) next Single stepping until exit from function fork, which has no line number information. child 7 } </verb></tscreen> <sect2>ÄÚ¾î È­ÀÏ(Core file) <p>º¸Åë ¸®´ª½º ºÎÆýÿ¡ ÄÚ¾î È­ÀÏÀ» ¸¸µéÁö ¾Êµµ·Ï ¼¼ÆõǾî ÀÖ´Ù. ÇÏÁö¸¸ ÄÚ¾îÈ­ÀÏ »ý¼ºÀ» °¡´ÉÄÉ ÇÏ·Á°í ÇÑ´Ù¸é ±×°ÍÀ» ´Ù½Ã °¡´ÉÄÉ ÇÏ´Â ¼ÐÀÇ ³»Àå ¸í·ÉÀ» »ç¿ëÇÑ´Ù. ¼Ð ȣȯ ¼Ð(¿¹. tcsh)À» ¾²°í ÀÖ´Ù¸é ´ÙÀ½°ú °°ÀÌ ¸í·ÉÀ» ³»¸°´Ù. <tscreen><verb> % limit core unlimited </verb></tscreen> ¸¸¾à º»¼Ð·ù(sh, bash, zsh, pdksh)¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é, <tscreen><verb> $ ulimit -c unlimited </verb></tscreen> ¸¸¾à ÄÚ¾î È­ÀÏÀÇ À̸§¿¡ ´ëÇÏ¿© À¶Å뼺À» °¡Áö°í ½Í´Ù¸é, Ä¿³Î ¼Ò½º¸¦ ¾à°£¸¸ º¯°æÇØÁÖ¸é µÈ´Ù. ÀÚ, <tt>fs/binfmt_aout.c</tt>¿Í <tt>fs/binfmt_elf.c</tt>¿Í °°Àº È­ÀÏÀ» ã¾Æº¸ÀÚ. <tscreen><verb> memcpy(corefile,"core.",5); #if 0 memcpy(corefile+5,current->comm,sizeof(current->comm)); #else corefile[4] = '\0'; #endif </verb></tscreen> grep °°Àº °ÍÀ» °¡Áö°í ÀÌ·± ºÎºÐÀ» ¸ðµÎ ãÀº ÈÄ¿¡ <tt/0/À̶ó°í µÇ¾î ÀÖ´Â °ÍÀ» <tt/1/À̶ó°í ¸ðµÎ °íÃÄÁØ´Ù. <sect1>Profiling <p>ProfilingÀ̶ó°í ÇÏ´Â °ÍÀº ÇÁ·Î±×·¥ÀÇ ¾î¶² ºÎºÐÀÌ Á¦ÀÏ ÀÚÁÖ È£ÃâµÇ°í ÀÖ´ÂÁö ¶Ç´Â ¸¹Àº ½Ã°£À» ¼Ò¿äÇÏ°í ÀÖ´ÂÁö¸¦ Á¶»çÇÏ´Â °ÍÀÌ´Ù. Äڵ带 ÃÖÀûÈ­½ÃÅ°°í ½Ã°£ÀÌ °¡Àå ¸¹ÀÌ ¼ÒºñµÇ´Â °÷À» °íÃÄÁÖ´Â ÁÁÀº ¹æ¹ýÀÌ´Ù. ÀÌ·¸°Ô Çϱâ À§Çؼ­´Â <tt/-p/ ¿É¼ÇÀ» Á־ ½Ã°£ Á¤º¸¸¦ ¿ÀºêÁ§Æ® È­ÀϵéÀÌ °¡Áú ¼ö ÀÖµµ·Ï ´Ù½Ã ÄÄÆÄÀÏÇØÁÖ¾î¾ß ÇÑ´Ù. ¶ÇÇÑ binutil ÆÐÅ°Áö¿¡ ÀÖ´Â <tt/gprof/ ¶ó´Â °ÍÀ» ÇÊ¿ä·Î ÇÑ´Ù. ÀÚ¼¼ÇÑ »çÇ×Àº <tt/gprof/ ¸ÇÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù. <!-- **************************** SECTION ********************* --> <!-- * Linking --> <sect>¸µÅ© <p>ȣȯµÇÁö ¾Ê´Â µÎ °³ÀÇ ¹ÙÀ̳ʸ® Çü½Ä, Á¤Àû ¶óÀ̺귯¸®¿Í µ¿Àû ¶óÀ̺귯¸®ÀÇ ±¸ºÐ, ÄÄÆÄÀÏ °úÁ¤ ÈÄ¿¡ ÀϾ´Â ÀÛ¾÷°ú ÀÌ¹Ì ÄÄÆÄÀÏÀ» ¸¶Ä£ ½ÇÇà ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¶§ ÀϾ´Â ÀÛ¾÷ µÑ ´Ù¿¡ ´ëÇÏ¿© "¸µÅ©"¶ó´Â °°Àº ¸»À» »ç¿ëÇÏ¿© »ý±â´Â È¥¶õÇÔ(»ç½ÇÀº ·Îµå(load)ÇÑ´Ù¶ó´Â ¸»¿¡ ´ëÇÑ °úºÎÇ϶ó°í ¸»ÇÒ ¼öµµ ÀÖ´Ù), ÀÌ·± ¸ðµç °Í¿¡ ´ëÇÏ¿© ´Ù·ç¹Ç·Î À̹ø ¼½¼ÇÀº Á» º¹ÀâÇÒ °ÍÀÌ´Ù. ¸»¸¸ ¾î·Á¿ï »ÓÀ̹ǷΠũ°Ô °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù. <p>ÀÌ·¯ÇÑ È¥¶õÀ» ¿ÏÈ­Çϱâ À§Çؼ­, ¿ì¸®´Â ½ÇÇà½Ã(runtime)¿¡ ÀϾ´Â ÀÏ¿¡ ´ëÇÏ¿© µ¿Àû ·Îµù(Dynamic Loading)À̶ó´Â ´Ü¾î¸¦ »ç¿ëÇÏ°Ú´Ù. ±×¸®°í ´ÙÀ½ ¼½¼Ç¿¡ °¡¼­ ´Ù·ç°íÀÚ ÇÑ´Ù. ¶Ç´Â µ¿Àû ¸µÅ·(Dynamic Linking)À̶ó´Â ´Ü¾î·Î Ç¥ÇöµÇ±âµµ ÇÑ´Ù. À̹ø ¼½¼Ç¿¡¼­´Â ¿À·ÎÁö ÄÄÆÄÀÏ °úÁ¤ ¹Ù·Î Á÷ÈÄ¿¡ »ý±â´Â ¸µÅ©¶ó´Â ÀÛ¾÷¿¡ ´ëÇؼ­¸¸ ´Ù·ç±â·Î ÇÑ´Ù. <sect1>Á¤Àû ¶óÀ̺귯¸® vs °øÀ¯ ¶óÀ̺귯¸® <p>ÇÁ·Î±×·¥À» ¸¸µå´Â ¸¶Áö¸· ÀÛ¾÷ÀÌ ¹Ù·Î ¸µÅ©(Link)¶ó´Â °úÁ¤ÀÌ´Ù. ÇÊ¿äÇÑ Á¶°¢µéÀ» ¸ðµÎ ¸ðÀ¸°Å³ª ¾î¶² ºÎºÐÀÌ ºüÁ® ÀÖ´ÂÁö ¾Ë¾Æº¸±â À§ÇÑ °úÁ¤ÀÌ´Ù. ºÐ¸íÈ÷ ÇÁ·Î±×·¥µéÀº ÇؾßÇÒ ÀÏÀÌ ¸¹´Ù. ÀÌ ¸ðµç °ÍÀ» ÀÏÀÏÀÌ ´Ù Â¥ÁÖ´Â °ÍÀº ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î È­ÀÏÀ» ¿¬´ÙµçÁö ÇÏ´Â ÀÏÀε¥ ±×·¯ÇÑ ÀϵéÀº ÀÌ¹Ì ¿©·¯ºÐ¿¡°Ô ¶óÀ̺귯¸®¶ó´Â ÇüÅ·ΠÁÖ¾îÁ® ÀÖ´Ù. Æò¹üÇÑ ¸®´ª½º ½Ã½ºÅÛ¿¡¼­´Â <tt>/lib</tt>¿Í <tt>/usr/lib/</tt>¿¡¼­ ±×·¯ÇÑ ¶óÀ̺귯¸®µéÀ» ãÀ» ¼ö ÀÖ´Ù. <label id="index.65"> <!-- binaries too big --> <label id="index.66"> <!-- statically linked binaries, unexpected --> Á¤Àû ¶óÀ̺귯¸®(Static Library)¸¦ »ç¿ëÇÒ ¶§, ¸µÄ¿´Â ÇÁ·Î±×·¥ÀÌ ÇÊ¿ä·Î ÇÏ´Â ºÎºÐÀ» ¶óÀ̺귯¸®¿¡¼­ ã¾Æ¼­ ±×³É ½ÇÇàÈ­ÀÏ¿¡´Ù Ä«ÇÇÇعö¸°´Ù. °øÀ¯ ¶óÀ̺귯¸®(¶Ç´Â µ¿Àû ¶óÀ̺귯¸®)ÀÇ °æ¿ì¿¡´Â ÀÌ·¸°Ô ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ½ÇÇàÈ­ÀÏ¿¡´Ù°¡ ´ÜÁö "½ÇÇàµÉ ¶§ ¿ì¼± ÀÌ ¶óÀ̺귯¸®¸¦ ·Îµù½Ãų °Í"À̶ó´Â ¸Þ¼¼Áö¸¸À» ³²°Ü³õ´Â´Ù. ´ç¿¬È÷ °øÀ¯ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¸é ½ÇÇàÈ­ÀÏÀÇ Å©±â°¡ ÀÛ¾ÆÁø´Ù. ±×µéÀº ¸Þ¸ð¸®µµ ¶ÇÇÑ Àû°Ô Â÷ÁöÇϸç, ÇÏµå µð½ºÅ©ÀÇ ¿ë·®µµ Àû°Ô Â÷ÁöÇÑ´Ù. ¸®´ª½ºÀÇ ±âº» ÇൿÀº ÀÏ´Ü °øÀ¯ ¶óÀ̺귯¸®°¡ ÀÖÀ¸¸é ±×°Í°ú ¸µÅ©¸¦ ½ÃÅ°°í, ±×·¸Áö ¾ÊÀ¸¸é Á¤Àû ¶óÀ̺귯¸®¸¦ °¡Áö°í ¸µÅ© ÀÛ¾÷À» ÇÑ´Ù. °øÀ¯ ¶óÀ̺귯¸®¸¦ ¾´ ½ÇÇàÈ­ÀÏÀ» ¾ò°íÀÚ Çߴµ¥, ¿ì¿¬Âú°Ô Á¤Àû ½ÇÇàÈ­ÀÏÀÌ ¸¸µé¾îÁ³´Ù¸é ¿ì¼± °øÀ¯ ¶óÀ̺귯¸®°¡ Á¦´ë·Î ÀÖ´ÂÁö(a.outÀº <tt>*.sa</tt>, ELF´Â <tt>*.so</tt>)»ìÆ캸°í Àбâ Æ۹̼ÇÀÌ ÁÖ¾îÁ® ÀÖ´ÂÁö ¾Ë¾Æº»´Ù. ¸®´ª½º¿¡¼­ Á¤Àû ¶óÀ̺귯¸®´Â <tt/libname.a/ °ú °°Àº ½ÄÀÇ À̸§À» °®´Â´Ù. ±×¿¡ ºñÇØ °øÀ¯ ¶óÀ̺귯¸®´Â <tt/libname.so.x.y.z/ ¶ó´Â ½ÄÀÇ À̸§À» °®´Âµ¥ <tt/x.y.z/´Â ¹öÀüÀ» ¶æÇÑ´Ù. ¶ÇÇÑ °øÀ¯ ¶óÀ̺귯¸®´Â Á¾Á¾ ¸µÅ©µÇ¾î ÀÖ´Ù. (¾ÆÁÖ Áß¿ä) <tt>libname.so.x</tt> ±×¸®°í <tt>libname.so</tt>¶ó´Â ½ÄÀÇ ¸µÅ©¸¦ °®´Â´Ù. Ç¥ÁØ ¶óÀ̺귯¸®µéÀº ÀÌ µÑÀ» ¸ðµÎ °¡Áö°í ÀÖ´Ù. ¿©·¯ºÐÀº <tt>ldd</tt>¶ó´Â °ÍÀ» »ç¿ëÇÔÀ¸·Î½á ƯÁ¤ ÇÁ·Î±×·¥ÀÌ ¾î¶² °øÀ¯ ¶óÀ̺귯¸®¸¦ ¿øÇÏ´ÂÁö ¾Ë ¼ö ÀÖ´Ù. (ldd = List Dynamic Dependencies) <tscreen><verb> $ ldd /usr/bin/lynx libncurses.so.1 => /usr/lib/libncurses.so.1.9.6 libc.so.5 => /lib/libc.so.5.2.18 </verb></tscreen> À§ °á°ú´Â º»ÀÎÀÇ ½Ã½ºÅÛ¿¡¼­ ÅؽºÆ®¿ë À¥ ºê¶ó¿ìÁ®·Î »ç¿ëÇÏ°í ÀÖ´Â lynx ¶ó´Â ÇÁ·Î±×·¥¿¡ ´ëÇÏ¿© ÀÇÁ¸¼º üũ¸¦ Çغ» °á°úÀÌ´Ù. <tt/libc.so.5/ (C ¶óÀ̺귯¸®)¿Í <tt/libncurses.so.1/ (Å͹̳ΠÁ¦¾î¿¡ »ç¿ëµÇ´Â ¶óÀ̺귯¸®)¸¦ ÇÊ¿ä·Î ÇÏ°í ÀÖ´Ù°í Ãâ·ÂÇÏ°í ÀÖ´Ù. ¾Æ¹«·± °øÀ¯ ¶óÀ̺귯¸®µµ ÇÊ¿ä¾øÀ¸¸é ±×³É `<tt/statically linked/' ¶Ç´Â `<tt/statically linked (ELF)/' ¶ó°í¸¸ Ãâ·ÂÇÑ´Ù. <sect1>¶óÀ̺귯¸® µé¿©´Ùº¸±â (µµ´ëü <tt/sin()/Àº ¾îµð¿¡ µé¾îÀִ°¡?) <label id="index.67"> <!-- <tt/sin()/ --> <label id="index.68"> <!-- <tt/cos()/ --> <label id="index.69"> <!-- maths --> <p><tt/nm /<em/libraryname/ À̶ó°í ½ÇÇà½ÃÅ°¸é ¶óÀ̺귯¸® ³»ÀÇ ¸ðµç ½Éº¼À» Ãâ·ÂÇØÁØ´Ù. ÀÌ´Â °øÀ¯ ¶óÀ̺귯¸®¿Í Á¤Àû ¶óÀ̺귯¸® µÑ ´Ù Àû¿ëµÈ´Ù. ¸¸¾à <tt/tcgetattr()/À̶ó´Â ÇÔ¼ö¸¦ ã°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇØÁÖ¸é µÈ´Ù. <tscreen><verb> $ nm libncurses.so.1 |grep tcget U tcgetattr </verb></tscreen> <tt/U/°¡ ¶æÇÏ´Â ¹Ù´Â "undefined" Áï ncurses ¶óÀ̺귯¸®°¡ »ç¿ëÇÏ°í´Â ÀÖÁö¸¸ ¾ÆÁ÷ Á¤ÀÇ´Â ÇÏÁö ¾Ê°í ÀÖ´Ù´Â ¶æÀÌ´Ù. ÀÌ·¸°Ôµµ ÇÒ ¼ö ÀÖ´Ù. <tscreen><verb> $ nm libc.so.5 | grep tcget 00010fe8 T __tcgetattr 00010fe8 W tcgetattr 00068718 T tcgetpgrp </verb></tscreen> `<tt/W/'´Â "weak" Áï ½Éº¼ÀÌ Á¤ÀÇ´Â µÇ¾îÀÖÀ¸³ª ´Ù¸¥ ¶óÀ̺귯¸®¿¡ ÀÇÇØ ÀçÁ¤ÀÇµÉ ¼ö ÀÖ´Â ÇüŶó´Â ÀǹÌÀÌ´Ù. ÀϹÝÀûÀ¸·Î Á¤»óÀûÀÎ °æ¿ì¿¡´Â `<tt/T/'¶ó°í ¾º¿©Áø´Ù. <label id="index.70"> <!-- <tt/<math.h>/ --> sin()ÀÌ ¾îµð¿¡ Àִ°¡¶ó´Â Áú¹®¿¡ ´ëÇÑ °¡Àå ªÀº ´äÀº <tt/libm.(so|a)/ÀÌ´Ù. <tt><math.h></tt>¿¡ Á¤ÀǵǾî ÀÖ´Â ¸ðµç ÇÔ¼öµéÀº ¹Ù·Î ÀÌ ¼öÇÐ ¶óÀ̺귯¸®¿¡ µé¾îÀÖ´Ù. ±×°ÍÀ» »ç¿ëÇϱâ À§Çؼ­´Â ¸µÅ©½Ã¿¡ <tt/-lm/ ¿É¼ÇÀ» ÁÖ¾î¾ß ÇÑ´Ù. using any of them. <!-- 13) Why are my binaries so huge and how do I reduce them ? --> <!-- covered static/shared, need to look at -g, -N --> <sect1>È­ÀÏ Ã£±â <p><tt/ld: Output file requires shared library `libfoo.so.1`/ <p>ÄÄÆÄÀÏÀ» ÇÏ´Ùº¸¸é À§¿Í °°Àº ¸Þ¼¼Áö°¡ Á¾Á¾ ³ª¿À´Â °ÍÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ld ±×¸®°í À¯»çÇÑ ÇÁ·Î±×·¥µéÀÌ È­ÀÏÀ» ã´Â ¹æ½ÄÀº ¹öÀü¿¡ µû¶ó ´Ù¸£Áö¸¸ ±âº»ÀûÀ¸·Î <tt>/usr/lib</tt>¸¦ ã°Ô µÈ´Ù. ÀÌ °÷ ¸»°íµµ ´Ù¸¥ °÷¿¡ ¶óÀ̺귯¸®¸¦ °¡Áö°í ÀÖ°í ±×°ÍÀ» ld ¿¡°Ô ¾Ë·ÁÁÖ±â À§Çؼ­´Â gcc ³ª ld ¿¡°Ô ¶óÀ̺귯¸®°¡ ÀÕ´Â µð·ºÅ丮¸¦ <tt/-L/ ¿É¼ÇÀ» Á༭ ¾Ë¸°´Ù. <p><tt>-L</tt> ¿É¼ÇÀ» Á־ ¾ÈµÈ´Ù¸é, ld °¡ ¿øÇÏ´Â È­ÀÏÀÌ ÀûÀýÇÑ Àå¼Ò¿¡ °¡ ÀÖ´ÂÁö È®ÀÎÇغ¸¶ó. a.out ¿¡ ´ëÇؼ­´Â <tt/-lfoo/ ¶ó°í Çϸé ld´Â <tt/libfoo.sa/ (°øÀ¯ ¶óÀ̺귯¸®)¸¦ ã°Ô µÈ´Ù. ¸¸¾à ±×°ÍÀ» ã´Âµ¥ ½ÇÆÐÇϸé <tt/libfoo.a/ (Á¤Àû ¶óÀ̺귯¸®)¶ó´Â È­ÀÏÀ» ã´Â´Ù. ELF¿¡ ÇÑÇؼ­´Â <tt/libfoo.so/¸¦ ã°í ³ª¼­ <tt/libfoo.a/¸¦ ã´Â´Ù. <tt/libfoo.so/´Â <tt/libfoo.so.x/¿¡ ´ëÇÑ ¸µÅ©ÀÌ´Ù. <!-- n+1) How/when to recompile libc --> <sect1>¿©·¯ºÐ¸¸ÀÇ ¶óÀ̺귯¸® ¸¸µé±â <sect2>¹öÀü °ü¸® <p>´Ù¸¥ ¸ðµç ÇÁ·Î±×·¥°ú ¸¶Âù°¡Áö·Î ¶óÀ̺귯¸® ¶ÇÇÑ °è¼ÓÀûÀ¸·Î ¹ö±×¸¦ Àâ¾Æ°¡¾ß ÇÑ´Ù. ¶Ç´Â »õ·Î¿î ±â´ÉÀ» µµÀÔÇϰųª ÇöÀç ÀÖ´Â °ÍÀ» ´õ È¿À²ÀûÀÎ °ÍÀ¸·Î ±³Ã¼ÇÑ´ÙµçÁö ±×¸®°í ÇÊ¿ä¾ø´Â °ÍÀº ¾ø¾Ö¹ö¸°´ÙµçÁö ÇÏ´Â ÀÏÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ·± °æ¿ì º¯È­ÇÏ´Â ¶óÀ̺귯¸®¸¦ °¡Áö°í ÇÁ·Î±×·¡¹ÖÇÏ´Â °ÍÀº ¹®Á¦°¡ ¾Æ´Ò ¼ö ¾ø´Ù. ¸¸¾à »ç¶óÁ®¹ö¸° ¿¾ ±â´É¿¡ ÀÇÁ¸ÇÏ´Â ÇÁ·Î±×·¥À̶ó¸é? ±×·¡¼­ ¿ì¸®´Â ¶óÀ̺귯¸® ¹öÀüÀ̶ó°í ÇÏ´Â °ÍÀ» µµÀÔÇÑ´Ù. ±×¸®°í ¶óÀ̺귯¸®ÀÇ º¯È­¸¦ ¸¶ÀÌ³Ê ¶Ç´Â ¸ÞÀÌÀú º¯È­ ÀÌ·¸°Ô ºÐ·ùÇÏ°í ¸¶ÀÌ³Ê ¾÷±×·¹À̵å´Â ±âÁ¸ÀÇ ÇÁ·Î±×·¥µé°ú Ãæµ¹ÀÌ ¾ø´Â º¯È­¸¦ ÁöĪÇÏ°Ô ÇÑ´Ù. ¶óÀ̺귯¸®ÀÇ ¹öÀüÀº È­ÀϸíÀ» º¸¸é ¾Ë ¼ö ÀÖ´Ù. (»ç½Ç ¾ö¹ÐÈ÷ ¸»ÇÏÀÚ¸é, ELF¿¡ ´ëÇؼ­´Â °ÅÁþ¸»ÀÌ´Ù. ¿Ö ±×·¯ÇÑÁö´Â °è¼Ó Àо¸é ³ª¿Ã °ÍÀÌ´Ù) <tt/libfoo.so.1.2/´Â ¸ÞÀÌÀú ¹öÀü 1 ÀÌ°í ¸¶ÀÌ³Ê ¹öÀü2 ÀÌ´Ù. ¸¶ÀÌ³Ê ¹öÀüµµ ´Ù¼Ò Áß¿äÇÑ °ÍÀÌ µÉ ¼öµµ ÀÖ´Ù. libcÀÇ °æ¿ì¿¡´Â ¸¶À̳ʹöÀü¿¡´Ù ÆÐÄ¡·¹º§À» Áý¾î³Ö´Â´Ù. µû¶ó¼­ <tt/libc.so.5.2.18/°ú °°Àº À̸§ÀÌ »ý±ä´Ù. ¼ýÀÚ ¸»°íµµ ¹®ÀÚ, ¾ð´õ½ºÄھÀÚ(_), ¶Ç´Â ÇÁ¸°Æ® °¡´ÉÇÑ ¹®ÀÚ¸¦ ³Ö¾îµµ ÁÁ´Ù. ELF¿Í a.out Çü½ÄÀÇ Ä¿´Ù¶õ Â÷ÀÌÁ¡ Áß¿¡ Çϳª°¡ ¹Ù·Î °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µå´Â ¹æ½Ä¿¡ ÀÖ´Ù. ¿ì¼±Àº ELF¸¦ ¾Ë¾Æº¸±â·Î ÇÏÀÚ. ¿Ö³ÄÇÏ¸é ´õ ½±±â ¶§¹®ÀÌ´Ù. <sect2>ELF? µµ´ëü ±×°Ô ¹«¾ùÀΰ¡? <label id="index.71"> <!-- elf --> <p>ELF (Executable and Linking Format)À̶ó°í ÇÏ´Â °ÍÀº ¿ø·¡ USL(UNIX System Laboratories)¶ó°í ÇÏ´Â °÷¿¡¼­ °³¹ßÇÑ ¹ÙÀ̳ʸ® Çü½ÄÀÌ´Ù. ±×¸®°í ÇöÀç´Â ¼Ö¶ó¸®½º¿Í SVR4¿¡¼­ »ç¿ë ÁßÀÌ´Ù. ¸®´ª½º°¡ »ç¿ëÇØ¿Ô´ø ¿À·¡µÈ a.outº¸´Ù ´õ¿í ´õ ÁÁÀº À¯¿¬¼º ¶§¹®¿¡ GCC¿Í C ¶óÀ̺귯¸® °³¹ßÀÚµéÀº Áö³­ ÇØ ¸®´ª½º Ç¥ÁØ ¹ÙÀ̳ʸ® Çü½Ä°ú ¸¶Âù°¡Áö·Î ELF·Î À̵¿Çϱâ·Î °áÁ¤ÇÏ¿´´Ù. <sect3>´Ù½Ã ÇÑ ¹ø ´õ? <p>À̹ø ¼½¼ÇÀº '/news-archives/comp.sys.sun.misc' ¹®¼­·ÎºÎÅÍ ³ª¿À´Â ³»¿ëÀÌ´Ù. <quote> 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++ °è½Â ±×·¡ÇÁ¿Í °°Àº °ÍµéÀ» Àâ¾Æ³¾ ¼ö ¾ø´Ù.) </quote> <quote> ELF È­ÀϵéÀº SVR4(¼Ö¶ó¸®½º 2.0 ?)ÀÇ ELF Á¢±Ù ¶óÀ̺귯¸®¸¦ ÅëÇؼ­ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ±× ¶óÀ̺귯¸®´Â ELF¿¡ ´ëÇÏ¿© ½±°í ºü¸¥ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÏ°í ÀÖ´Ù. ELF Á¢±Ù ¶óÀ̺귯¸®¸¦ ¾²¸é¼­ »ý±â´Â Áß¿äÇÑ ÀÕÁ¡ÁßÀÇ Çϳª´Â ELF È­ÀÏÀ» À¯´Ð½º È­ÀϷμ­ º¼ ÇÊ¿ä°¡ ÀüÇô ¾ø´Ù´Â °ÍÀÌ´Ù. ±×°ÍÀº ´ÜÁö Elf * ·Î¼­ Á¢±Ù°¡´ÉÇÏ´Ù. elf_open() È£ÃâÀ» ÇÏ¸é ±× ´ÙÀ½ºÎÅÍ °¡´ÉÇÏ´Ù. ±× ÈÄ¿¡ elf_foobar()¿Í °°Àº ÀÛ¾÷À» ÇÑ´Ù. ÀÌ´Â ¿¹ÀüÀÇ COFF ¹æ½Ä¿¡¼­ ½ÇÁ¦ µð½ºÅ© »óÀÇ À̹ÌÁö¸¦ °¡Áö°í ÀÛ¾÷Çß´ø °Í°ú´Â ÀüÇô ´Ù¸¥ °ÍÀÌ´Ù. </quote> ELF¿¡ ´ëÇÑ Âù¼º/¹Ý´ë, ±×¸®°í ÇöÀçÀÇ a.out ½Ã½ºÅÛÀ» ELF Áö¿ø ½Ã½ºÅÛÀ¸·Î ¾÷±×·¹À̵åÇØ¾ß ÇÒ Çʿ伺µéÀº ELFÇÏ¿ìÅõ ¹®¼­¿¡¼­ ´Ù·ç°í ÀÖÀ¸¸ç º»ÀÎÀº ±×°ÍÀ» ¿©±â¿¡ Àû°íÀÚ ÇÏÁö´Â ¾Ê´Â´Ù. <sect3>ELF °øÀ¯ ¶óÀ̺귯¸® <p><tt/libfoo.so/¶ó´Â °øÀ¯ ¶óÀ̺ñ¸£·¯¸¦ ¸¸µé±â À§ÇÑ ±âº»ÀûÀÎ ÀýÂ÷´Â ´ÙÀ½°ú °°´Ù. <tscreen><verb> $ 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 </verb></tscreen> ÀÌ·¸°Ô Çϸé <tt>libfoo.so.1.0</tt>À̶ó´Â °øÀ¯ ¶óÀ̺귯¸®°¡ ¸¸µé¾îÁú °ÍÀÌ´Ù. ±×¸®°í ld (<tt>libfoo.so</tt> ÇÊ¿ä)¿Í µ¿Àû ¸µÄ¿(<tt>libfoo.so.1</tt> ÇÊ¿ä)¿¡ ÇÊ¿äÇÑ ÀûÀýÇÑ ¸µÅ©°¡ ¸¸µé¾îÁø´Ù. ±×°ÍÀ» Å×½ºÆ®Çغ¸±â À§Çؼ­ ¿ì¸®´Â <tt/LD_LIBRARY_PATH/¿¡´Ù ÇöÀç µð·ºÅ丮¸¦ ÷°¡ÇÑ´Ù. <label id="index.72"> <!-- weird things --> ¸¸¾à ¶óÀ̺귯¸®°¡ Á¦´ë·Î ÀÛµ¿ÇÑ´Ù´Â °ÍÀ» È®ÀÎÇϸé, ±× ¶óÀ̺귯¸®¸¦ <tt>/usr/local/lib</tt>·Î À̵¿½ÃŲ´Ù. ±×¸®°í ´Ù½Ã ¸µÅ©¸¦ ¸¸µé¾îÁØ´Ù. <tt/libfoo.so.1/·ÎºÎÅÍ <tt/libfoo.so.1.0/¿¡ À̸£´Â ¸µÅ©´Â <tt>ldconfig</tt>¶ó°í ÇÏ´Â ÇÁ·Î±×·¥¿¡ ÀÇÇØ Ç×»ó ÃֽŠÁ¤º¸·Î °ü¸®µÈ´Ù. º¸ÅëÀº ºÎÆðúÁ¤¿¡¼­ ¾Ë¾Æ¼­ ÇØÁØ´Ù. ÇÏÁö¸¸ <tt>libfoo.so</tt>´Â ¼öµ¿À¸·Î ÇØÁÖ¾î¾ß ÇÑ´Ù. ¿©·¯ºÐÀÌ Çѹø¿¡ ÇÑ ¶óÀ̺귯¸®ÀÇ ¸ðµç ºÎºÐµé(¿¹¸¦ µé¾î Çì´õÈ­Àϵµ ÇØ´ç) ²Ä²ÄÈ÷ ¾÷±×·¹À̵åÇØÁÖ·Á°í ÇÑ´Ù¸é <tt>libfoo.so -> libfoo.so.1</tt>À̶ó´Â ¸µÅ©¸¦ ¸¸µé¾î ÁÖ¸é µÈ´Ù. ±×·¸°Ô µÇ¸é ldconfig°¡ ¾Ë¾Æ¼­ ¸µÅ©¸¦ °ü¸®ÇØÁØ´Ù. <em>¸¸¾à¿¡ ÀÌ·± °Í±îÁö ¸ðµÎ ¿©·¯ºÐ ½º½º·Î ¸ðµÎ ÇàÇÏ·Á°í ÇÑ´Ù¸é ³ªÁß¿¡ ¹®Á¦°¡ »ý±æ ¼öµµ ÀÖ´Ù.</em> ºÐ¸íÈ÷ ¸»Çصξú´Ù. <tscreen><verb> $ su # cp libfoo.so.1.0 /usr/local/lib # /sbin/ldconfig # ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so ) </verb></tscreen> <sect3>¹öÀü ¹øÈ£ ºÙÀ̱â, soname ±×¸®°í ½Éº¼¸¯ ¸µÅ© <label id="index.73"> <!-- soname --> <label id="index.74"> <!-- version numbers --> <p>°¢ ¶óÀ̺귯¸®´Â <em>soname</em>À̶ó´Â °ÍÀ» °¡Áö°í ÀÖ´Ù. ¸µÄ¿°¡ ã°í ÀÖ´Â ¶óÀ̺귯¸® ¾È¿¡¼­ ÀÌ·¯ÇÑ À̸§À» ¹ß°ßÇÏ°Ô µÇ¸é, ½ÇÁ¦ È­Àϸí(<tt/libfoo.so/¿Í °°Àº À̸§)ÀÌ ¾Æ´Ï¶ó sonameÀ̶ó°í ÇÏ´Â °ÍÀ» ½ÇÇà ¹ÙÀ̳ʸ®¿¡ Ç¥½ÃÇصдÙ. ½ÇÇà½Ã¿¡´Â µ¿Àû ·Î´õ°¡ sonameÀ» °®´Â È­ÀÏÀ» ã°Ô µÈ´Ù. ÀÌ ¿ª½Ã È­ÀϸíÀÌ ¾Æ´Ï´Ù. ÀÌ´Â ¹«¾ùÀ» ÀǹÌÇϴ°¡? Çϸé <tt/libfoo.so/ È­ÀϸíÀ» °¡Áø ¶óÀ̺귯¸®´Â <tt/libbar.so/¶ó´Â sonameÀ» °¡Áú ¼öµµ ÀÖ°í ±×°÷¿¡ ¸µÅ©µÈ ¸ðµç ÇÁ·Î±×·¥Àº °á±¹ <tt/libbar.so/¸¦ ã´Â´Ù´Â °ÍÀÌ´Ù. <p>ÀÌ°ÍÀº »ó´çÈ÷ ¹«ÀǹÌÇÑ ±â´Éó·³ º¸À̴µ¥ »ç½ÇÀº ÀÌ°ÍÀ̾߸»·Î °°Àº ¶óÀ̺귯¸®ÀÇ ¼­·Î ´Ù¸¥ ¹öÀüÀÌ ¾î¶»°Ô ÇÑ ½Ã½ºÅÛ¿¡¼­ °øÁ¸ÇÒ ¼ö Àִ°¡¸¦ ÀÌÇØÇϴµ¥ ÀÖ¾î ÇÙ½ÉÀûÀÎ ºÎºÐÀÌ´Ù. ¸®´ª½º¿¡¼­ ¶óÀ̺귯¸® À̸§Áþ´Â »ç½Ç»óÀÇ Ç¥ÁØÀº ¶óÀ̺귯¸®¸¦ <tt>libfoo.so.1.2</tt> ÀÌ·± ½ÄÀ¸·Î ºÎ¸£°í <tt>libfoo.so.1</tt>À̶ó´Â sonameÀ» ºÎ¿©ÇÏ´Â °ÍÀÌ´Ù. ¸¸¾à Ç¥ÁØ ¶óÀ̺귯¸® µð·ºÅ丮(¿¹¸¦ µé¾î<tt>/usr/lib</tt>)¿¡ Ãß°¡µÇ¸é ldconfig´Â <tt>libfoo.so.1 -> libfoo.so.1.2</tt>¶ó´Â ¸µÅ©¸¦ ¸¸µé¾î ÁÙ °ÍÀÌ´Ù. ±×·¸°Ô ÇÔÀ¸·Î½á ½ÇÇà½Ã¿¡ ÀûÀýÇÑ À̹ÌÁö°¡ ¼±Åõǵµ·Ï ÇØÁØ´Ù. ¿©·¯ºÐÀº ¶ÇÇÑ <tt>libfoo.so -> libfoo.so.1</tt>À̶ó´Â ½Éº¼¸¯ ¸µÅ©µµ ÇÊ¿äÇÏ´Ù. ¿Ö³ÄÇϸé ld °¡ ¸µÅ©ÇÒ ¶§ Á¤È®ÇÑ soname À» ã°Ô Çϱâ À§Çؼ­ÀÌ´Ù. <p>µû¶ó¼­ ¶óÀ̺귯¸®ÀÇ ¹ö±×¸¦ °íÄ¥ ¶§ ¶Ç´Â »õ·Î¿î ±â´ÉÀ» ÷°¡ÇÒ ¶§(±âÁ¸ÀÇ ÇÁ·Î±×·¥¿¡ ¾Ç¿µÇâÀ» ÁÖÁö ¾Ê´Â º¯È­µé), ´Ù½Ã ¶óÀ̺귯¸®¸¦ ¸¸µé°í °°Àº sonameÀ» ÁÖ°í È­ÀϸíÀº ¹Ù²Ùµµ·Ï ÇÑ´Ù. ¸¸¾à ¿©·¯ºÐÀÇ ¶óÀ̺귯¸®¿Í ¸µÅ©µÇ¾î ÀÖ´Â ±âÁ¸ÀÇ ÇÁ·Î±×·¥µé°ú Ãæµ¹ÇÏ°Ô µÇ´Â ¶óÀ̺귯¸®·Î º¯È­ÇÒ ¶§´Â sonameÀÇ ¼ýÀÚ¸¦ Çϳª ´Ã¸®¸é µÈ´Ù. ÀÌ·¯ÇÑ °æ¿ì »õ·Î¿î ¹öÀüÀÇ ¶óÀ̺귯¸®´Â <tt>libfoo.so.2.0</tt>ÀÌ µÉÅ×°í, sonameÀº <tt>libfoo.so.2</tt>°¡ µÉ °ÍÀÌ´Ù. ±×¸®°í À̹ø¿¡´Â <tt>libfoo.so</tt>¸¦ »õ·Î¿î ¹öÀüÀÇ ¶óÀ̺귯ÀÌ¿¡ ½Éº¼¸¯ ¸µÅ©½ÃÅ°µµ·Ï ÇÏÀÚ. ¿©·¯ºÐÀÌ <em>²À ÀÌ·± ½ÄÀ¸·Î ¶óÀ̺귯¸® À̸§À» Áö¾îÁÙ ÇÊ¿ä´Â ¾ø´Ù</em>. ÇÏÁö¸¸ ±×°ÍÀº ±¦ÂúÀº °ü½ÀÀÌ´Ù. ELF´Â ¿©·¯ºÐ¿¡°Ô ¶óÀ̺귯¸® À̸§Áþ±â¿¡ ÀÖ¾î À¯¿¬¼ºÀ» ÁÖ°í ÀÖÁö¸¸ ±×·¸´Ù°í Çؼ­ ²À ±×·¸°Ô¸¸ Ç϶ó´Â °ÍÀº ¾Æ´Ï´Ù. ¿ä¾àÇÏÀÚ¸é, ¿©·¯ºÐÀÌ È£È¯¼ºÀ» ±ú´Â °ÍÀÌ ¸ÞÀÌÀú ¾÷±×·¹À̵åÀÌ°í ±×·¸Áö ¾ÊÀº °ÍÀÌ ¸¶ÀÌ³Ê ¾÷±×·¹À̵å¶ó´Â ÀüÅëÀ» ÁؼöÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ Ç϶ó. <tscreen><verb> gcc -shared -Wl,-soname,libfoo.so.major -o libfoo.so.major.minor </verb></tscreen> ¸ðµç °ÍÀÌ Á¦´ë·Î µÉ °ÍÀÌ´Ù. <sect2>a.out ÀüÅëÀûÀÎ Çü½Ä <p>°øÀ¯ ¶óÀ̺귯¸® ¸¸µé±âÀÇ ¿ëÀÌÇÔÀº ELF·ÎÀÇ ¾÷±×·¹À̵忡 ´ëÇÑ Áß¿äÇÑ ÀÌÀ¯ÀÌ´Ù. a.outÀ¸·Î °¡´ÉÇϱâ´Â ÇÏ´Ù. <url url="ftp://tsx-11.mit.edu/pub/linux/packages/GCC/src/tools-2.17.tar.gz">¸¦ ¹Þ¾Æ¿ÀÀÚ. ±×¸®°í ±× È­ÀÏÀ» Ç®¾î¼­ ³ª¿À´Â 20 ÆäÀÌÁöÂ¥¸® ¹®¼­¸¦ Àо´Ù. ³²µé¿¡°Ô »·È÷ º¸ÀÌ´Â ¿­¼ºÁöÁöÀÚ°¡ µÇ°í ½ÍÁö´Â ¾Ê´Ù. ÇÏÁö¸¸ ³ª´Â ³ª ÀÚ½ÅÀ» ±ÍÂú°Ô ÇÏ°í ½ÍÁö´Â ¾Ê´Ù. :-) <sect3>ZMAGIC vs QMAGIC <label id="index.75"> <!-- ZMAGIC --> <label id="index.76"> <!-- QMAGIC --> <p>QMAGIC À̶ó°í ÇÏ´Â °ÍÀº ¿¹ÀüÀÇ a.out(ZMAGIC À̶ó°í ¾Ë·ÁÁ® ÀÖ´Ù)°ú ¸¶Âù°¡Áö·Î ½ÇÇà È­ÀÏÀÇ Çü½ÄÀÌ´Ù. ÇÏÁö¸¸ ù¹ø° ÆäÀÌÁö´Â ¸ÅÇÎÇÏÁö ¾Ê´Â ¹ÙÀ̳ʸ®ÀÌ´Ù. 0-4096 ±îÁö ¾î¶°ÇÑ ¸ÅÇεµ Á¸ÀçÇÏÁö ¾Ê±â ¶§¹®¿¡ ÀÌ·¸°Ô ÇÔÀ¸·Î½á NULL µð·¹ÆÛ·±½Ã Æ®·¡ÇÎ(deference trapping)À» ¾ÆÁÖ ½±°Ô ÇÒ ¼ö ÀÖ´Ù. ºÎÂ÷ÀûÀÎ È¿°ú·Î¼­ ¿©·¯ºÐÀÇ ½ÇÇàÈ­ÀÏÀº ¾à 1K Á¤µµ ÀÛ¾ÆÁö°Ô µÈ´Ù. ±¸½Ä ¸µÄ¿µéÀº ¿À·ÎÁö ZMAGIC ¸¸À» Áö¿øÇÑ´Ù. ¾à°£ ´ú ±¸½ÄÀÇ ¸µÄ¿µéÀº µÑ ´Ù Áö¿øÇϸé, ÃֽŠ¹öÀüµéÀº ¿À·ÎÁö QMAGIC ¸¸À» Áö¿øÇÏ°í ÀÖ´Ù. ÀÌ°ÍÀº º°·Î Áß¿äÇÏÁö ¾Ê´Ù. ¿Ö³ÄÇϸé Ä¿³Î ÀÚü°¡ µÎ °¡Áö¸¦ ¸ðµÎ ½ÇÇà½Ãų ¼ö Àֱ⠶§¹®ÀÌ´Ù. file ¸í·ÉÀ» ÁÖ¸é ±×°ÍÀÌ QMAGICÀÎÁö ÆǺ°ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. <sect3>È­ÀÏ À§Ä¡(File Placement) <p>a.out(DLL) °øÀ¯ ¶óÀ̺귯¸®´Â 2 °³ÀÇ ½ÇÁ¦ÀûÀÎ È­ÀÏ ±×¸®°í ÇϳªÀÇ ¸µÅ©·Î ±¸¼º µÇ¾î ÀÖ´Ù. ÀÌ ¹®¼­ Àüü¸¦ ÅëÇؼ­ °è¼Ó »ç¿ëÇØ¿Â À̸§ÀÎ foo ¶ó´Â ¶óÀ̺귯¸®¿¡ ´ëÇÏ¿© ¿¹¸¦ µé¾î ¾Ë¾Æº¸ÀÚ. foo ¿¡ ´ëÇÏ¿© <tt/libfoo.sa/, <tt/libfoo.so.1.2/ ±×¸®°í <tt/libfoo.so.1/ À̶ó´Â ¸µÅ©·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ¸µÅ©´Â <tt/libfoo.so.1.2/¸¦ °¡¸®Å²´Ù. ÀÌ°Íµé ¸ðµÎ ¹«¾ùÀΰ¡? ÄÄÆÄÀÏÇÒ ¶§ <tt/ld/´Â <tt/libfoo.sa/¸¦ ã´Â´Ù. ÀÌ°ÍÀ̾߸»·Î ¶óÀ̺귯¸®¿¡ ´ëÇÑ ±×·çÅͱâ È­ÀÏÀÌ µÈ´Ù. ±×¸®°í ¸µÅ©°úÁ¤¿¡ ´ëÇÑ ¸ðµç ¿ÜºÎ µ¥ÀÌŸ¿Í ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Áö´Ï°í ÀÖ´Ù. ÇÏÁö¸¸ ½ÇÇà½Ã¿¡´Â µ¿Àû ·Î´õ°¡ <tt/libfoo.so.1/À» ã´Â´Ù. ÀÌ´Â ½ÇÁ¦ È­ÀÏÀÌ ¾Æ´Ï¶ó ½Éº¼¸¯ ¸µÅ©ÀÌ´Ù. ±× ÀÌÀ¯´Â ¾Õ¼­¿Í ¸¶Âù°¡Áö·Î ¶óÀ̺귯¸®°¡ ±âÁ¸ÀÇ ¾îÇø®ÄÉÀ̼ǰúÀÇ Ãæµ¹¾øÀÌ, ´õ »õ·Î¿î, ¹ö±×°¡ ÀâÈù »õ·Î¿î ¹öÀüÀ¸·Î ±³Ã¼µÉ ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ­ÀÌ´Ù. »õ·Î¿î ¹öÀüÀÌ ³ª¿À¸é(¿¹¸¦ µé¾î <tt/libfoo.so.1.3/)À̶ó°í ÇÏÀÚ. ldconfig¸¦ ½ÇÇà½ÃÅ°¸é ÀÚµ¿À¸·Î <tt>libfoo.so.1 --> libfoo.so.1.3</tt> ¸µÅ© ÀÛ¾÷À» ÇØ ÁÙ °ÍÀÌ´Ù. ±¸¹öÀüÀ» ¾²´Â ÇÁ·Î±×·¥µµ ¾Æ¹« ÀÌ»óÀÌ ¾øÀ» °ÍÀÌ´Ù. DLL ¶óÀ̺귯¸®(µ¿¾î¹Ýº¹À̶ó´Â »ç½ÇÀº ¾Ë°í ÀÖ´Ù. ¿ªÀÚ ÁÖ :DLL ¿¡ ÀÌ¹Ì ¶óÀ̺귯¸®¶ó´Â ¸»ÀÌ µé¾îÀÖ´Ù)´Â Á¾Á¾ Á¤Àû ¶óÀ̺귯¸®º¸´Ù Å©´Ù. DLLÀº ¹Ì·¡ÀÇ È®À强À» À§Çؼ­ »½ ¶Ô¸° ±¸¸ÛÀÇ ÇüÅ·ΠÀÚ¸®¸¦ À¯º¸ÇصдÙ. ÇÏÁö¸¸ ±× ÀÚ¸®´Â µð½ºÅ© ¿µ¿ªÀ» Â÷ÁöÇÏÁö´Â ¾Êµµ·Ï ÇÒ ¼ö ÀÖ´Ù. °£´ÜÇÑ <tt/cp/³ª <tt/makehole/À̶ó´Â ÇÁ·Î±×·¥À¸·Î ÀÌ·¸°Ô ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ÀÌ¹Ì °íÁ¤µÈ À§Ä¡¿¡ ÁÖ¼ÒµéÀÌ ÀÖÀ¸¹Ç·Î ¶óÀ̺귯¸® »ý¼º ÈÄ¿¡ strip ÇÒ ¼ö ÀÖ´Ù. <bf>ÇÏÁö¸¸ ELF ¶óÀ̺귯¸®¿¡ ´ëÇؼ­´Â stripÇÏÁö ¸»¶ó</bf>. <sect3>libc-lite ¶õ ¹«¾ùÀΰ¡? <p>libc-lite ¶ó°í ÇÏ´Â °ÍÀº libc ¿¡ ´ëÇÑ ¼Ò±Ô¸ð ¹öÀüÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. ÇϳªÀÇ Ç÷ÎÇÇ ¾È¿¡ µé¾î°¡°í À¯´Ð½ºÀÇ ÀÚÀßÇÑ ¸¹Àº ¾÷¹«µé¿¡ ÃæºÐÇÑ Á¤µµ¸¸À¸·Î ±¸¼ºµÈ ¶óÀ̺귯¸®ÀÌ´Ù. ±×°ÍÀº curses ³ª dbm, termcap µîÀÇ Äڵ带 <em>Æ÷ÇÔÇÏ°í ÀÖÁö ¾Ê´Ù</em>. ¸¸¾à ¿©·¯ºÐÀÇ <tt>/lib/libc.so.4</tt>°¡ lite ¹öÀüÀÇ ¶óÀ̺귯¸®¿¡ ¸µÅ©µÇ¾î ÀÖ´Ù¸é Áï½Ã ¿ÏÀüÇÑ libc ¹öÀüÀ¸·Î ±³Ã¼Çϱ⠹ٶõ´Ù. º¸Åë ½½·¢¿þ¾îÀÇ ·çÆ® µð½ºÄÏÀ» ¸¶¿îÆ®Çغ¸¸é ÀÌ lite ¹öÀüÀÇ C ¶óÀ̺귯¸®°¡ µé¾îÀÖÀ½À» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¼³Ä¡ Áغñ¿Í ¼³Ä¡¿¡ ÇÊ¿äÇÑ ¸¸Å­ÀÇ ÀÛÀº C ¶óÀ̺귯¸®ÀÌ´Ù. <sect2>¸µÅ©Çϱâ : ÀϹÝÀûÀÎ ¹®Á¦µé <p>¿©·¯ºÐÀÇ ¸µÅ© ¹®Á¦¸¦ ³»°Ô º¸³»´Þ¶ó! ±×·¯¸é ±×°Í¿¡ ´ëÇؼ­ ³ª´Â ¾Æ¹« Àϵµ ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ ¸¹ÀÌ ½×ÀÌ´Â ¹®Á¦¿¡ ´ëÇؼ­´Â ±ÛÀ» ¾²°Ú´Ù. <descrip> <tag>°øÀ¯ ¶óÀ̺귯¸®¿Í ¸µÅ©µÇ±æ ¹Ù¶ó´Âµ¥ Á¤Àû ¶óÀ̺귯¸®¿Í ¸µÅ©µÇ°í ÀÖ´Ù.</tag> <label id="index.77"> <!-- binaries too big --> <label id="index.78"> <!-- statically linked binaries, unexpected --> ¿ì¼±Àº <tt/ld/°¡ °øÀ¯¶óÀ̺귯¸®¸¦ Á¦´ë·Î ãÀ» ¼ö ÀÖµµ·Ï ¸µÅ©°¡ ¾Ë¸Â°Ô µÇ¾î ÀÖ´ÂÁö Á¡°ËÇÑ´Ù. ELF¿¡ ´ëÇؼ­¶ó¸é ÀÌ°ÍÀº <tt>libfoo.so</tt> ½Éº¼¸¯ ¸µÅ©¸¦ ¸»Çϸç a.outÀÇ °æ¿ì¿¡´Â <tt>libfoo.sa</tt>È­ÀÏÀ» ¸»ÇÏ´Â °ÍÀÌ´Ù. ELF binutil 2.5 ¹öÀü¿¡¼­ 2.6 ¹öÀüÀ¸·Î ¾÷±×·¹À̵åÇÑ ¸¹Àº »ç¶÷µéÀÌ °Þ°í ÀÖ´Â ¹®Á¦ÀÌ´Ù. Àü ¹öÀüÀÌ °øÀ¯ ¶óÀ̺귯¸®¿¡ ´ëÇÏ¿© ¿ÀÈ÷·Á ´õ ¶È¶ÈÇÏ°Ô Ã£¾Æ³Â´Âµ¥, ±× »ç¶÷µéÀº ¸ðµç ¸µÅ©¸¦ Á¦´ë·Î ¸¸µéÁö ¾Ê¾Ò´ø °ÍÀÌ´Ù. ÁöÀûÀÎ Çൿ¾ç½ÄÀ» ´Ù¸¥ ¸ðµç ¼³°è¹æ½Ä°úÀÇ È£È¯¼ºÀ» À§Çؼ­ ½Å¹öÀü¿¡¼­ Á¦°ÅµÇ¾ú´Ù. ÁöÀû Çൿ¾ç½ÄÀº À߸øµÈ °¡Á¤À» °®°Ô µÇ°í ¿ÀÈ÷·Á ´õ ¸¹Àº ¹®Á¦¸¦ ³º±â ¶§¹®¿¡ ±×·¸°Ô ÇÑ °ÍÀÌ´Ù. <tag>DLL ÅøÀÎ mkimage °¡ libgcc¸¦ ã´Âµ¥ ½ÇÆÐÇÑ´Ù.</tag> <label id="index.79"> <!-- libgcc --> <tt/libc.so.4.5.x/¿Í ±× ÀÌ»óÀÇ ¹öÀü¿¡ °üÇÏ¿© libgcc´Â ´õ ÀÌ»ó °øÀ¯ ¶óÀ̺귯¸®°¡ ¾Æ´Ï´Ù. µû¶ó¼­ ¿©·¯ºÐÀº `<tt/-lgcc/'¿Í °°Àº ¶óÀÎÀ» ¸ðµÎ <tt/`gcc -print-libgcc-file-name`/·Î ¹Ù²ãÁÖ¾î¾ß ÇÑ´Ù. (ÁÖÀÇÇÒ °ÍÀº ¹Ù·Î ¹éÄõ¿ìÆ®¹®ÀÚ(`)ÀÇ »ç¿ëÀÌ´Ù. ²À ÀÌ ¹®ÀÚ¸¸À» »ç¿ëÇ϶ó.) ¶ÇÇÑ ¸ðµç <tt>/usr/lib/libgcc*</tt> È­ÀϵéÀ» »èÁ¦Ç϶ó. ÀÌ°ÍÀÌ Áß¿äÇÏ´Ù. <tag><tt>__NEEDS_SHRLIB_libc_4</tt>µµ ¸¶Âù°¡Áö ¹®Á¦ÀÌ´Ù.</tag> <tag>DLL »ý¼º½Ã¿¡ ``Assertion failure'' ¸Þ½ÃÁö</tag> ÀÌ ¸Þ½ÃÁö´Â ¿©·¯ºÐÀÌ °¡Áö°í ÀÖ´Â jump table ½½·ÔÀÌ ¿ø·¡ÀÇ <tt/jump.vars/È­ÀÏ¿¡ ³Ê¹« ÀûÀº °ø°£ ¹Û¿¡ ¿¹¾àµÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ ¿À¹öÇ÷οì·Î ÀÎÇØ »ý±â´Â ¹®Á¦ÀÌ´Ù. ¿©·¯ºÐÀº tools-2.17.tar.gz ÆÐÅ°Áö¿¡ µé¾î ÀÖ´Â `<tt/getsize/' ¸í·ÉÀ» »ç¿ëÇÏ¿© ±× ¹üÀÎÀ» ã¾Æ³¾ ¼ö ÀÖ´Ù. ¾Æ¸¶µµ À¯ÀÏÇÑ ÇØ°áÃ¥Àº ¸ÞÀÌÀú ¹øÈ£ÀÇ Áõ°¡ ¹Û¿¡ ¾ø´Â °Í °°´Ù. ´ÜÁö ÀÌÀü ¹öÀü°ú ȣȯµÇµµ·Ï °í·ÁÇϸ鼭 ¸»ÀÌ´Ù. <tag> <tt/ld: output file needs shared library libc.so.4/ </tag> ÀÌ·¯ÇÑ ¹®±¸´Â º¸Åë libc°¡ ¾Æ´Ñ ¶óÀ̺귯¸®µé (Áï, X À©µµ¿ì ¶óÀ̺귯¸®µé...)ÇÏ°í ¸µÅ©ÇÏ·Á°í ÇÒ ¶§ ¹ß»ýÇÑ´Ù. <tt/-static/À» ÇÔ²² »ç¿ëÇÏÁö ¾Ê°í ¸µÅ© ½Ã¿¡ <tt/-g/ ¿É¼ÇÀ» ÁÖ¾úÀ» ¶§ÀÌ´Ù. °øÀ¯ ¶óÀ̺귯¸®¿¡ ´ëÇÑ <tt/.sa/ È­ÀÏÀº º¸Åë Á¤ÀǵÇÁö <tt/_NEEDS_SHRLIB_libc_4/ ¶ó´Â ½Éº¼À» °¡Áö°í Àִµ¥ ³ªÁß¿¡ <tt/libc.sa/¿¡¼­ ÇØ°áµÈ´Ù. ÇÏÁö¸¸ <tt/-g/ ¿É¼ÇÀ» ÁÖ°Ô µÇ¸é <tt/libg.a/ ¶Ç´Â <tt/libc.a/¿Í ¸µÅ©µÇ°Ô µÇ¹Ç·Î ±× ½Éº¼Àº ÇØ°áÀÌ µÇÁö ¾Ê°Ô µÇ°í À§¿Í °°Àº ¿¡·¯ ¸Þ¼¼Áö°¡ ¶ß°Ô µÇ´Â °ÍÀÌ´Ù. °á·ÐÀûÀ¸·Î <tt/-g/ Ç÷¡±×·Î ÄÄÆÄÀÏÇÒ ¶§´Â <tt/-static/ À̶ó´Â ¿É¼ÇÀ» ÇÔ²² Áֱ⠹ٶõ´Ù. ¶Ç´Â <tt/-g/·Î ÄÄÆÄÀÏÇÏÁö ¾ÊÀ¸¸é µÈ´Ù. <em>¸µÅ©ÇÒ °Í ¾øÀÌ</em> ¿øÇÏ´Â ºÎºÐ¸¸ <tt/-g/ ¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏÇصµ ÃæºÐÇÑ µð¹ö±ë Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù. </descrip> <!-- *********************** SECTION ************************** --> <!-- * Dynamic Loading --> <sect>µ¿Àû ·Îµù(Dynamic Loading) <p><em>À̹ø ¼½¼ÇÀº Áö±Ý ÇöÀç·Î¼± ¾ÆÁÖ ÀûÀº ³»¿ë¸¸À» °¡Áö°í ÀÖ´Ù. ELF ÇÏ¿ìÅõ ¹®¼­¸¦ ¹ßÃéÇÔÀ¸·Î½á ±× ³»¿ëÀÌ °è¼ÓÀûÀ¸·Î ´Ã¾î³ª°Ô µÉ °ÍÀÌ´Ù.</em> <sect1>°³³ä Àâ±â <p>¸®´ª½º´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ °¡Áö°í ÀÖ´Ù. ÀÌ ±Û Àüü¸¦ Àд µ¿¾È ÀÌÁ¦´Â ÀÌ·± ¸» µè´Â °Íµµ Áú·ÈÀ» °ÍÀÌ´Ù. ÀüÅëÀûÀ¸·Î ÇÁ·Î±×·¥ ¸µÅ© °úÁ¤¿¡¼­ ÇàÇÑ ÀÛ¾÷Àº ·Îµù °úÁ¤¿¡¼­ ±× ¹Ý´ë °úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù. <sect1>¿¡·¯ ¸Þ¼¼Áö <p> <descrip> <tag><tt>can't load library: /lib/libxxx.so, Incompatible version</tt></tag> a.out ¿¡¼­¸¸ ÀϾ´Âµ¥, ÀÌ ¸»Àº ¿©·¯ºÐÀÇ ¶óÀ̺귯¸® ¸ÞÀÌÀú ¹öÀüÀÌ Æ²¸®´Ù´Â ¸»ÀÌ´Ù. ´Ù¸¥ ¹öÀüÀ» °¡Áö°í ÀÖ´Ù°í Çؼ­ ´«°¡¸²½ÄÀ¸·Î ½Éº¼¸¯ ¸µÅ©ÇÏ´Â °ÍÀ¸·Î ¾ÈµÈ´Ù. µÈ´Ù ÇÒÁö¶óµµ °á±¹¿£ ¼¼±×ÆúÆ®¸¦ ÀÏÀ¸Å³ °ÍÀÌ´Ù. »õ·Î¿î ¹öÀüÀ» °¡Á®¿À¶ó.ELF¿¡¼­µµ ºñ½ºÇÑ ¸Þ¼¼Áö°¡ ³ª¿Â´Ù. <tscreen><verb> ftp: can't load library 'libreadline.so.2' </verb></tscreen> <tag><tt/warning using incompatible library version xxx/</tag> a.outÀÇ °æ¿ìÀÌ´Ù. ÇÁ·Î±×·¥ ÄÄÆÄÀÏÇÑ »ç¶÷º¸´Ù ³·Àº ¸¶ÀÌ³Ê ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ °®°í Àֱ⠶§¹®¿¡ ¹ß»ýÇÏ´Â °æ°í ¸Þ¼¼ÁöÀÌ´Ù. ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±â´Â ÇÒ °ÍÀÌ´Ù. ¾÷±×·¹À̵åÇÏ´Â °ÍÀÌ ¾î¶³±î? </descrip> <sect1>µ¿Àû ·Î´õÀÇ ÀÛµ¿ Á¦¾îÇϱâ <label id="index.80"> <!-- <tt/LD_*/ environment variables --> <label id="index.81"> <!-- ldd --> <p>¸¹Àº ȯ°æ º¯¼öµéÀÌ µ¿Àû ·Î´õ¿¡ °ü°èÇÑ´Ù. ´ëºÎºÐÀº ÀÏ¹Ý »ç¿ëÀÚº¸´Ù´Â <tt/ldd/¿¡°Ô À¯¿ëÇÏ´Ù. <tt/ldd/¿¡ ´Ù¾çÇÑ ½ºÀ§Ä¡¸¦ ÁÜÀ¸·Î½á ½±°Ô ¼¼ÆÃÇÒ ¼ö ÀÖ´Ù. <itemize> <item><tt/LD_BIND_NOW/ --- ÀϹÝÀûÀ¸·Î ÇÔ¼ö°¡ È£ÃâµÇ±â Àü±îÁö´Â ¶óÀ̺귯¸®¿¡¼­ ã¾Æº¸Áö ¾Ê´Â´Ù. ÀÌ Ç÷¡±×¸¦ ¼¼ÆÃÇØÁÖ¸é ¶óÀ̺귯¸® ÀûÀç½Ã¿¡ ¸ðµç üũ¸¦ ÇÏ°Ô µÇ°í ½ÃÀÛÀº »ó´çÈ÷ ´À¸®°Ô µÈ´Ù. ÀÌ°ÍÀº ¿©·¯ºÐÀÌ ¸¸µç ÇÁ·Î±×·¥ÀÌ ¸ðµç °Íµé°ú Á¦´ë·Î ¸µÅ©°¡ µÇ¾ú´ÂÁö ½ÃÇèÇغ¼ ¶§ À¯¿ëÇÏ´Ù. <item><tt/LD_PRELOAD/ --- overriding ÇÔ¼ö Á¤ÀǸ¦ °¡Áö°í ÀÖ´Â È­ÀÏ¿¡ ¼¼ÆÃµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î¼­ ¸Þ¸ð¸® ÇÒ´ç ¹æ¹ýÀ» Å×½ºÆÃÇÏ·Á°í Çϸç, malloc¸¦ ±³Ã¼ÇÏ·Á°í ÇÒ ¶§´Â ¿©·¯ºÐÀÌ ¿øÇÏ´Â ·çƾÀ¸·Î ¸¸µç ÈÄ¿¡ ±³Ã¼ÇÒ ¼ö°¡ ÀÖ´Ù. <tt/malloc.o/ ¶ó´Â À̸§À¸·Î ÄÄÆÄÀÏÇÑ ÈÄ ´ÙÀ½°ú °°ÀÌ Çغ¸ÀÚ. <tscreen><verb> $ LD_PRELOAD=malloc.o; export LD_PRELOAD $ some_test_program </verb></tscreen> <tt/LD_ELF_PRELOAD/¿Í <tt/LD_AOUT_PRELOAD/ ÀÌ µÑÀº ºñ½ÁÇÏ´Ù. ÇÏÁö¸¸ °¢°¢ ƯÁ¤ ÇüÅ¿¡¸¸ °ü°èÇÑ´Ù. ¸¸¾à <tt/LD_ELF_PRELOAD/¿Í <tt/LD_PRELOAD/°¡ µÑ ´Ù »ç¿ëµÇ¾ú´Ù¸é Á» ´õ ÀÚ¼¼È÷ ÁöÁ¤ÇÑ ÀüÀÚ <tt/LD_ELF_PRELOAD/°¡ »ç¿ëµÈ´Ù. <item><tt/LD_LIBRARY_PATH/ --- ÀÌ°ÍÀº °øÀ¯ ¶óÀ̺귯¸®¸¦ ãÀ» ¶§ Âü°íÇÒ µð·ºÅ丮¸¦ ÄÝ·Ð(:)À» ºÐ¸®ÀÚ·Î ½á¼­ Ç¥ÇöÇÑ ¸®½ºÆ®ÀÌ´Ù. ±×°ÍÀº ld¿¡ <em>¿µÇâÀ» ÁÖÁö´Â ¸øÇÑ´Ù.</em> ´ÜÁö ½ÇÇà½Ã¿¡¸¸ °ü°èÇÑ´Ù. ¶ÇÇÑ setuid³ª setgid¸¦ °®´Â ÇÁ·Î±×·¥¿¡ ´ëÇؼ­´Â ¹«¿ëÁö¹°ÀÌ´Ù. ¸¶Âù°¡Áö·Î <tt/LD_ELF_LIBRARY_PATH/¿Í <tt/LD_AOUT_LIBRARY_PATH/´Â °¢°¢ÀÇ ¹ÙÀ̳ʸ® Çü½Ä¿¡¸¸ Àû¿ëµÇµµ·Ï ÇÏ°í ÀÖ´Ù. <tt/LD_LIBRARY_PATH/´Â Á¤»óÀûÀÎ °æ¿ì ±×·¸°Ô ÇÊ¿äÇÏÁø ¾Ê´Ù. ´ë½Å¿¡ <tt>/etc/ld.so.conf/</tt>¿¡ µð·ºÅ丮¸¦ Ãß°¡ÇÏ°í ldconfig¸¦ ´Ù½Ã ÇÑ ¹ø ½ÇÇà½ÃÅ°´Â°Ô ÁÁ´Ù. <item><tt/LD_NOWARN/ --- ÀÌ´Â a.out¿¡¸¸ Àû¿ëµÈ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ ¼¼ÆÃÇϸé <tt/LD_NOWARN=true; export LD_NOWARN/) ¸¶ÀÌ³Ê ¹öÀüÀÌ ´Ù¸£´ÙµçÁö ÇÏ´Â, Å©°Ô ½É°¢ÇÏÁö ¾Ê´Â °æ°í¸¦ Ç¥½ÃÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. <item><tt/LD_WARN/ --- ÀÌ´Â ELF¿¡¸¸ ÇØ´çµÈ´Ù. ¼¼ÆõǸé ÀϹÝÀûÀ¸·Î ``Can't find library''¿Í °°Àº ½É°¢ÇÑ ¿¡·¯¸¦ °æ°í·Î ¹Ù²Ù¾îÁØ´Ù. º°·Î ÇÊ¿ä¾ø´Â ¿É¼ÇÀÌ´Ù. <item><tt/LD_TRACE_LOADED_OBJECTS/ --- ELF¿¡¸¸ Àû¿ëµÈ´Ù. ÇÁ·Î±×·¥À¸·Î ÇÏ¿©±Ý <tt/ldd/ ÇÏ¿¡¼­ ½ÇÇàµÇ°í ÀÖ´Ù°í »ý°¢ÇÏ°Ô²û ¸¸µç´Ù. <tscreen><verb> $ 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 </verb></tscreen> </itemize> <sect1>µ¿Àû ·ÎµùÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ ¸¸µé±â <label id="index.82"> <!-- <tt/dlopen()/ --> <label id="index.83"> <!-- <tt/dlsym()/ --> <p>ÀÌ´Â ¼Ö¶ó¸®½º 2.xÀÇ µ¿Àû ·Îµù Áö¿øÀÌ ÀÌ·ïÁö´Â ¹æ½Ä°ú ¸Å¿ì Èí»çÇÏ´Ù. H J LuÀÇ ELF ÇÁ·Î±×·¡¹Ö ¹®¼­¿¡ ÀÚ¼¼È÷ ³ª¿Í ÀÖÀ¸¸ç <tt>dlopen(3)</tt> ¸ÇÆäÀÌÁö¿¡ ¾ÆÁÖ Àß ³ª¿Í ÀÖ´Ù. ¸ÇÆäÀÌÁö´Â ld.so ÆÐÅ°Áö¿¡ µé¾îÀÖ´Ù. ´ÙÀ½ ÇÁ·Î±×·¥À» <tt>-ldl</tt> ¿É¼ÇÀ» ÁÖ°í ¸µÅ©Ç϶ó. <tscreen><verb> #include <dlfcn.h> #include <stdio.h> main() { void *libc; void (*printf_call)(); if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY)) { printf_call=dlsym(libc,"printf"); (*printf_call)("hello, world\n"); } } </verb></tscreen> <!-- *********************** SECTION ************************** --> <!-- * The developers --> <sect>°³¹ßÀÚ¿Í ¿¬¶ôÇϱâ(ÀÌÇÏ´Â ¹ø¿ªµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.) <sect1> Bug reports <label id="index.84"> <!-- gcc, bugs --> <p> Start by <bf>narrowing the problem down</bf>. 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 <bf/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 <tt/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. <sect1> Helping with development <p> If you want to help with the development effort for GCC or the C library, the first thing to do is join the <tt/linux-gcc@vger.rutgers.edu/ mailing list. If you just want to see what the discussion is about, there are list archives at <url url="http://homer.ncm.com/linux-gcc/">. The second and subsequent things depend on what you want to do! <!-- Maybe there should be a TODO list for gcc/libc/whatever, for --> <!-- people who want to play with it? Moot the idea on the list --> <!-- *********************** SECTION ************************** --> <!-- * Clearing up --> <sect> The Remains <sect1> The Credits <p><quote> Only presidents, editors, and people with tapeworms have the right to use the editorial ``we''. </quote> (Mark Twain) <p> 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. <!-- of course, lots of this is due to other people; the copyright had --> <!-- better be looked at --> <sect1>Translations <p>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. <sect1> Feedback is welcomed. Mail me at <htmlurl url="mailto:dan@detached.demon.co.uk" name="dan@detached.demon.co.uk">. My PGP public key (ID 5F263625) is available from my <url url="http://ftp.linux.org.uk/~barlow/" name="web pages">, if you feel the need to be secretive about things. <sect1> Legalese <p> All trademarks used in this document are acknowledged as being owned by their respective owners. This document is copyright (C) 1996 Daniel Barlow <tt/<dan@detached.demon.co.uk>/ It may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions. All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below. In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs. If you have questions, please contact Tim Bynum, the Linux HOWTO coordinator, at <tt/linux-howto@sunsite.unc.edu/ via email. <sect>Index <p>Entries starting with a non-alphabetical character are listed in ASCII order. <itemize> <item> <tt/-fwritable-strings/ <ref id="index.39" name="39"> <ref id="index.56" name="56"> <item> /lib/cpp <ref id="index.16" name="16"> <item> a.out <ref id="index.1" name="1"> <item> <tt/ar/ <ref id="index.10" name="10"> <item> <tt/as/ <ref id="index.8" name="8"> <item> <asm/*.h> <ref id="index.19" name="19"> <item> <tt/atoi()/ <ref id="index.40" name="40"> <item> <tt/atol()/ <ref id="index.41" name="41"> <item> binaries too big <ref id="index.63" name="63"> <ref id="index.65" name="65"> <ref id="index.77" name="77"> <item> chewing gum <ref id="index.3" name="3"> <item> <tt/cos()/ <ref id="index.68" name="68"> <item> debugging <ref id="index.59" name="59"> <item> <tt/dlopen()/ <ref id="index.82" name="82"> <item> <tt/dlsym()/ <ref id="index.83" name="83"> <item> documentation <ref id="index.4" name="4"> <item> EINTR <ref id="index.52" name="52"> <item> elf <ref id="index.0" name="0"> <ref id="index.71" name="71"> <item> <tt/execl()/ <ref id="index.57" name="57"> <item> <tt/fcntl/ <ref id="index.47" name="47"> <item> <tt/FD_CLR/ <ref id="index.44" name="44"> <item> <tt/FD_ISSET/ <ref id="index.45" name="45"> <item> <tt/FD_SET/ <ref id="index.43" name="43"> <item> <tt/FD_ZERO/ <ref id="index.46" name="46"> <item> <tt/file/ <ref id="index.2" name="2"> <item> <float.h> <ref id="index.20" name="20"> <item> gcc <ref id="index.6" name="6"> <item> <tt/gcc -fomit-frame-pointer/ <ref id="index.61" name="61"> <item> <tt/gcc -g/ <ref id="index.60" name="60"> <item> gcc -v <ref id="index.14" name="14"> <item> gcc, bugs <ref id="index.15" name="15"> <ref id="index.28" name="28"> <ref id="index.29" name="29"> <ref id="index.84" name="84"> <item> gcc, flags <ref id="index.13" name="13"> <ref id="index.25" name="25"> <ref id="index.26" name="26"> <item> gdb <ref id="index.64" name="64"> <item> header files <ref id="index.17" name="17"> <item> interrupted system calls <ref id="index.51" name="51"> <item> <tt/ld/ <ref id="index.9" name="9"> <item> <tt/LD_*/ environment variables <ref id="index.80" name="80"> <item> ldd <ref id="index.81" name="81"> <item> libc <ref id="index.7" name="7"> <item> <tt/libg.a/ <ref id="index.62" name="62"> <item> libgcc <ref id="index.79" name="79"> <item> <limits.h> <ref id="index.21" name="21"> <item> lint <ref id="index.58" name="58"> <item> <linux/*.h> <ref id="index.18" name="18"> <item> manual pages <ref id="index.5" name="5"> <item> <tt/<math.h>/ <ref id="index.70" name="70"> <item> maths <ref id="index.69" name="69"> <item> <tt/mktemp()/ <ref id="index.55" name="55"> <item> optimisation <ref id="index.27" name="27"> <item> QMAGIC <ref id="index.76" name="76"> <item> segmentation fault <ref id="index.30" name="30"> <ref id="index.54" name="54"> <item> segmentation fault, in GCC <ref id="index.33" name="33"> <item> select() <ref id="index.50" name="50"> <item> <tt/SIGBUS/ <ref id="index.34" name="34"> <item> <tt/SIGEMT/ <ref id="index.35" name="35"> <item> <tt/SIGIOT/ <ref id="index.36" name="36"> <item> SIGSEGV <ref id="index.31" name="31"> <ref id="index.53" name="53"> <item> SIGSEGV, in gcc <ref id="index.32" name="32"> <item> <tt/SIGSYS/ <ref id="index.38" name="38"> <item> <tt/SIGTRAP/ <ref id="index.37" name="37"> <item> <tt/sin()/ <ref id="index.67" name="67"> <item> soname <ref id="index.73" name="73"> <item> <tt/sprintf()/ <ref id="index.42" name="42"> <item> statically linked binaries, unexpected <ref id="index.66" name="66"> <ref id="index.78" name="78"> <item> <stdarg.h> <ref id="index.23" name="23"> <item> <stddef.h> <ref id="index.24" name="24"> <item> <tt/strings/ <ref id="index.11" name="11"> <item> <tt><sys/time.h></tt> <ref id="index.48" name="48"> <item> <tt><unistd.h></tt> <ref id="index.49" name="49"> <item> <varargs.h> <ref id="index.22" name="22"> <item> version numbers <ref id="index.12" name="12"> <ref id="index.74" name="74"> <item> weird things <ref id="index.72" name="72"> <item> ZMAGIC <ref id="index.75" name="75"> </itemize> <!-- ************** E N D O F G C C - H O W T O **************** --> </article>