The Linux GCC HOWTO
The Linux GCC HOWTO
Daniel Barlow <dan@detached.demon.co.uk>
v1.17, 28 February 1996
GNU C ÄÄÆÄÀÏ·¯¿Í ¶óÀ̺귯¸®¸¦ ¸®´ª½º »ó¿¡¼ ¾î¶»°Ô ¼Â¾÷ÇÏ´ÂÁö¿¡
´ëÇØ ´Ù·ç°í ÀÖ´Ù. ±×¸®°í ¸®´ª½º »ó¿¡¼ ÄÄÆÄÀÏ, ¸µÅ·, ½ÇÇà, µð¹ö±ëÀ» ¾î¶»°Ô
ÇÏ´ÂÁö¿¡ ´ëÇÏ¿© °³·«ÀûÀÎ Áö½ÄÀ» Á¦°øÇÑ´Ù. ´ëºÎºÐÀÇ ³»¿ëÀº Mitch D'Souza¾¾ÀÇ
GCC-FAQ·ÎºÎÅÍ Â÷¿ëÇØ¿Â °ÍÀ̸ç (¸¹Àº ºÎºÐ ±³Ã¼Çß´Ù.) ¶ÇÇÑ ELF-HOWTO·ÎºÎÅ͵µ
Â÷¿ëÀ» ÇØ¿Â °ÍÀÌ´Ù. (À̰͵µ ¶ÇÇÑ ´ëºÎºÐ ¹Ù²î°Ô µÉ °ÍÀÌ´Ù.) ÀÌ ¹®¼´Â ù¹ø° °ø°³ ¹öÀüÀÌ´Ù. (¹öÀü ¹øÈ£´Â RCS ÀÇ Àå³ÀÏ »ÓÀÌ´Ù.) ¿©·¯ºÐÀÇ ÀÇ°ßÀ» ȯ¿µÇÑ´Ù.
¸®´ª½º °³¹ßÀº Áö±Ý ÇöÀç¿¡µµ ²÷ÀÓ¾ø´Â º¯È °úÁ¤¿¡ ³õ¿© ÀÖ´Ù. °£´ÜÈ÷ ¸»Çؼ,
¸®´ª½ºÀÇ Ãø¸é¿¡¼ ¾î¶»°Ô ½ÇÇàÇØ¾ß ÇÏ´ÂÁö ¾Ë°í ÀÖ´Â ¹ÙÀ̳ʸ®´Â ¹Ù·Î ÀÌ 2 °¡Áö
Á¾·ù°¡ ÀÖ´Ù. ¿©·¯ºÐÀÇ ½Ã½ºÅÛÀÌ ¾î¶»°Ô ±¸¼ºµÇ¾î ÀÖ´ÂÁö¿¡ µû¶ó µÑ ´Ù °¡Áö°í
ÀÖÀ»¼öµµ ÀÖ´Ù.
2 °¡Áö¸¦ ¾î¶»°Ô ±¸º°Çϴ°¡? file
À̶ó°í ÇÏ´Â À¯Æ¿¸®Æ¼¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
ELFÇÁ·Î±×·¥¿¡ ´ëÇؼ´Â ELF ¶ó°í ¾î¼±¸ Àú¼±¸ ¸»ÇÒ °ÍÀ̸ç, a.out ÇÁ·Î±×·¥¿¡
´ëÇؼ´Â Linux/i386
À̶ó´Â ´Ü¾î°¡ µé¾î°¡´Â ¸»·Î ¾ê±âÇØÁÙ °ÍÀÌ´Ù.
µÑ °£ÀÇ Â÷ÀÌ´Â ¹®¼ ÈĹݺο¡¼ ¼³¸íµÉ °ÍÀÌ´Ù. ELF ´Â »õ·Î¿î ½ÇÇàÈÀÏ Çü½ÄÀ̸ç,
ÀϹÝÀûÀ¸·Î ´õ ¶Ù¾î³ª´Ù°í ¿©°ÜÁö°í ÀÖ´Ù.
ÀúÀ۱ǿ¡ °ü·ÃµÈ Á¤º¸´Â ÀÌ ¹®¼ÀÇ ¸¶Áö¸·À» Âü°íÇ϶ó. ¶ÇÇÑ,
ÈĹݺο¡¼ ÀÌ ±ÛÀ» Àаí, Usenet¿¡ ¹Ùº¸°°Àº Áú¹®(Á¸ÀçÇÏÁö ¾Ê´Â GCCÀÇ ¹ö±×¸¦ ¹ßÇ¥ÇÏ´Â µî)À» ¿Ã¸®Áö ¸»¶ó´Â
°æ°í¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ ¹®¼´Â ¸®´ª½º ÇÏ¿ìÅõ ¹®¼ ½Ã¸®ÁîÀÇ ÇϳªÀÌ´Ù. µû¶ó¼ ¸ðµç ¸®´ª½º ÇÏ¿ìÅõ
¹®¼°¡ ÀúÀåµÇ¾î ÀÖ´Â °÷À̶ó¸é ¾îµðµç ÀÖ´Ù. ¿¹¸¦ µé¾î¼
http://sunsite.unc.edu/pub/linux/docs/HOWTO/¿Í °°Àº °÷ÀÌ ¹Ù·Î ±×°÷ÀÌ´Ù.
HTML ¹öÀüÀº
http://ftp.linux.org.uk/~barlow/howto/gcc-howto.html¿¡¼ ãÀ» ¼ö ÀÖÀ¸¸ç
¾à°£ ¹öÀüÀÌ ³ôÀ» Áöµµ ¸ð¸¥´Ù.
gcc ¿¡ ´ëÇÑ °ø½ÄÀûÀÎ ¹®¼´Â ¼Ò½º ¹èÆ÷ ÈÀÏ¿¡ µé¾îÀÖ´Ù. texinfo ÈÀÏ,
.info
ÈÀÏÀÇ Çü½ÄÀ¸·Î µé¾îÀÖ´Ù. ³×Æ®¿öÅ© ¼Óµµ°¡ ºü¸£´Ù°Å³ª, ½Ãµð·Ò¿¡
°¡Áö°í Àְųª, ¶Ç´Â Àγ»½ÉÀÌ ¸¹´Ù°í »ý°¢µÉ ¶§¿¡´Â ±×°ÍÀ» untar ÇÑ ÈÄ¿¡ ÇØ´ç
ÈÀÏÀ» /usr/info
µð·ºÅ丮¿¡ Ä«ÇÇÇϵµ·Ï ÇÏÀÚ. ¸¸¾à ¾ø´Ù¸é
tsx-11¿¡ °¡¼
ÀڷḦ ã¾Æº¸ÀÚ. Ç×»ó ÃֽŠ¹öÀüÀÌ ÀÖ´Â °ÍÀº ¾Æ´Ò °ÍÀÌ´Ù.
libc ¿¡ ´ëÇÑ ¹®¼´Â 2 °¡Áö°¡ ÀÖ´Ù. GNU libc ÀÇ °æ¿ì¿¡´Â info ÈÀϵéÀ»
°¡Áö°í Àִµ¥ stdio ºÎºÐÀ» »©°í´Â ¾ÆÁÖ ÀÚ¼¼È÷ ¸®´ª½º libc ¿¡ ´ëÇؼ ¾Ë·ÁÁÖ°í
ÀÖ´Ù.
¸ÇÆäÀÌÁöµµ ±¸ÇÒ
¼ö Àִµ¥ ½Ã½ºÅÛ È£Ãâ(system call ¼½¼Ç 2), ¸¹Àº libc ÇÔ¼ö(¼½¼Ç 3)¿¡ ´ëÇØ ¾ÆÁÖ
»ó¼¼È÷ ¼³¸íÇÏ°í ÀÖ´Ù.
µÎ °¡Áö ´äÀÌ ÀÖ´Ù.
(a) ¸®´ª½º GCC ÀÇ °ø½ÄÀûÀÎ ¹èÆ÷ÆÇÀº
ftp://tsx-11.mit.edu:/pub/linux/packages/GCC/¿¡¼
¹ÙÀ̳ʸ® ÇüÅ·Π±¸ÇÒ ¼ö ÀÖ´Ù. Áï ÀÌ¹Ì ÄÄÆÄÀϵǾî ÀÖ´Â °ÍÀ» ¸»ÇÑ´Ù. Áö±Ý ±ÛÀ»
¾²°í ÀÖ´Â ÀÌ ¼ø°£¿¡ ÃֽŠ¹öÀüÀº 2.7.2 ·Î¼ ÈÀϸíÀº
gcc-2.7.2.bin.tar.gz
ÀÌ´Ù. (ÆíÁýÀÚÁÖ: ÀÌ ¹®¼ÀÇ ÀÛ¼º½Ã±â°¡ 96³âµµÀÓÀ»
»ó±âÇ϶ó!)
(b) FSF·ÎºÎÅÍÀÇ ÃֽŠ¼Ò½º ¹öÀüÀº GNU ÇÁ·Î±×·¥ ÀúÀå¼ÒÀÎ
GNU archives¿¡¼
±¸ÇÒ ¼ö ÀÖ´Ù. ¼Ò½º ¹öÀüÀÌ Ç×»ó °ø½Ä¹èÆ÷ÆÇ ¹ÙÀ̳ʸ® ¹öÀü°ú °°Àº °ÍÀº ¾Æ´Ï´Ù.
configure
½ºÅ©¸³Æ®¸¦ ÀÌ¿ëÇؼ ¸ðµç ¼³Á¤À» ÇÒ ¼ö ÀÖ´Ù.
tsx-11µµ ¸¶Àú
»ìÆ캸µµ·Ï ÇÏÀÚ. ÆÐÄ¡ÈÀÏÀÌ ÇÊ¿äÇÒ Áöµµ ¸ð¸£±â ¶§¹®ÀÌ´Ù.
¾î¶² °ÍÀ̵ç ÄÄÆÄÀÏÀ̶ó´Â °ÍÀ» Çϱâ À§Çؼ´Â ´ÙÀ½ÀÌ ÇÊ¿äÇÏ´Ù.
¿©±â¼ ¿©·¯ºÐ¿¡°Ô ÇÊ¿äÇÑ °ÍÀº ÀÏ´Ü (1)¿©·¯ºÐÀÇ ½Ã½ºÅÛÀÌ a.out Àΰ¡? (2)
¾Æ´Ï¸é µÑ ´Ù ÀÖ´Â °æ¿ì¿¡ µÑ Áß¿¡ ¹«¾ùÀ» ÅÃÇÏ°í ½ÍÀº°¡? ¿¡ µû¶ó ´Þ¶óÁø´Ù. ¸¸¾à
¿©·¯ºÐÀÌ libc 4 ¿¡¼ libc 5 ·Î ¾÷±×·¹À̵åÇÏ·Á°í ÇÑ´Ù¸é ¿ì¼±Àº ELF-HOWTO¹®¼¸¦
ºÁ¾ßÇÒ °ÍÀÌ´Ù.
tsx-11¿¡¼
±¸ÇÒ ¼ö ÀÖ´Ù.
libc-5.2.18.bin.tar.gz
-
--- ELF °øÀ¯ ¶óÀ̺귯¸® À̹ÌÁö, Á¤Àû
¶óÀ̺귯¸® ±×¸®°í C ¶óÀ̺귯¸®¿Í ¼öÇÐ ¶óÀ̺귯¸®¸¦ À§ÇÑ Çì´õÈÀϵé
libc-5.2.18.tar.gz
-
--- À§ ¶óÀ̺귯¸®¿¡ ´ëÇÑ ¼Ò½º. ¿©·¯ºÐÀº
Çì´õ ÈÀÏÀ» ±¸ÇØ¾ß Çϱ⠶§¹®¿¡ À§¿¡ ÀÖ´Â ¹ÙÀ̳ʸ®
¹èÆ÷Æǵµ
ÇÊ¿äÇÏ´Ù. ¼Õ¼ö ÄÄÆÄÀÏÀ» ÇÒ °ÍÀÎÁö ¾Æ´Ï¸é ±×³É ¹ÙÀ̳ʸ®¸¦ »ç¿ëÇÒ °ÍÀÎÁö¿¡ ´ëÇÑ
´äÀº °£´ÜÇÏ´Ù. ¹ÙÀ̳ʸ®¸¦ »ç¿ëÇ϶ó! ÇÏÁö¸¸ NYS³ª ¼Îµµ¿ì Æнº¿öµå ±â´ÉÀ» ¿øÇÒ ¶§´Â
¼Õ¼ö ÄÄÆÄÀÏÇÏ´Â ¼ö ¹Û¿¡ ¾ø´Ù.
libc-4.7.5.bin.tar.gz
-
--- a.out °øÀ¯ ¶óÀ̺귯¸® À̹ÌÁö,
Á¤Àû ¶óÀ̺귯¸®(C ÇÔ¼ö, ¼öÇÐ ÇÔ¼ö), À§¿¡ ÀÖ´Â libc 5 ¿Í °øÁ¸ÇÒ ¼ö ÀÖ°Ô²û
µðÀÚÀεǾî ÀÖ´Ù. ÇÏÁö¸¸ ¿©·¯ºÐÀÌ a.out ÇÁ·Î±×·¥À» ¾ÆÁ÷µµ °®°í Àְųª °³¹ßÇÏ·Á°í
ÇÒ ¶§¸¸ ÇÊ¿äÇÏ´Ù.
tsx-11¿¡¼
±¸ÇÒ ¼ö ÀÖÀ¸¸ç, ÇöÀç ¹öÀüÀº binutils-2.6.x.x.bin.tar.gz
ÀÌ´Ù.
¹ÙÀ̳ʸ® À¯Æ¿¸®Æ¼µéÀº ¿À·ÎÁö ELF ¸¸ ÀÖ´Ù´Â »ç½Ç¿¡ À¯ÀÇÇÏÀÚ. ÇöÀç
¶óÀ̺귯¸®´Â ELF ·Î¸¸ °³¹ßµÇ°í ÀÖÀ¸¸ç a.out ¶óÀ̺귯¸®´Â ELF ¿Í °°ÀÌ ¾µ ¶§¸¸
ÀǹÌÀÖ´Ù°í »ý°¢ÇÑ´Ù. C ¶óÀ̺귯¸® °³¹ßÀº ELF ÂÊÀ¸·Î¸¸ ÁøÇàµÇ°í ÀÖÀ¸¸ç,
a.outÀ¸·Î ÇؾßÇÒ Ä¿´Ù¶õ ÀÌÀ¯ °°Àº°Ô ¾ø´Ù¸é ±×¿¡ µû¸£´Â °ÍÀÌ ÁÁ´Ù.
ÇöÀç »ç¿ë ÁßÀÎ 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
À̶ó´Â ´Ü¾î°¡ µé¾î°¥ ¼öµµ ÀÖ´Ù. ¶Ç´Â ¸®´ª½º Ä¿³Î ¹öÀüÀÌ
µé¾î°¡µµ·Ï ÇÒ ¼öµµ ÀÖ´Ù. ¾ÏÆ° ¸®´ª½º¿ëÀÓÀ» Àß ³ªÅ¸³»°í ÀÖ´Ù. °£´ÜÈ÷ °á·ÐÀ»
¸»ÇÏÀÚ¸é, ÀÌ ´Ü¾îÀÇ ¶æÀº »ç¿ëÁßÀÎ GCC ¹öÀü¿¡ µû¶ó ´Ù¸£°Ô Çؼ®µÈ´Ù.
- 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 ¸¦ °¡Áö°í
ÀÖ´Ù´Â °ÍÀÌ´Ù.
±×³É ¾Æ¹« »ý°¢¾øÀÌ gcc ¸¦ ¼³Ä¡Ç߰ųª ¹èÆ÷ÆÇÀ» ¼³Ä¡ÇÒ ¶§ ÀÚµ¿À¸·Î ¼³Ä¡ÇÏ°Ô
Çß´Ù¸é, µµ´ëü ¸®´ª½º ÈÀÏ ½Ã½ºÅÛ »ó¿¡¼ ¾îµð¿¡ À§Ä¡ÇÏ´ÂÁö ¾Ë°í ½ÍÀ» °ÍÀÌ´Ù.
´ë´äÀº ÀÌ·¸´Ù.
-
/usr/lib/gcc-lib/
target/
version/
(±×¸®°í ¸ðµç ÇÏÀ§ µð·ºÅ丮µé)ÀÌ ÄÄÆÄÀÏ·¯ÀÇ
´ëºÎºÐÀÌ À§Ä¡ÇÏ´Â Àå¼ÒÀÌ´Ù. ÄÄÆÄÀÏÀ» ¼öÇàÇÏ´Â ½ÇÇàÈÀÏ ±× ÀÚü¿Í gcc ¹öÀü¿¡
µû¸¥ ¶óÀ̺귯¸®¿Í Çì´õÈÀϵéÀÌ µé¾îÀÖ´Ù.
-
/usr/bin/gcc
´Â ÄÄÆÄÀÏ·¯ ¿îÀü»ç(Compiler Driver)¿ªÇÒÀ» ÇÑ´Ù.
Ä¿¸Çµå »ó¿¡¼´Â gcc ¶ó°í¸¸ ¸í·ÉÇÑ´Ù. ¸¸¾à ¿©·¯ ¹öÀüÀÇ ÄÄÆÄÀÏ·¯¸¦ °¡Áö°í ÀÖ´Ù¸é
¿©·¯ ¹öÀü°ú ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Ù. gcc °¡ »ç¿ëÇÏ°Ô µÉ µðÆúÆ® ¹öÀüÀÇ ÄÄÆÄÀÏ·¯¸¦
¾Ë¾Æ³»±â À§Çؼ´Â gcc -v
¶ó°í Çغ¸¸é µÈ´Ù. ´Ù¸¥ ¹öÀüÀ¸·Î °Á¦·Î ÄÄÆÄÀÏÇÏ°Ô
ÇÏ·Á¸é gcc -V
version ÀÌ·± ½ÄÀ¸·Î »ç¿ëÇÏ¸é µÈ´Ù. ¿¹¸¦ µé¾î¼...
# gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
# gcc -V 2.6.3 -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.6.3/specs
gcc driver version 2.7.2 executing gcc version 2.6.3
-
/usr/
target/(bin|lib|include)/
. ¿©·¯ºÐÀÌ ¿©·¯
°³ÀÇ ¸ñÇ¥ Çü½ÄÀ» °¡Áö°í ÀÖ´Ù¸é (ÀÏ´Ü ELFÀΰ¡ a.out Àΰ¡ ¶Ç´Â ¿©·¯ ÇüÅÂÀÇ Å©·Î½º
ÄÄÆÄÀÏ·¯ µî) µðÆúÆ® ¸ñÇ¥ Çü½Ä¿ëÀÌ ¾Æ´Ñ ¶óÀ̺귯¸®, ¹ÙÀ̳ʸ® À¯Æ¿¸®Æ¼ (as
, ld
µî...), Çì´õ ÈÀϵ鵵 ã¾Æº¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¿À·ÎÁö ÇÑ Á¾·ùÀÇ gcc ¸¦ °¡Áö°í ÀÖ´Ù ÇÏ´õ¶óµµ ¸Å¿ì ¸¹Àº °ÍµéÀÌ ±× µð·ºÅ丮¿¡
±ò·ÁÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö ¾Ê´Ù¸é ¾Æ¸¶µµ
/usr/(bin|lib|include)
¿¡ ÀÖÀ» °ÍÀÌ´Ù.
-
/lib/
,/usr/lib
±×¸®°í ¿©Å¸ ¶óÀ̺귯¸® µð·ºÅ丮µéÀÌ
±âº» ½Ã½ºÅÛÀ» À§ÇÑ ¶óÀ̺귯¸® µð·ºÅ丮ÀÌ´Ù. ¿©·¯ºÐÀº ¶ÇÇÑ »ó´çÈ÷ ¸¹Àº
ÇÁ·Î±×·¥¿¡ ´ëÇÏ¿© /lib/cpp
¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. (X °¡ ½ÇÁ¦·Î ¸¹ÀÌ
»ç¿ëÇÏ°í ÀÖ´Ù.) /usr/lib/gcc-lib/
target/
version/
¿¡ ÀÖ´Â cpp ¸¦ Ä«ÇÇÇسõ´ø°¡? ¾Æ´Ï¸é ½Éº¼¸¯ ¸µÅ©¸¦ ÇØÁØ´Ù.
¿©·¯ºÐÀÌ ¼Õ¼ö /usr/local/include
¿¡ ¼³Ä¡ÇÑ °Íµé »©°í ¸®´ª½º¿¡´Â 3
°¡Áö Áß¿ä Çì´õ µð·ºÅ丮°¡ ÀÖ´Ù.
- ´ëºÎºÐÀÇ
/usr/include/
¿Í ±× ÇϺΠµð·ºÅ丮µéÀº H J Lu ÀÇ libc
¹ÙÀ̳ʸ® ¹èÆ÷ÆÇ¿¡ ÀÇÇؼ Á¦°øµÈ´Ù. ¿©±â¼ º»ÀÎÀº "´ëºÎºÐ"À̶ó´Â Ç¥ÇöÀ» ½è´Âµ¥,
±× ÀÌÀ¯´Â ´Ù¸¥ ¼Ò½º (¿¹¸¦ µé¾î curses
, dbm
¶óÀ̺귯¸®)¿¡¼ ¿Â
Çì´õÈÀϵ鵵 Àֱ⠶§¹®ÀÌ´Ù. ƯÈ÷³ª ÃÖ±Ù libc ¹èÆ÷ÆÇÀ» °¡Á®¿À¸é ±×·¯ÇÑ
Çì´õÈÀϵéÀº ¾ø´Ù. (¿¹Àü¿¡´Â °°ÀÌ ´Þ·Á¼ ¿ÔÁö¸¸)
-
/usr/include/linux
¿Í /usr/include/asm
(<linux/*.h>
ÈÀÏ°ú
<asm/*.h>
¿¡ ÀÇÇØ
ÂüÁ¶µÇ´Â Çì´õÈÀϵéÀÌ ÀÖ´Â Àå¼Ò)´Â °¢°¢ Ä¿³Î ¼Ò½º¿¡¼ linux/include/linux
¿Í linux/include/asm
À»
°¡¸®Å°´Â ½Éº¼¸¯ ¸µÅ©¿©¾ß ÇÑ´Ù. ¹º°¡ Á¶±ÝÀÌ¶óµµ Å« ÀÛ¾÷À» ÇÏ·Á°í ÇÑ´Ù¸é
ºÐ¸íÈ÷ ¼³Ä¡ÇØ¾ß ÇÑ´Ù. Ä¿³Î ÄÄÆÄÀÏÀ» Çϱâ À§Çؼ¸¸ ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù.
¶ÇÇÑ Ä¿³Î ¼Ò½º¸¦ Ç®°í ³ª¼ make config
¶ó´Â ÀÛ¾÷À» ÇØÁÖ¾î¾ß ÇÒ °ÍÀÌ´Ù.
¸¹Àº ÈÀϵéÀÌ ±× °úÁ¤À» ÅëÇؼ »ý°Ü³ª´Â <linux/autoconf.h>
¶ó´Â
ÈÀÏ¿¡ ÀÇÁ¸Çϱ⠶§¹®ÀÌ´Ù. ±×¸®°í ¾î¶² ¹öÀüÀÇ Ä¿³Î¿¡¼´Â asm
À̶ó°í ÇÏ´Â
°ÍÀÌ ½Éº¼¸¯ ¸µÅ©ÀÏ »Ó, make config
ÇÒ ¶§¸¸ »ý±â´Â °æ¿ì°¡ ÀÖ´Ù.
asm Àº º¸Åë asm-i386
À¸·Î ¸µÅ©µÇ¾î ÀÖ´Ù. ±×Àü¿¡´Â ¿À·ÎÁö ÀÎÅÚ ¸Ó½Å¿ë
Çì´õÈÀϸ¸ÀÌ ÀÖ¾ú±â ¶§¹®¿¡ asm ¸¸ÀÌ ÀÖ¾úÁö¸¸ ÀÌÁ¦´Â ¸®´ª½º°¡ ¸í½Ç»óºÎÇÏ°Ô
¸ÖƼÇ÷§Æû ¿î¿µÃ¼Á¦·Î ³ª¾Æ°¡°í Àֱ⠶§¹®ÀÌ´Ù. asm-i386
¸»°íµµ
asm-alpha
, asm-generic
, asm-m68k
, asm-mips
, asm-ppc
, asm-sparc
µîÀÇ Çì´õ ÈÀÏ µð·ºÅ丮°¡ ÀÖ´Â
°ÍÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Ù.
µû¶ó¼ /usr/src/linux
¶ó°í ÇÏ´Â µð·ºÅ丮¿¡ ÀÌ¹Ì ¼Ò½º¸¦ Ç®¾î³õ¾Ò´Ù¸é...
$ cd /usr/src/linux
$ su
# make config
[answer the questions. Unless you're going to go on and build the kernel
it doesn't matter _too_ much what you say]
# cd /usr/include
# ln -s ../src/linux/include/linux .
# ln -s ../src/linux/include/asm .
-
<float.h>
, <limits.h>
,
<varargs.h>
, <stdarg.h>
±×¸®°í
<stddef.h>
µîÀÇ ÈÀϵéÀº ÄÄÆÄÀÏ·¯ ¹öÀü¸¶´Ù ´Ù¸¦ °ÍÀÌ´Ù. ±×¸®°í
±×µéÀº /usr/lib/gcc-lib/i486-box-linux/2.7.2/include/
¿¡ À§Ä¡ÇÏ°í ÀÖ´Ù.
¸ñÇ¥ Ç÷§ÆûÀ¸·Î¼ÀÇ ¸®´ª½º
¿©·¯ºÐÀÌ Áö±Ý gcc ¼Ò½º Äڵ带 °¡Áö°í ÀÖ´Ù°í »ý°¢ÇÏ°Ú´Ù. º¸ÅëÀº GCC ¿¡ ´ëÇÑ
INSTALL ÈÀÏ¿¡¼ Áö½ÃÇÏ´Â ´ë·Î µû¸£¸é µÈ´Ù. configure --target=i486-linux --host=XXX
ÀÌ·± ½ÄÀ¸·Î ÇØÁִµ¥,
XXX
´Â Ç÷§ÆûÀ» ¸»ÇÑ´Ù. ´ÙÀ½¿¡´Â make
°úÁ¤À» °ÅÄ¡¸é µÈ´Ù. ¸®´ª½º
Çì´õÈÀÏ, Ä¿³Î Çì´õÈÀÏÀÌ ÇÊ¿äÇϸç, Å©·Î½º ÄÄÆÄÀÏ·¯¿Í Å©·Î½º ¸µÄ¿¸¦ ¸¸µé±â
À§Çؼµµ ÇÊ¿äÇÏ´Ù.
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/¿¡¼
±¸ÇÒ ¼ö ÀÖ´Ù.
¼Ò½º Ç÷§ÆûÀ¸·Î¼ÀÇ ¸®´ª½º, ¸ñÇ¥ Ç÷§ÆûÀ¸·Î¼ÀÇ MSDOS
Èì. ¼Ò½º¸¦ ¸®´ª½º¿¡¼ ÀÛ¼ºÇÑ µÚ¿¡ µµ½º¿¡¼ µ¹¾Æ°¡´Â ÇÁ·Î±×·¥À¸·Î ÄÄÆÄÀÏÇϱâ
À§Çؼ´Â emx
ÆÐÅ°Áö³ª go extender
¶ó´Â °ÍÀ» ÇÊ¿ä·Î ÇÑ´Ù.
ftp://sunsite.unc.edu/pub/Linux/devel/msdos¿¡ °¡¼ °ü·Ã ÈÀÏÀ» ã¾Æº¸±â ¹Ù¶õ´Ù.
º»ÀÎÀ¸·Î¼´Â Å×½ºÆ®Çغ» ÀûÀÌ ¾øÀ¸¸ç, ¾µ¸¸ÇÏ´Ù°í ´Ü¾ðÇϱâ´Â Èûµé´Ù.
¿©·¯ºÐÀº ¿©·¯ºÐÀÌ °®°í ÀÖ´Â ¹öÀüÀÇ gcc°¡ -v
¿É¼ÇÀ» ºÙÀÓÀ¸·Î½á ¾î¶°ÇÑ
½Éº¼À» ÀÚµ¿ÀûÀ¸·Î Á¤ÀÇÇÏ´ÂÁö ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î º»ÀÎÀÇ °ÍÀº ´ÙÀ½°ú °°´Ù.
$ echo 'main(){printf("hello world\n");}' | gcc -E -v -
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
/usr/lib/gcc-lib/i486-box-linux/2.7.2/cpp -lang-c -v -undef
-D__GNUC__=2 -D__GNUC_MINOR__=7 -D__ELF__ -Dunix -Di386 -Dlinux
-D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__i386
-D__linux -Asystem(unix) -Asystem(posix) -Acpu(i386)
-Amachine(i386) -D__i486__ -
¸¸¾à ¿©·¯ºÐÀÇ Äڵ尡 ¸®´ª½º¿¡¸¸ °ü°èµÇ´Â ÄÚµå¶ó¸é, ´ÙÀ½°ú °°ÀÌ ÇØÁÖ´Â °ÍÀÌ
ÁÁ´Ù.
#ifdef __linux__
/* ... funky stuff ... */
#endif /* linux */
__linux__
¶ó´Â À̸§À» »ç¿ëÇ϶ó. linux
°¡ ¾Æ´Ï´Ù. ÈÄÀÚ°¡
Á¤ÀǵǾî ÀÖ±â´Â ÇÏÁö¸¸ POSIX ±Ô°Ý¿¡´Â ¸ÂÁö ¾Ê±â ¶§¹®ÀÌ´Ù.
ÄÄÆÄÀÏ·¯ ½ºÀ§Ä¡µé¿¡ ´ëÇÑ ¹®¼´Â gcc info ÆäÀÌÁö¸¦ º¸¸é µÈ´Ù. (¿©·¯ºÐÀÌ
Emacs¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é C-h i
±×¸®°í ³ª¼ gcc ¿É¼ÇÀ» ¼±ÅÃÇ϶ó) ¿©·¯ºÐÀÌ
°®°í ÀÖ´Â ¹èÆ÷ÆÇÀ» ¸¸µç »ç¶÷ÀÌ gcc info ÆäÀÌÁö¸¦ ³Ö¾îÁö ¾Ê¾ÒÀ» ¼öµµ ÀÖ°í, ¶Ç´Â
¿¾ ¹öÀüÀÇ °ÍÀÌ µé¾î°¡ ÀÖÀ» ¼öµµ ÀÖ´Ù. °¡Àå ÁÁÀº ¹æ¹ýÀº
ftp://prep.ai.mit.edu/pub/gnu³ª ¶Ç´Â ¹Ì·¯ »çÀÌÆ®·Î °¡¼ gcc ¼Ò½º Äڵ带 ¹Þ¾Æ¿À´Â °ÍÀÌ´Ù.
±×¸®°í ±× ¼Ò½º ¾È¿¡¼ Ä«ÇÇÇؿ´Ù.
gcc ¿¡ ´ëÇÑ ¸ÇÆäÀÌÁö(gcc.1
)´Â ÀϹÝÀûÀ¸·Î ½Ã´ë¿¡ µÚ¶³¾îÁ® ÀÖ´Ù°í ¸»ÇÒ ¼ö
ÀÖ´Ù. ¸ÇÆäÀÌÁö¸¦ º¸·Á°í ÇÏ¸é ±×·¯ÇÑ °æ°í ¹®±¸¸¦ º¼ ¼ö ÀÖ´Ù.
ÄÄÆÄÀÏ·¯ Ç÷¡±×(flag)
gcc¸¦ »ç¿ëÇÒ ¶§, -O
n(¿©±â¼ 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
¶ó´Â ¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏÇϱâ
¹Ù¶õ´Ù.
ÇÁ·Î¼¼¼º° ¿É¼Ç
-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 ÀÇ Ã³¸®¹æ½ÄÀº ÀüÇô µµ¿òÀÌ
µÇÁú ¾Ê´Â´Ù) StrengthReductionÀº ÀüÇüÀûÀ¸·Î °ö¼ÀÀ» µ¡¼ÀÀ¸·Î ±³Ã¼Çϱâ À§ÇÏ¿©
´Ù¸¥ ·¹Áö½ºÅ͵éÀ» »ç¿ëÇÏ°Ô µÈ´Ù. -fcaller-saves
¶ÇÇÑ ÀÌ·± ¹®Á¦Á¡ÀÌ ÀÖÁö
¾Ê³ª »ý°¢ÇÏ°í ÀÖ´Ù.
¶Ç ´Ù¸¥ ¿¹°¨Àº ÀÌ·¸´Ù. -fomit-frame-pointer
´Â µµ¿òÀÌ µÉ ¼öµµ ÀÖ°í, ±×·¸Áö
¾ÊÀ» ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. ÇÑ ÆíÀ¸·Î´Â ¶Ç ´Ù¸¥ ·¹Áö½ºÅÍ°¡ ÇÒ´ç°¡´ÉÇÏ´Ù´Â °ÍÀ»
ÀǹÌÇÒ ¼öµµ ÀÖ°í, ´Ù¸¥ ÇÑ ÆíÀ¸·Î´Â x86 ÀÌ ¿¬»êÁö½Ã(instruction)¿¡ ´ëÇÏ¿©
ÀÎÄÚµùÇÏ´Â ¹æ½ÄÀ¸·Î¼, ½ºÅà »ó´ëÀû ÁÖ¼Ò°¡ ÇÁ·¹ÀÓ »ó´ëÀû ÁÖ¼Òº¸´Ùµµ ´õ ¸¹Àº
°ø°£À» Â÷ÁöÇÑ´Ù´Â °ÍÀ» ÀǹÌÇϱ⵵ ÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é ÇÁ·Î±×·¥¿¡ »ç¿ëµÉ ¼ö ÀÖ´Â
IcacheÀÌ ¾à°£ ÁÙ¾îµç´Ù. ¶ÇÇÑ -fomit-frame-pointer
´Â ÄÄÆÄÀÏ·¯°¡ °è¼ÓÀûÀ¸·Î
È£Ãâ ÈÄ¿¡µµ ½ºÅà Æ÷ÀÎÅ͸¦ Á¶Á¤ÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ¶æÇÑ´Ù. µû¶ó¼ ÇÁ·¹ÀÓÀ» °®´Â
°æ¿ì, ¸î ¹øÀÇ È£Ã⸸À¸·Îµµ ½ºÅÃÀÌ °¡µæ Â÷°Ô µÈ´Ù.
¸¶Áö¸· ¸»Àº ¸®´©½º ¶ÇÇÑ ¾ð±ÞÇÏ°í ÀÖ´Ù.
¸¸¾à ¿©·¯ºÐÀÌ ÃÖÀûÈµÈ È¿À²À» ¿øÇÑ´Ù¸é, ³ª¸¦ ¹ÏÁö ¸»¶ó. ½ÇÁ¦·Î Å×½ºÆ®¸¦ ÇغÁ¾ß
ÇÑ´Ù. gcc ÄÄÆÄÀÏ·¯ÀÇ ¿É¼ÇÀº Á¤¸»·Î ¸¹´Ù. ±×¸®°í ¸î °³ÀÇ Æ¯Á¤ Á¶ÇÕÀÌ °¡Àå ÁÁÀº
ÃÖÀûȸ¦ ÀÌ·ïÁÙ °ÍÀÌ´Ù.
Internal compiler error: cc1 got fatal signal 11
½Ã±×³Î 11¹øÀº SIGSEGV, Áï ¼¼±×¸ÕÅ×ÀÌ¼Ç À§¹Ý¿¡ ´ëÇÑ ½Ã±×³ÎÀÌ´Ù. ÀϹÝÀûÀ¸·Î
ÇÁ·Î±×·¥ÀÌ Æ÷ÀÎÅ͸¦ À߸ø ½è´Ù´Â ¸»À̰ųª ÀڱⰡ ¼ÒÀ¯ÇÏ°í ÀÖÁö ¾ÊÀº ¸Þ¸ð¸®¿¡´Ù
¾²±â ÀÛ¾÷À» ÇÏ·Á°í ÇÒ ¶§ ¹ß»ýÇÑ´Ù. ±×·¡¼ ÀÌ´Â gccÀÇ ¹ö±×ÀÏ ¼öµµ ÀÖ´Ù.
ÇÏÁö¸¸ gcc´Â ´ëºÎºÐÀÇ ÀÛ¾÷¿¡¼ ¸Å¿ì ¾ÈÁ¤ÀûÀÌ°í Å×½ºÆÃÀ» ¸¹ÀÌ °ÅÄ£
¼ÒÇÁÆ®¿þ¾î¶ó´Â »ç½ÇÀ» ±â¾ïÇ϶ó. gcc´Â ¶ÇÇÑ º¹ÀâÇÑ ÀÚ·á ±¸Á¶¿Í Æ÷ÀÎÅ͸¦ ¾öû³ª°Ô
¸¹ÀÌ »ç¿ëÇÏ°í ÀÖ´Ù. °£´ÜÈ÷ ¸»ÇÏÀÚ¸é ÇöÀç±îÁö ¼ÒÇÁÆ®¿þ¾î Áß¿¡¼ °¡Àå ¶Ù¾î³ ·¥
Å×½ºÆà ÇÁ·Î±×·¥(RAM Tester)À̶ó°í ¸»ÇÒ ¼öµµ ÀÖ´Ù. ¸¸¾à ¸Å¹ø ÄÄÆÄÀÏÇÒ ¶§¸¶´Ù
¸ØÃß´Â À§Ä¡°¡ ´Ù¸£´Ù¸é ÀÌ´Â °ÅÀÇ ´ëºÎºÐ ¿©·¯ºÐ Çϵå¿þ¾îÀÇ ¹®Á¦¶ó°í ºÁµµ
µÈ´Ù. (CPU, ¸Þ¸ð¸®, ¸¶´õº¸µå³ª ij½¬) ¿©·¯ºÐÀÇ ÄÄÇ»ÅÍ°¡ ÆÄ¿ö ¿Â üŷÀ» °ÅÃļ Àß
ºÎÆõǾú°í ±×¸®°í À©µµ¿ìÁî °°Àº °Íµµ Àß µ¹¾Æ°£´Ù°í Çؼ ±×°ÍÀ» gccÀÇ ¹ö±×·Î
µ¹¸®Áö´Â ¸»¶ó. ÀÌ·¯ÇÑ »ç½ÇÀº ¹«ÀǹÌÇÏ´Ù. ±×¸®°í Ä¿³Î ÄÄÆÄÀÏÇÏ¸é¼ make
zImage
¿¡¼ ²À ¸ØÃá´Ù°í Çؼ gccÀÇ ¹ö±×¶ó°í ¸»ÇÒ ¼ö´Â ¾ø´Ù. make
zImage
´Â ¹«·Á 200°³ ÀÌ»óÀÇ ÈÀÏÀ» ÄÄÆÄÀÏÇÏ°í ÀÖ´Ù. ±×°Íº¸´Ù´Â Á» ÀÛÀº
°æ¿ì¸¦ ã¾Æº¸µµ·Ï ÇÏÀÚ.
¸¸¾à °è¼ÓÀûÀ¸·Î ¹ö±×°¡ ¶È°°ÀÌ ³ªÅ¸³ª°í Àڱ׸¶ÇÑ ÇÁ·Î±×·¥ ÄÄÆÄÀÏ¿¡¼µµ
±×·¯ÇÏ´Ù¸é, FSF¿¡´Ù°¡ ¹ö±× ¸®Æ÷Æ®¸¦ Çصµ µÇ°í, ¶Ç´Â linux-gcc ¸ÞÀϸµ ¸®½ºÆ®¿¡
±ÛÀ» ¿Ã·Áµµ µÈ´Ù. ±×·¯±â À§Çؼ´Â ¿ì¼± gcc ¹®¼¸¦ Àо°í ¾î¶² ÀýÂ÷°¡ ÇÊ¿äÇÑÁö
¼÷ÁöÇÑ ´ÙÀ½ Çϱ⠹ٶõ´Ù.
¿äÁòÀº ¸¸¾à ±× ¼ÒÇÁÆ®¿þ¾î°¡ ¸®´ª½º·Î Æ÷ÆÃµÉ ¼ö ¾ø´Ù¸é ±× ¼ÒÇÁÆ®¿þ¾î´Â °¡Ä¡°¡
¾ø´Â ÇÁ·Î±×·¥À̶ó°í ¸»ÇÑ´Ù. :-)
ÁøÁöÇÏ°Ô ¸»ÇÏÀÚ¸é, ÀϹÝÀûÀ¸·Î ¸®´ª½ºÀÇ 100% POSIX ȣȯ¼ºÀ» ÀÌ·ç±â À§Çؼ´Â ¾ÆÁÖ
¾à°£ÀÇ ¼öÁ¤ÀÛ¾÷¸¸ÀÌ ÇÊ¿äÇÏ´Ù. ¶ÇÇÑ ´ÜÁö make ¶ó°í¸¸ ÇÏ¸é ½ÇÇàÈÀÏÀÌ ¸¸µé¾îÁú ¼ö
ÀÖµµ·Ï Çϱâ À§ÇÏ¿© ÄÚµåÀÇ ¿øÀúÀÚ¿¡°Ô ¼öÁ¤ Äڵ带 º¸³»´Â °ÍÀ̾߸»·Î °¡Ä¡ÀÖ´Â
ÀÏÀÌ´Ù.
BSDisms (bsd_ioctl
, daemon
±×¸®°í <sgtty.h>
)
¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥À» -I/usr/include/bsd
¸¦ ³Ö¾î¼ ÄÄÆÄÀÏÇÑ
ÈÄ, -lbsd
¿É¼ÇÀ» ³Ö°í ¸µÅ©ÇÒ ¼öµµ ÀÖ´Ù. (Áï Makefile ¾È¿¡¼
-I/usr/include/bsd
¸¦ CFLAGS º¯¼ö
¿¡ ³Ö°í, -lbsd
¸¦ LDFLAGS
¿¡ ³ÖÀ½À¸·Î½á)
ÀÌÁ¨ BSD ŸÀÔÀÇ ½Ã±×³Î ÇൿÀ» ¾ò¾î³»±â À§Çؼ -D__USE_BSD_SIGNAL
¸¦
µ¡ºÙÀÏ ÇÊ¿ä°¡ ¾ø´Ù. ¿Ö³ÄÇϸé -I/usr/include/bsd
¶ó°í ÇØÁÖ°í
<signal.h>
¸¦ ¼Ò½º ¾È¿¡¼ Æ÷ÇÔÇÏ¸é ¸ðµç ÀÏÀÌ Á¦´ë·Î ÀÌ·ç¾îÁø´Ù.
¾ø¾îÁø ½Ã±×³Îµé (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
K & R ÄÚµå
GCC´Â ANSI ÄÄÆÄÀÏ·¯ÀÌ´Ù. ÇÏÁö¸¸ ¾ÆÁÖ ¸¹Àº ÄÚµåµéÀÌ ANSI°¡ ¾Æ´Ï´Ù. ÀÌ·² ¶§´Â
ÄÄÆÄÀÏ·¯ Ç÷¡±×¿¡ -traditional
À̶ó°í¸¸ ºÙ¿©ÁÖ¸é µÈ´Ù°í ÇÒ ¼ö ÀÖ´Ù.
¹°·Ð ±«·Ó°Ô ¼öÀÛ¾÷À» ÇØÁà¾ß ÇÏ´Â ºÎºÐµµ ¸¹ÀÌ ÀÖ´Ù. gcc info ÆäÀÌÁö¸¦ »ìÆ캸±â
¹Ù¶õ´Ù.
-traditional
¶ó´Â ¿É¼ÇÀº gcc °¡ ÀÌ¿ëÇÏ·Á°í ÇÏ´Â C ¾ð¾î ¹æ½ÄÀ» ¹Ù²Ù´Â °Í
¸»°íµµ ´Ù¸¥ È¿°ú¸¦ Áö´Ï°í ÀÖ´Ù. ¿¹¸¦ µé¾î ±× ¿É¼ÇÀº
-fwritable-strings
À» ÀÛµ¿½ÃÅ°´Âµ¥, ¹®ÀÚ¿ »ó¼ö¸¦ µ¥ÀÌŸ ¿µ¿ªÀ¸·Î
º¸³»´Â ¿ªÇÒÀ» ÇÑ´Ù. (ÅؽºÆ® ¿µ¿ª, Áï ±×µéÀÌ ¾µ ¼ö ¾ø´Â ¿µ¿ªÀ» ¸»ÇÑ´Ù) ÀÌ·± °æ¿ì
ÇÁ·Î±×·¥ÀÇ ¸Þ¸ð¸® »ç¿ëÈçÀû(footprint)ÀÌ Áõ°¡ÇÏ°Ô µÈ´Ù.
Àü󸮱⠽ɺ¼ÀÌ ÄÚµåÀÇ ÇÁ·ÎÅäŸÀÔ°ú Ãæµ¹ÇÒ ¶§
¸¹ÀÌ ¹ß»ýÇÏ´Â ¹®Á¦µé Áß¿¡ Çϳª°¡ ¹Ù·Î ¸î¸î ÇÔ¼öµéÀÌ ÀÌ¹Ì ¸®´ª½º Çì´õÈÀϵ鿡
¸ÅÅ©·Î·Î Á¤ÀǵǾî ÀÖ°í Àü󸮱Ⱑ ÄÚµå ³»¿¡¼ À¯»çÇÑ ÇÁ·ÎÅäŸÀÔ¿¡ ´ëÇÏ¿© ó¸®
°ÅºÎ¸¦ ÇÏ´Â °æ¿ìÀÌ´Ù. º¸Åë atoi()
¿Í atol()
ÀÎ °æ¿ì°¡ ¸¹´Ù.
sprintf()
sprintf(string, fmt, ...)
ÀÌ ¸¹Àº À¯´Ð½º ½Ã½ºÅÛ¿¡¼´Â ¹®ÀÚ¿
¿¡ ´ëÇÑ
Æ÷ÀÎÅ͸¦ ¹ÝȯÇÏ´Â ¹Ý¸é¿¡ ANSI¸¦ µû¸£´Â ¸®´ª½º´Â ¹®ÀÚ¿¿¡ »ðÀÔµÈ ¹®ÀÚÀÇ °¹¼ö¸¦
¹ÝȯÇÑ´Ù. À̴ ƯÈ÷³ª SunOS¿Í °°Àº °ÍÀ¸·ÎºÎÅÍ Æ÷ÆÃÇÏ´Â °æ¿ì¿¡ ´õ¿í ÁÖÀÇÇؾß
ÇÑ´Ù.
FD_*
°°Àº °Íµé? fcntl
°ú ±× ºñ½ÁÇÑ ³à¼®µé. µµ´ëü Á¤ÀǺκÐÀÌ ¾îµð¿¡ Àִ°¡?
<sys/time.h>
¿¡ ÀÖ´Ù. ¸¸¾à fcntl
À» ÀÌ¿ëÇÏ°íÀÚ ÇÑ´Ù¸é ½ÇÁ¦
ÇÁ·ÎÅäŸÀÔÀ» À§ÇÏ¿© <unistd.h>
¶ÇÇÑ Æ÷ÇÔ½ÃÅ°°í ½ÍÀ» °ÍÀÌ´Ù.
ÀϹÝÀûÀ¸·Î ¸»ÇÏÀÚ¸é ¾î¶² ÇÔ¼ö¿¡ ´ëÇÑ ¸ÇÆäÀÌÁö¸¦ º¸¸é SYNOPSYS ºÎºÐ¿¡¼ ¾î¶²
Çì´õÈÀÏÀ» #include
ÇؾßÇÏ´ÂÁö ÀÚ¼¼È÷ ³ªÅ¸³»ÁÖ°í ÀÖÀ¸´Ï ±×°ÍÀ» Âü°íÇϱâ
¹Ù¶õ´Ù.
select()
¿¡¼ ŸÀӾƿôÀÌ °É¸®°í ÇÁ·Î±×·¥ÀÌ °è¼Ó ±â´Ù¸®±â¸¸ ÇÑ´Ù.
¿¹Àü¿¡´Â select()
¿¡ ´ëÇÑ Å¸ÀӾƿô ÆĶó¹ÌÅÍ°¡ ÀбâÀü¿ëÀ¸·Î¸¸
»ç¿ëµÇ¾ú´Ù. ±×¸®°í ±× ¶§¿¡µµ ¸ÇÆäÀÌÁö¿¡´Â ´ÙÀ½°ú °°Àº °æ°í°¡ ÀÖ¾ú´Ù.
select()´Â ¾Æ¸¶µµ ÀûÀýÇÑ °÷¿¡ ÀÖ´Â ½Ã°£°ªÀ» º¯°æÇÔÀ¸·Î½á ¸¸¾à¿¡ ±×·¯ÇÑ ÀÏÀÌ
¹ß»ýÇÑ´Ù¸é ¿ø·¡ÀÇ Å¸ÀӾƿôºÎÅÍ ³²Àº ½Ã°£À» ¹ÝȯÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÌ ±â´ÉÀº
Â÷±â ¹öÀü¿¡¼³ª ±¸ÇöµÉ °ÍÀÌ´Ù. µû¶ó¼ ŸÀÓ ¾Æ¿ô Æ÷ÀÎÅÍ°¡ select() È£Ãâ¿¡ ÀÇÇÏ¿©
¼öÁ¤µÇÁö ¾ÊÀ» °ÍÀ̶ó°í »ý°¢ÇÏ´Â °ÍÀº ¹Ù¶÷Á÷ÇÏÁö ¸øÇÏ´Ù.
¹Ù·Î ±× ³¯ÀÌ ¿Ô´Ù! ÃÖ¼ÒÇÑ ±×°ÍÀÌ ÀÌ·ç¾îÁö°í ÀÖ´Ù. select()
È£Ãâ·ÎºÎÅÍ
µ¹¾Æ¿Ã ¶§, ŸÀӾƿô Àμö´Â µ¥ÀÌÅÍ°¡ µµÂøÇÏÁö ¾Ê´Â´Ù¸é ±â´Ù¸®·Á°í Çß´ø ÀÜ·ù
½Ã°£À¸·Î ¼¼ÆõȴÙ. ¸¸¾à ¾Æ¹« µ¥ÀÌÅ͵µ µµÂøÇÏÁö ¾Ê¾Ò¾ú´Ù¸é ÀÌ °ªÀº 0(zero)ÀÌ
µÇ¾úÀ» °ÍÀÌ´Ù. ±×¸®°í °°Àº ŸÀӾƿô ±¸Á¶Ã¼¸¦ °¡Áö°í È£ÃâÀ» ÇÏ°Ô µÇ¸é È£Ãâ Áï½Ã
µÇµ¹¾Æ¿Ã °ÍÀÌ´Ù.
ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ´Â ŸÀӾƿô °ªÀ» ¸Å¹ø select()
¸¦ È£ÃâÇÒ ¶§¸¶´Ù
°ü·Ã ±¸Á¶Ã¼¿¡ Àû¾îÁÖ¾î¾ß ÇÑ´Ù. ´ÙÀ½°ú °°Àº Äڵ尡 ÀÖ´Ù¸é,
struct timeval timeout;
timeout.tv_sec = 1; timeout.tv_usec = 0;
while (some_condition)
select(n,readfds,writefds,exceptfds,&timeout);
¾Æ·¡¿Í °°ÀÌ ¹Ù²Ùµµ·Ï Ç϶ó.
struct timeval timeout;
while (some_condition) {
timeout.tv_sec = 1; timeout.tv_usec = 0;
select(n,readfds,writefds,exceptfds,&timeout);
}
¸ðÀÚÀÍ(Mosaic)ÀÇ ¸î¸î ¹öÀüÀÌ ÇÑ ¶§ ÀÌ·¯ÇÑ ¹®Á¦·Î ¶°µé½âÇß¾ú´Ù. ȸÀüÇÏ´Â Áö±¸
¾Ö´Ï¸ÅÀ̼ÇÀÇ ¼Óµµ°¡ ³×Æ®¿öÅ©¸¦ ÅëÇØ µé¾î¿À´Â ÀÚ·áÀÇ ¼Óµµ¿¡ ¹Ýºñ·¹ÇÏ´Â ÀÏÀÌ
¹ú¾îÁø °ÍÀÌ´Ù!
½Ã½ºÅÛ È£ÃâÀÌ ÀÎÅÍ·´Æ®µÉ ¶§
Áõ»ó:
ÇÁ·Î±×·¥ÀÌ Ctrl+Z·Î ¼½ºÆæµåµÇ°í ´Ù½Ã ½ÃÀÛµÇ¾î ¹ö¸°´Ù. ¶Ç´Â ´Ù¸¥ ¶§¿¡´Â
Ctrl+C¿Í °°Àº ½Ã±×³ÎÀ» ¹ß»ý½ÃÅ°°í ÀÚ½Ä ÇÁ·Î¼¼½ºµéÀ» Á×Àδ٠µîµî... "interrupted
system calls" ¶Ç´Â "write: unknown error" ¶Ç´Â ±×·± °Í ºñ½ÁÇÑ ¿¡·¯¸¦ ³½´Ù.
¹®Á¦Á¡:
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
Ç÷¡±×¸¦ »ç¿ëÇϵµ·Ï ÇÏÀÚ.
¾²±â °¡´É ¹®ÀÚ¿ (ÇÁ·Î±×·¥ÀÌ ·£´ýÇÏ°Ô ¼¼±×ÆúÆ®¸¦ ³½´Ù)
GCC´Â gcc¸¦ »ç¿ëÇÏ´Â »ç¶÷µéÀÌ ¹®ÀÚ¿ »ó¼ö¿¡ ´ëÇÏ¿© Á¤È®È÷ »ó¼ö·Î¼ °è¼Ó
»ç¿ëÇÒ °ÍÀ̶ó°í ³«°üÇÏ°í ÀÖ´Â µí ÇÏ´Ù. µû¶ó¼ ±× ¹®ÀÚ¿ »ó¼ö¸¦ ÇÁ·Î±×·¥ÀÇ
ÅؽºÆ® ¿µ¿ª¿¡ Áý¾î³Ö´Â´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ½º¿Ò ¿µ¿ªÀ» »ç¿ëÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó
ÇÁ·Î±×·¥ÀÇ µð½ºÅ© À̹ÌÁö·ÎºÎÅÍ ÆäÀÌÁö ÀÎ & ¾Æ¿ôÀ» ÇàÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.
±×·¯¹Ç·Î ¹®ÀÚ¿ »ó¼ö¿¡ ´ëÇÏ¿© ´Ù½Ã ¾²±â ÀÛ¾÷À» ÇÏ°Ô µÇ¸é ¼¼±×¸àÅ×ÀÌ¼Ç ÆúÆ®¸¦
ÀÏÀ¸Å°°Ô µÇ´Â °ÍÀÌ´Ù.
¿¹¸¦ µé¾î¼ ¹®ÀÚ¿ »ó¼ö¸¦ Àμö·Î ÇÏ¿© mktemp()
¸¦ È£ÃâÇÏ´Â ¿¾³¯
ÇÁ·Î±×·¥µé¿¡¼´Â ¹®Á¦°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. mktemp()
´Â ÁÖ¾îÁø Àμö¿¡ ´Ù½Ã
¾²·Á°í Çϱ⠶§¹®ÀÌ´Ù.
ÀÌ ¹®Á¦¸¦ °íÄ¡±â À§Çؼ´Â (a) -fwritable-strings
À̶ó´Â ¿É¼ÇÀ» ÁÖ¾î¼
ÄÄÆÄÀÏÇÑ´Ù. ÀÌ·¸°Ô ÇØÁÖ¸é gcc´Â ¹®ÀÚ¿ »ó¼ö¸¦ µ¥ÀÌŸ ¿µ¿ª¿¡ ³Ö°Ô µÈ´Ù. ¶Ç´Â (b)
¹®Á¦°¡ µÇ´Â ºÎºÐÀ» ¼öÁ¤Çؼ »ó¼ö°¡ ¾Æ´Ï¶ó º¯¼ö·Î ÁÖ¾îÁö°Ô ¸¸µé°í È£Ãâ Àü¿¡
strcpy ¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ±×°÷À¸·Î Ä«ÇÇÇØÁØ´Ù.
¿Ö execl()
È£ÃâÀÌ ½ÇÆÐÇϴ°¡?
¿øÀÎÀº °£´ÜÇÏ´Ù. Á¦´ë·Î È£ÃâÀ» ÇÏÁö ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. execl
¿¡ ´ëÇÑ
ù¹ø° Àμö´Â ½ÇÇàÇÏ°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ±×¸®°í µÎ¹ø°ºÎÅʹ ȣÃâÇÏ´Â
ÇÁ·Î±×·¥¿¡ Àü´ÞÇÒ argv
¹è¿ÀÌ´Ù. ±â¾ïÇ϶ó! argv[0]
´Â ÀüÅëÀûÀ¸·Î ¾Æ¹«·±
Àμö ¾øÀÌ ½ÇÇàµÇ´õ¶óµµ ¼¼ÆÃÀÌ µÈ´Ù´Â »ç½ÇÀ»! µû¶ó¼ ´ÙÀ½°ú °°ÀÌ Äڵ带
½á¾ßÇÑ´Ù.
execl("/bin/ls","ls",NULL);
Àý´ë·Î ´ÙÀ½°ú °°ÀÌ ¾²¸é ¾ÈµÈ´Ù.
execl("/bin/ls", NULL);
¾Æ¹«·± Àü´ÞÀμö ¾øÀÌ ½ÇÇà½ÃÅ°´Â °æ¿ì¿¡µµ ½ÇÇàÇü½ÄÀº ÀÚ½ÅÀÇ µ¿Àû ¶óÀ̺귯¸®
ÀÇÁ¸¼ºÀ» ³ªÅ¸³¾ ¼ö ÀÖ´Â ¹æ½ÄÀ¸·Î ±¸¹®À» ¸ÂÃçÁØ ÇüŶó¾ß ÇÑ´Ù. ÃÖ¼ÒÇѵµ a.outÀÇ
°æ¿ì´Â ±×·¯ÇÏ´Ù. ELF´Â Á» ´Ù¸¥ ¹æ½ÄÀ¸·Î ÀÛµ¿ÇÑ´Ù.
(¸¸¾à ÀÌ·¯ÇÑ ¶óÀ̺귯¸® Á¤º¸¸¦ ¿øÇÑ´Ù¸é ¾ÆÁÖ °£´ÜÇÑ ÀÎÅÍÆäÀ̽º°¡ ÀÖ´Ù. µ¿Àû
·ÎµùDynamic Loading¿¡ ´ëÇÑ ¼½¼ÇÀ» º¸°Å³ª ldd
¿¡ ´ëÇÑ ¸ÇÆäÀÌÁö¸¦ Âü°íÇ϶ó)
¹®Á¦°¡ ¹ß»ýÇÏ°í ³ª¼ ÇØ°áÇÏ´Â °Íº¸´Ù´Â ¹®Á¦¸¦ ¹Ì¿¬¿¡ ¹æÁöÇÏ´Â °ÍÀÌ Áß¿äÇÏÁö
¾ÊÀ»±î? ¸®´ª½º¿¡ ³Î¸® ¾²ÀÌ´Â lint´Â ¾ø´Ù. ¾Æ¸¶µµ ´ëºÎºÐÀÇ »ç¶÷µéÀÌ gcc°¡ ³»³õ´Â
ÀÚ¼¼ÇÑ °æ°í ¸Þ¼¼Áö¿¡ ¸¸Á·ÇÏ°í Àֱ⠶§¹®ÀÎ °Í °°´Ù. ¾Æ¸¶µµ °¡Àå À¯¿ëÇϾ²ÀÌ´Â
°ÍÀº -Wall
½ºÀ§Ä¡ÀÏ °ÍÀÌ´Ù. ÀÌ°ÍÀÌ ÀǹÌÇÏ´Â ¹Ù´Â "Warnings, all"·Î¼ ¸ðµç
°æ°í ¸Þ¼¼Áö¸¦ ¹ß»ý½ÃÅ°¶ó´Â ¸»ÀÌ´Ù. ¶ÇÇÑ ¾ÆÁÖ ÀÚ¼¼ÇÏ°Ô ³ª¿Â´Ù.
Public Domain lint´Â
ftp://larch.lcs.mit.edu/pub/Larch/lclint¿¡¼
¾òÀ» ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¾ó¸¶³ª ±¦ÂúÀºÁö º»ÀÎÀº ¸ð¸¥´Ù.
¾î¶»°Ô Çϸé ÇÁ·Î±×·¥ÀÇ µð¹ö±ë Á¤º¸¸¦ ¾Ë¾Æ³¾ ¼ö Àִ°¡?
±×·¯±â À§Çؼ´Â -g
¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏ/¸µÅ©ÇØ¾ß ÇÑ´Ù. ±×¸®°í
-fomit-frame-pointer
½ºÀ§Ä¡´Â »©ÁÖ¾î¾ß ÇÑ´Ù. »ç½Ç ¸ðµç ºÎºÐÀ»
´Ù½Ã ÄÄÆÄÀÏÇÒ ÇÊ¿ä´Â ¾ø°í, ¿©·¯ºÐÀÌ °ü½É °®°í ÀÖ´Â ºÎºÐ¸¸À» ±×·¸°Ô ÇØÁÖ¸é µÈ´Ù.
a.out¿¡ ÀÖ¾î¼ °øÀ¯¶óÀ̺귯¸®°¡ ¸¸¾à -fomit-frame-pointer
½ºÀ§Ä¡¸¦
°¡Áö°í ÄÄÆÄÀϵǾú´Ù¸é gdb¸¦ »ç¿ëÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. -g
¿É¼ÇÀ» ÁÖ´Â ÀÌÀ¯´Â
¹Ù·Î Á¤Àû ¸µÅ©¸¦ ÇàÇ϶ó´Â ¸»À» ÇÔÃàÇÏ°Ô µÈ´Ù.
¸¸¾à ¸µÄ¿°¡ libg.a¸¦ ãÀ» ¼ö ¾ø´Ù°í ÇÏ¸é¼ ½ÇÆÐÇÏ°Ô µÈ´Ù¸é, ¿©·¯ºÐÀÌ
/usr/lib/libg.a
À» °®°í ÀÖÁö ¾Ê±â ¶§¹®ÀÏ °ÍÀÌ´Ù. ±× ÈÀÏÀº Ưº°ÇÑ ¶óÀ̺귯¸®·Î¼ µð¹ö±ë °¡´É
C ¶óÀ̺귯¸®ÀÌ´Ù. libc ÆÐÅ°Áö¿¡ Æ÷ÇԵǾî Àְųª ¶Ç´Â libc ¼Ò½º Äڵ带 ¹Þ¾Æ¼
ÄÄÆÄÀÏÇÏ¸é »ý±ä´Ù. ½ÇÁ¦·Î ±×·¸°Ô ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï°í ´ëÃæ /usr/lib/libc.a
¸¦
/usr/lib/libg.a
·Î ¸µÅ©½ÃÄѹö·Áµµ ´ëºÎºÐ »ó°ü¾øÀ» °ÍÀÌ´Ù.
µð¹ö±ë Á¤º¸¸¦ ¾î¶»°Ô ÇÏ¸é ´Ù½Ã ²¨³¾ ¼ö Àִ°¡?
¾ÆÁÖ ¸¹Àº GNU ¼ÒÇÁÆ®¿þ¾îµéÀº -g
¿É¼ÇÀ» °¡Áö°í ÄÄÆÄÀϵǾî ÀÖÀ¸¹Ç·Î ÈÀÏ
Å©±â°¡ ¸Å¿ì Å©´Ù. (Á¾Á¾ Á¤Àû ¸µÅ©µÇ¾î ÀÖÀ½) ±×·¸°Ô ±¦ÂúÀº »ý°¢ÀÎ °Í °°Áö´Â
¾Ê´Ù.
¸¸¾à ÇÁ·Î±×·¥ÀÌ autoconf¿¡ ÀÇÇØ ¸¸µé¾îÁø configure
¸¦ °¡Áö°í ÀÖ´Ù¸é,
º¸ÅëÀÇ °æ¿ì MakefileÀ» °Çµå¸²À¸·Î½á µð¹ö±ë Á¤º¸¸¦ ³ÖÁö ¾Ê°Ô ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð
ELF¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é, ÇÁ·Î±×·¥Àº -g
¼¼Æðú´Â »ó°ü¾øÀÌ µ¿Àû ¸µÅ©µÇ¸ç,
±×³É ½±°Ô strip
(µð¹ö±ë Á¤º¸¸¦ ½ÇÇàÈÀÏ¿¡¼ »©¹ö¸®´Â ÇàÀ§)½Ãų ¼ö ÀÖ´Ù.
°ü·Ã ¼ÒÇÁÆ®¿þ¾î
´ëºÎºÐÀÇ »ç¶÷µéÀº gdb¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. gdb´Â
GNU archive sites¿¡¼ ¼Ò½ºÀÇ ÇüÅ·Î, ¾Æ´Ï¸é
tsx-11À̳ª ¼±»çÀÌÆ®¿¡¼ ¹ÙÀ̳ʸ®ÀÇ ÇüÅ·Π±¸ÇÒ ¼ö ÀÖ´Ù. xxgdb´Â
gdb¿¡ ±âÃÊÇÑ X À©µµ¿ì µð¹ö°ÅÀÌ´Ù. Áï, ¿ì¼±ÀûÀ¸·Î gdb¸¦ ÀÌ¹Ì ¼³Ä¡Çß¾î¾ß ÇÑ´Ù´Â
¶æÀÌ´Ù. ±× ¼Ò½º´Â
ftp://ftp.x.org/contrib/xxgdb-1.08.tar.gz¿¡¼
ãÀ» ¼ö ÀÖ´Ù.
¶ÇÇÑ UPS µð¹ö°Å°¡ Rick Sladkey¾¾¿¡ ÀÇÇØ Æ÷ÆõǾú´Ù. X À©µµ¿ì¿¡¼µµ Àß µ¹¾Æ°£´Ù.
ÇÏÁö¸¸ xxgdb¿Í °°ÀÌ ÅؽºÆ® µð¹ö°ÅÀÎ gdb°°Àº °Í¿¡ ÀÇÁ¸ÇÏ´Â ÇüÅ´ ¾Æ´Ï´Ù. ¾ÆÁÖ
ÈǸ¢ÇÑ ±â´ÉµéÀ» ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. µû¶ó¼ ¿©·¯ºÐÀÌ µð¹ö±ë¿¡ ¸¹Àº ½Ã°£À» ÇÒ¾ÖÇÏ°í
ÀÖ´Ù¸é, ¿ì¼±ÀûÀ¸·Î UPS µð¹ö°Å¸¦ ±ÇÇÑ´Ù. ¸®´ª½º¿ëÀ¸·Î ÄÄÆÄÀÏµÈ ¹ÙÀ̳ʸ®³ª ¼Ò½º
ÆÐÄ¡ÈÀÏÀº
ftp://sunsite.unc.edu/pub/Linux/devel/debuggers/¿¡¼
±¸ÇÒ ¼ö ÀÖ°í ¿À¸®Áö³Î ¼Ò½º´Â
ftp://ftp.x.org/contrib/ups-2.45.2.tar.Z¿¡¼ ãÀ» ¼ö ÀÖ´Ù.
µð¹ö±ë¿¡ ¾²ÀÌ´Â ¶Ç ´Ù¸¥ Åø Çϳª¸¦ µéÀÚ¸é strace¸¦ µé ¼ö ÀÖ´Ù. strace´Â
ÇÁ·Î±×·¥ÀÌ ¸¸µé¾î³»´Â ½Ã½ºÅÛ È£ÃâÀ» ȸ鿡 Ç¥½ÃÇØÁØ´Ù. ÀÌ°Í ¸»°íµµ ´Ù¹æ¸éÀ¸·Î
»ç¿ë°¡´ÉÇѵ¥, ¿¹¸¦ µé¾î ¾î¶°ÇÑ Æнº¸íÀÌ ¼Ò½ºÄڵ带 °®°í ÀÖÁö ¾ÊÀº ¹ÙÀ̳ʸ® ÈÀÏ
¾È¿¡ ÄÄÆÄÀÏµÇ¾î µé¾î°¡ÀÖ´ÂÁö, ºÐ¸íÈ÷ ¹ÙÀ̳ʸ® ¾È¿¡ µé¾îÀÖ´Â Á¶°ÇµéÀ» ¹ß°ßÇÏ°íÀÚ
ÇÒ ¶§, ÀϹÝÀûÀ¸·Î ÀϹÝÀûÀ¸·Î ¾î¶»°Ô ÀÛµ¿ÇÏ°í ÀÖ´ÂÁö¸¦ ¾Ë¾Æ³»°íÀÚ ÇÒ ¶§
»ç¿ëÇÑ´Ù. ÃֽŠstrace ¹öÀü(ÇöÀç 3.0.8)Àº
ftp://ftp.std.com/pub/jrs/¿¡¼ ±¸ÇÒ ¼ö ÀÖ´Ù.
¹é±×¶ó¿îµå (µ¥¸ó) ÇÁ·Î±×·¥
µ¥¸ó ÇÁ·Î±×·¥µéÀº ÀüÇüÀûÀ¸·Î fork()
¸¦ ¸ÕÀú ÇÏ°í ³ª¼, ºÎ¸ð ÇÁ·Î¼¼½º¸¦
Á¾·á½ÃÄÑ ¹ö¸°´Ù. ÀÌ´Â µð¹ö±ë ¼¼¼Ç¿¡ ´ëÇÏ¿© °ø°ÝÀûÀÎ ¿ä¼ÒÀÓÀÌ ºÐ¸íÇÏ´Ù.
ÀÌ·² ¶§ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº fork
¿¡ ´ëÇÏ¿© Á¤ÁöÁ¡(breakpoint)À»
ÁöÁ¤ÇØÁÖ´Â °ÍÀÌ°í ÇÁ·Î±×·¥ÀÌ ¸ØÃß¸é ´Ù½Ã±Ý ±×°ÍÀ» 0 À¸·Î ¸¸µé¾îÁÖ´Â °ÍÀÌ´Ù.
(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 }
ÄÚ¾î ÈÀÏ(Core file)
º¸Åë ¸®´ª½º ºÎÆýÿ¡ ÄÚ¾î ÈÀÏÀ» ¸¸µéÁö ¾Êµµ·Ï ¼¼ÆõǾî ÀÖ´Ù. ÇÏÁö¸¸
ÄÚ¾îÈÀÏ »ý¼ºÀ» °¡´ÉÄÉ ÇÏ·Á°í ÇÑ´Ù¸é ±×°ÍÀ» ´Ù½Ã °¡´ÉÄÉ ÇÏ´Â ¼ÐÀÇ ³»Àå ¸í·ÉÀ»
»ç¿ëÇÑ´Ù.
¼Ð ȣȯ ¼Ð(¿¹. tcsh)À» ¾²°í ÀÖ´Ù¸é ´ÙÀ½°ú °°ÀÌ ¸í·ÉÀ» ³»¸°´Ù.
% limit core unlimited
¸¸¾à º»¼Ð·ù(sh, bash, zsh, pdksh)¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é,
$ ulimit -c unlimited
¸¸¾à ÄÚ¾î ÈÀÏÀÇ À̸§¿¡ ´ëÇÏ¿© À¶Å뼺À» °¡Áö°í ½Í´Ù¸é, Ä¿³Î ¼Ò½º¸¦ ¾à°£¸¸
º¯°æÇØÁÖ¸é µÈ´Ù. ÀÚ, fs/binfmt_aout.c
¿Í fs/binfmt_elf.c
¿Í
°°Àº ÈÀÏÀ» ã¾Æº¸ÀÚ.
memcpy(corefile,"core.",5);
#if 0
memcpy(corefile+5,current->comm,sizeof(current->comm));
#else
corefile[4] = '\0';
#endif
grep °°Àº °ÍÀ» °¡Áö°í ÀÌ·± ºÎºÐÀ» ¸ðµÎ ãÀº ÈÄ¿¡ 0
À̶ó°í µÇ¾î ÀÖ´Â °ÍÀ»
1
À̶ó°í ¸ðµÎ °íÃÄÁØ´Ù.
ProfilingÀ̶ó°í ÇÏ´Â °ÍÀº ÇÁ·Î±×·¥ÀÇ ¾î¶² ºÎºÐÀÌ Á¦ÀÏ ÀÚÁÖ È£ÃâµÇ°í ÀÖ´ÂÁö
¶Ç´Â ¸¹Àº ½Ã°£À» ¼Ò¿äÇÏ°í ÀÖ´ÂÁö¸¦ Á¶»çÇÏ´Â °ÍÀÌ´Ù. Äڵ带 ÃÖÀûȽÃÅ°°í ½Ã°£ÀÌ
°¡Àå ¸¹ÀÌ ¼ÒºñµÇ´Â °÷À» °íÃÄÁÖ´Â ÁÁÀº ¹æ¹ýÀÌ´Ù. ÀÌ·¸°Ô Çϱâ À§Çؼ´Â -p
¿É¼ÇÀ» ÁÖ¾î¼ ½Ã°£ Á¤º¸¸¦ ¿ÀºêÁ§Æ® ÈÀϵéÀÌ °¡Áú ¼ö ÀÖµµ·Ï ´Ù½Ã ÄÄÆÄÀÏÇØÁÖ¾î¾ß
ÇÑ´Ù. ¶ÇÇÑ binutil ÆÐÅ°Áö¿¡ ÀÖ´Â gprof
¶ó´Â °ÍÀ» ÇÊ¿ä·Î ÇÑ´Ù. ÀÚ¼¼ÇÑ
»çÇ×Àº gprof
¸ÇÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.
ȣȯµÇÁö ¾Ê´Â µÎ °³ÀÇ ¹ÙÀ̳ʸ® Çü½Ä, Á¤Àû ¶óÀ̺귯¸®¿Í µ¿Àû ¶óÀ̺귯¸®ÀÇ
±¸ºÐ, ÄÄÆÄÀÏ °úÁ¤ ÈÄ¿¡ ÀϾ´Â ÀÛ¾÷°ú ÀÌ¹Ì ÄÄÆÄÀÏÀ» ¸¶Ä£ ½ÇÇà ÇÁ·Î±×·¥ÀÌ
½ÇÇàµÉ ¶§ ÀϾ´Â ÀÛ¾÷ µÑ ´Ù¿¡ ´ëÇÏ¿© "¸µÅ©"¶ó´Â °°Àº ¸»À» »ç¿ëÇÏ¿© »ý±â´Â
È¥¶õÇÔ(»ç½ÇÀº ·Îµå(load)ÇÑ´Ù¶ó´Â ¸»¿¡ ´ëÇÑ °úºÎÇ϶ó°í ¸»ÇÒ ¼öµµ ÀÖ´Ù), ÀÌ·±
¸ðµç °Í¿¡ ´ëÇÏ¿© ´Ù·ç¹Ç·Î À̹ø ¼½¼ÇÀº Á» º¹ÀâÇÒ °ÍÀÌ´Ù. ¸»¸¸ ¾î·Á¿ï »ÓÀ̹ǷÎ
Å©°Ô °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù.
ÀÌ·¯ÇÑ È¥¶õÀ» ¿ÏÈÇϱâ À§Çؼ, ¿ì¸®´Â ½ÇÇà½Ã(runtime)¿¡ ÀϾ´Â ÀÏ¿¡ ´ëÇÏ¿©
µ¿Àû ·Îµù(Dynamic Loading)À̶ó´Â ´Ü¾î¸¦ »ç¿ëÇÏ°Ú´Ù. ±×¸®°í ´ÙÀ½ ¼½¼Ç¿¡ °¡¼
´Ù·ç°íÀÚ ÇÑ´Ù. ¶Ç´Â µ¿Àû ¸µÅ·(Dynamic Linking)À̶ó´Â ´Ü¾î·Î Ç¥ÇöµÇ±âµµ ÇÑ´Ù.
À̹ø ¼½¼Ç¿¡¼´Â ¿À·ÎÁö ÄÄÆÄÀÏ °úÁ¤ ¹Ù·Î Á÷ÈÄ¿¡ »ý±â´Â ¸µÅ©¶ó´Â ÀÛ¾÷¿¡ ´ëÇؼ¸¸
´Ù·ç±â·Î ÇÑ´Ù.
ÇÁ·Î±×·¥À» ¸¸µå´Â ¸¶Áö¸· ÀÛ¾÷ÀÌ ¹Ù·Î ¸µÅ©(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)
' ¶ó°í¸¸ Ãâ·ÂÇÑ´Ù.
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)
ÀÌ´Ù. <math.h>
¿¡
Á¤ÀǵǾî ÀÖ´Â ¸ðµç ÇÔ¼öµéÀº ¹Ù·Î ÀÌ ¼öÇÐ ¶óÀ̺귯¸®¿¡ µé¾îÀÖ´Ù. ±×°ÍÀ» »ç¿ëÇϱâ
À§Çؼ´Â ¸µÅ©½Ã¿¡ -lm
¿É¼ÇÀ» ÁÖ¾î¾ß ÇÑ´Ù.
using any of them.
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
¿¡ ´ëÇÑ ¸µÅ©ÀÌ´Ù.
¹öÀü °ü¸®
´Ù¸¥ ¸ðµç ÇÁ·Î±×·¥°ú ¸¶Âù°¡Áö·Î ¶óÀ̺귯¸® ¶ÇÇÑ °è¼ÓÀûÀ¸·Î ¹ö±×¸¦ Àâ¾Æ°¡¾ß
ÇÑ´Ù. ¶Ç´Â »õ·Î¿î ±â´ÉÀ» µµÀÔÇϰųª ÇöÀç ÀÖ´Â °ÍÀ» ´õ È¿À²ÀûÀÎ °ÍÀ¸·Î
±³Ã¼ÇÑ´ÙµçÁö ±×¸®°í ÇÊ¿ä¾ø´Â °ÍÀº ¾ø¾Ö¹ö¸°´ÙµçÁö ÇÏ´Â ÀÏÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ·± °æ¿ì
º¯ÈÇÏ´Â ¶óÀ̺귯¸®¸¦ °¡Áö°í ÇÁ·Î±×·¡¹ÖÇÏ´Â °ÍÀº ¹®Á¦°¡ ¾Æ´Ò ¼ö ¾ø´Ù. ¸¸¾à
»ç¶óÁ®¹ö¸° ¿¾ ±â´É¿¡ ÀÇÁ¸ÇÏ´Â ÇÁ·Î±×·¥À̶ó¸é?
±×·¡¼ ¿ì¸®´Â ¶óÀ̺귯¸® ¹öÀüÀ̶ó°í ÇÏ´Â °ÍÀ» µµÀÔÇÑ´Ù. ±×¸®°í ¶óÀ̺귯¸®ÀÇ
º¯È¸¦ ¸¶ÀÌ³Ê ¶Ç´Â ¸ÞÀÌÀú º¯È ÀÌ·¸°Ô ºÐ·ùÇÏ°í ¸¶ÀÌ³Ê ¾÷±×·¹À̵å´Â ±âÁ¸ÀÇ
ÇÁ·Î±×·¥µé°ú Ãæµ¹ÀÌ ¾ø´Â º¯È¸¦ ÁöĪÇÏ°Ô ÇÑ´Ù. ¶óÀ̺귯¸®ÀÇ ¹öÀüÀº ÈÀϸíÀ»
º¸¸é ¾Ë ¼ö ÀÖ´Ù. (»ç½Ç ¾ö¹ÐÈ÷ ¸»ÇÏÀÚ¸é, ELF¿¡ ´ëÇؼ´Â °ÅÁþ¸»ÀÌ´Ù. ¿Ö
±×·¯ÇÑÁö´Â °è¼Ó Àо¸é ³ª¿Ã °ÍÀÌ´Ù) libfoo.so.1.2
´Â ¸ÞÀÌÀú ¹öÀü 1 ÀÌ°í
¸¶ÀÌ³Ê ¹öÀü2 ÀÌ´Ù. ¸¶ÀÌ³Ê ¹öÀüµµ ´Ù¼Ò Áß¿äÇÑ °ÍÀÌ µÉ ¼öµµ ÀÖ´Ù. libcÀÇ °æ¿ì¿¡´Â
¸¶À̳ʹöÀü¿¡´Ù ÆÐÄ¡·¹º§À» Áý¾î³Ö´Â´Ù. µû¶ó¼ libc.so.5.2.18
°ú °°Àº À̸§ÀÌ
»ý±ä´Ù. ¼ýÀÚ ¸»°íµµ ¹®ÀÚ, ¾ð´õ½ºÄھÀÚ(_), ¶Ç´Â ÇÁ¸°Æ® °¡´ÉÇÑ ¹®ÀÚ¸¦ ³Ö¾îµµ
ÁÁ´Ù.
ELF¿Í a.out Çü½ÄÀÇ Ä¿´Ù¶õ Â÷ÀÌÁ¡ Áß¿¡ Çϳª°¡ ¹Ù·Î °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µå´Â
¹æ½Ä¿¡ ÀÖ´Ù. ¿ì¼±Àº ELF¸¦ ¾Ë¾Æº¸±â·Î ÇÏÀÚ. ¿Ö³ÄÇÏ¸é ´õ ½±±â ¶§¹®ÀÌ´Ù.
ELF? µµ´ëü ±×°Ô ¹«¾ùÀΰ¡?
ELF (Executable and Linking Format)À̶ó°í ÇÏ´Â °ÍÀº ¿ø·¡ USL(UNIX System
Laboratories)¶ó°í ÇÏ´Â °÷¿¡¼ °³¹ßÇÑ ¹ÙÀ̳ʸ® Çü½ÄÀÌ´Ù. ±×¸®°í ÇöÀç´Â
¼Ö¶ó¸®½º¿Í SVR4¿¡¼ »ç¿ë ÁßÀÌ´Ù. ¸®´ª½º°¡ »ç¿ëÇØ¿Ô´ø ¿À·¡µÈ a.outº¸´Ù ´õ¿í ´õ
ÁÁÀº À¯¿¬¼º ¶§¹®¿¡ GCC¿Í C ¶óÀ̺귯¸® °³¹ßÀÚµéÀº Áö³ ÇØ ¸®´ª½º Ç¥ÁØ ¹ÙÀ̳ʸ®
Çü½Ä°ú ¸¶Âù°¡Áö·Î ELF·Î À̵¿Çϱâ·Î °áÁ¤ÇÏ¿´´Ù.
´Ù½Ã ÇÑ ¹ø ´õ?
À̹ø ¼½¼ÇÀº '/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ÇÏ¿ìÅõ ¹®¼¿¡¼ ´Ù·ç°í ÀÖÀ¸¸ç º»ÀÎÀº ±×°ÍÀ»
¿©±â¿¡ Àû°íÀÚ ÇÏÁö´Â ¾Ê´Â´Ù.
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 )
¹öÀü ¹øÈ£ ºÙÀ̱â, 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
¸ðµç °ÍÀÌ Á¦´ë·Î µÉ °ÍÀÌ´Ù.
a.out ÀüÅëÀûÀÎ Çü½Ä
°øÀ¯ ¶óÀ̺귯¸® ¸¸µé±âÀÇ ¿ëÀÌÇÔÀº ELF·ÎÀÇ ¾÷±×·¹À̵忡 ´ëÇÑ Áß¿äÇÑ ÀÌÀ¯ÀÌ´Ù.
a.outÀ¸·Î °¡´ÉÇϱâ´Â ÇÏ´Ù.
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/src/tools-2.17.tar.gz¸¦ ¹Þ¾Æ¿ÀÀÚ.
±×¸®°í ±× ÈÀÏÀ» Ç®¾î¼ ³ª¿À´Â 20 ÆäÀÌÁöÂ¥¸® ¹®¼¸¦ Àо´Ù. ³²µé¿¡°Ô »·È÷
º¸ÀÌ´Â ¿¼ºÁöÁöÀÚ°¡ µÇ°í ½ÍÁö´Â ¾Ê´Ù. ÇÏÁö¸¸ ³ª´Â ³ª ÀÚ½ÅÀ» ±ÍÂú°Ô ÇÏ°í ½ÍÁö´Â
¾Ê´Ù. :-)
ZMAGIC vs QMAGIC
QMAGIC À̶ó°í ÇÏ´Â °ÍÀº ¿¹ÀüÀÇ a.out(ZMAGIC À̶ó°í ¾Ë·ÁÁ® ÀÖ´Ù)°ú ¸¶Âù°¡Áö·Î
½ÇÇà ÈÀÏÀÇ Çü½ÄÀÌ´Ù. ÇÏÁö¸¸ ù¹ø° ÆäÀÌÁö´Â ¸ÅÇÎÇÏÁö ¾Ê´Â ¹ÙÀ̳ʸ®ÀÌ´Ù. 0-4096
±îÁö ¾î¶°ÇÑ ¸ÅÇεµ Á¸ÀçÇÏÁö ¾Ê±â ¶§¹®¿¡ ÀÌ·¸°Ô ÇÔÀ¸·Î½á NULL µð·¹ÆÛ·±½Ã
Æ®·¡ÇÎ(deference trapping)À» ¾ÆÁÖ ½±°Ô ÇÒ ¼ö ÀÖ´Ù. ºÎÂ÷ÀûÀÎ È¿°ú·Î¼ ¿©·¯ºÐÀÇ
½ÇÇàÈÀÏÀº ¾à 1K Á¤µµ ÀÛ¾ÆÁö°Ô µÈ´Ù.
±¸½Ä ¸µÄ¿µéÀº ¿À·ÎÁö ZMAGIC ¸¸À» Áö¿øÇÑ´Ù. ¾à°£ ´ú ±¸½ÄÀÇ ¸µÄ¿µéÀº µÑ ´Ù
Áö¿øÇϸé, ÃֽŠ¹öÀüµéÀº ¿À·ÎÁö QMAGIC ¸¸À» Áö¿øÇÏ°í ÀÖ´Ù. ÀÌ°ÍÀº º°·Î Áß¿äÇÏÁö
¾Ê´Ù. ¿Ö³ÄÇϸé Ä¿³Î ÀÚü°¡ µÎ °¡Áö¸¦ ¸ðµÎ ½ÇÇà½Ãų ¼ö Àֱ⠶§¹®ÀÌ´Ù.
file ¸í·ÉÀ» ÁÖ¸é ±×°ÍÀÌ QMAGICÀÎÁö ÆǺ°ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÈÀÏ À§Ä¡(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ÇÏÁö ¸»¶ó.
libc-lite ¶õ ¹«¾ùÀΰ¡?
libc-lite ¶ó°í ÇÏ´Â °ÍÀº libc ¿¡ ´ëÇÑ ¼Ò±Ô¸ð ¹öÀüÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. ÇϳªÀÇ
Ç÷ÎÇÇ ¾È¿¡ µé¾î°¡°í À¯´Ð½ºÀÇ ÀÚÀßÇÑ ¸¹Àº ¾÷¹«µé¿¡ ÃæºÐÇÑ Á¤µµ¸¸À¸·Î ±¸¼ºµÈ
¶óÀ̺귯¸®ÀÌ´Ù. ±×°ÍÀº curses ³ª dbm, termcap µîÀÇ Äڵ带 Æ÷ÇÔÇÏ°í ÀÖÁö ¾Ê´Ù.
¸¸¾à ¿©·¯ºÐÀÇ /lib/libc.so.4
°¡ lite ¹öÀüÀÇ ¶óÀ̺귯¸®¿¡ ¸µÅ©µÇ¾î
ÀÖ´Ù¸é Áï½Ã ¿ÏÀüÇÑ libc ¹öÀüÀ¸·Î ±³Ã¼Çϱ⠹ٶõ´Ù.
º¸Åë ½½·¢¿þ¾îÀÇ ·çÆ® µð½ºÄÏÀ» ¸¶¿îÆ®Çغ¸¸é ÀÌ lite ¹öÀüÀÇ C ¶óÀ̺귯¸®°¡
µé¾îÀÖÀ½À» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¼³Ä¡ Áغñ¿Í ¼³Ä¡¿¡ ÇÊ¿äÇÑ ¸¸ÅÀÇ ÀÛÀº C
¶óÀ̺귯¸®ÀÌ´Ù.
¸µÅ©Çϱâ : ÀϹÝÀûÀÎ ¹®Á¦µé
¿©·¯ºÐÀÇ ¸µÅ© ¹®Á¦¸¦ ³»°Ô º¸³»´Þ¶ó! ±×·¯¸é ±×°Í¿¡ ´ëÇؼ ³ª´Â ¾Æ¹« Àϵµ ÇÏÁö
¾ÊÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ ¸¹ÀÌ ½×ÀÌ´Â ¹®Á¦¿¡ ´ëÇؼ´Â ±ÛÀ» ¾²°Ú´Ù.
- °øÀ¯ ¶óÀ̺귯¸®¿Í ¸µÅ©µÇ±æ ¹Ù¶ó´Âµ¥ Á¤Àû ¶óÀ̺귯¸®¿Í ¸µÅ©µÇ°í ÀÖ´Ù.
-
¿ì¼±Àº 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
¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏÇصµ ÃæºÐÇÑ µð¹ö±ë Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
À̹ø ¼½¼ÇÀº Áö±Ý ÇöÀç·Î¼± ¾ÆÁÖ ÀûÀº ³»¿ë¸¸À» °¡Áö°í ÀÖ´Ù. ELF ÇÏ¿ìÅõ
¹®¼¸¦ ¹ßÃéÇÔÀ¸·Î½á ±× ³»¿ëÀÌ °è¼ÓÀûÀ¸·Î ´Ã¾î³ª°Ô µÉ °ÍÀÌ´Ù.
¸®´ª½º´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ °¡Áö°í ÀÖ´Ù. ÀÌ ±Û Àüü¸¦ Àд µ¿¾È ÀÌÁ¦´Â ÀÌ·±
¸» µè´Â °Íµµ Áú·ÈÀ» °ÍÀÌ´Ù. ÀüÅëÀûÀ¸·Î ÇÁ·Î±×·¥ ¸µÅ© °úÁ¤¿¡¼ ÇàÇÑ ÀÛ¾÷Àº ·Îµù
°úÁ¤¿¡¼ ±× ¹Ý´ë °úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù.
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ÀÇ °æ¿ìÀÌ´Ù. ÇÁ·Î±×·¥ ÄÄÆÄÀÏÇÑ »ç¶÷º¸´Ù ³·Àº ¸¶ÀÌ³Ê ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦
°®°í Àֱ⠶§¹®¿¡ ¹ß»ýÇÏ´Â °æ°í ¸Þ¼¼ÁöÀÌ´Ù. ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±â´Â ÇÒ °ÍÀÌ´Ù.
¾÷±×·¹À̵åÇÏ´Â °ÍÀÌ ¾î¶³±î?
¸¹Àº ȯ°æ º¯¼öµéÀÌ µ¿Àû ·Î´õ¿¡ °ü°èÇÑ´Ù. ´ëºÎºÐÀº ÀÏ¹Ý »ç¿ëÀÚº¸´Ù´Â
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
ÀÌ´Â ¼Ö¶ó¸®½º 2.xÀÇ µ¿Àû ·Îµù Áö¿øÀÌ ÀÌ·ïÁö´Â ¹æ½Ä°ú ¸Å¿ì Èí»çÇÏ´Ù. H J LuÀÇ
ELF ÇÁ·Î±×·¡¹Ö ¹®¼¿¡ ÀÚ¼¼È÷ ³ª¿Í ÀÖÀ¸¸ç dlopen(3)
¸ÇÆäÀÌÁö¿¡ ¾ÆÁÖ Àß
³ª¿Í ÀÖ´Ù. ¸ÇÆäÀÌÁö´Â ld.so ÆÐÅ°Áö¿¡ µé¾îÀÖ´Ù. ´ÙÀ½ ÇÁ·Î±×·¥À» -ldl
¿É¼ÇÀ» ÁÖ°í ¸µÅ©Ç϶ó.
#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");
}
}
Start by narrowing the problem down. Is it specific to
Linux, or does it happen with gcc on other systems? Is it specific to
the kernel version? Library version? Does it go away if you link
static? Can you trim the program down to something short that
demonstrates the bug?
Having done that, you'll know what program(s) the bug is in. For
GCC, the bug reporting procedure is explained in the info file. For
ld.so or the C or maths libraries, send mail to
linux-gcc@vger.rutgers.edu
. If possible, include a short and
self-contained program that exhibits the bug, and a description both
of what you want it to do, and what it actually does.
If you want to help with the development effort for GCC or the C
library, the first thing to do is join the
linux-gcc@vger.rutgers.edu
mailing list. If you just want to see
what the discussion is about, there are list archives at
http://homer.ncm.com/linux-gcc/. The second and subsequent
things depend on what you want to do!
Only presidents, editors, and people with tapeworms have the right to
use the editorial ``we''.
(Mark Twain)
This HOWTO is based very closely on Mitchum DSouza's GCC-FAQ; most
of the information (not to mention a reasonable amount of the text) in
it comes directly from that document. Instances of the first person
pronoun in this HOWTO could refer to either of us; generally the ones
that say ``I have not tested this; don't blame me if it toasts your
hard disk/system/spouse'' apply to both of us.
Contributors to this document have included (in ASCII ordering by
first name)
Andrew Tefft,
Axel Boldt,
Bill Metzenthen,
Bruce Evans,
Bruno Haible,
Daniel Barlow,
Daniel Quinlan,
David Engel,
Dirk Hohndel,
Eric Youngdale,
Fergus Henderson,
H.J. Lu,
Jens Schweikhardt,
Kai Petzke,
Michael Meissner,
Mitchum DSouza,
Olaf Flebbe,
Paul Gortmaker,
Rik Faith,
Steven S. Dick,
Tuomas J Lukka,
and of course Linus Torvalds, without whom the whole exercise would
have been pointless, let alone impossible :-)
Please do not feel offended if your name has not appeared here and you
have contributed to this document (either as HOWTO or as FAQ). Email
me and I will rectify it.
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.
dan@detached.demon.co.uk. My PGP public key (ID 5F263625) is available from my
web pages, if you feel the need to be secretive about things.
All trademarks used in this document are acknowledged as being
owned by their respective owners.
This document is copyright (C) 1996 Daniel Barlow
<dan@detached.demon.co.uk>
It may be reproduced and
distributed in whole or in part, in any medium physical or electronic,
as long as this copyright notice is retained on all copies. Commercial
redistribution is allowed and encouraged; however, the author would
like to be notified of any such distributions.
All translations, derivative works, or aggregate works incorporating
any Linux HOWTO documents must be covered under this copyright notice.
That is, you may not produce a derivative work from a HOWTO and impose
additional restrictions on its distribution. Exceptions to these rules
may be granted under certain conditions; please contact the Linux
HOWTO coordinator at the address given below.
In short, we wish to promote dissemination of this information through
as many channels as possible. However, we do wish to retain copyright
on the HOWTO documents, and would like to be notified of any plans to
redistribute the HOWTOs.
If you have questions, please contact Tim Bynum, the Linux HOWTO
coordinator, at linux-howto@sunsite.unc.edu
via email.
Entries starting with a non-alphabetical character are listed in ASCII
order.
-
-fwritable-strings
39
56
- /lib/cpp
16
- a.out
1
-
ar
10
-
as
8
- <asm/*.h>
19
-
atoi()
40
-
atol()
41
- binaries too big
63
65
77
- chewing gum
3
-
cos()
68
- debugging
59
-
dlopen()
82
-
dlsym()
83
- documentation
4
- EINTR
52
- elf
0
71
-
execl()
57
-
fcntl
47
-
FD_CLR
44
-
FD_ISSET
45
-
FD_SET
43
-
FD_ZERO
46
-
file
2
- <float.h>
20
- gcc
6
-
gcc -fomit-frame-pointer
61
-
gcc -g
60
- gcc -v
14
- gcc, bugs
15
28
29
84
- gcc, flags
13
25
26
- gdb
64
- header files
17
- interrupted system calls
51
-
ld
9
-
LD_*
environment variables
80
- ldd
81
- libc
7
-
libg.a
62
- libgcc
79
- <limits.h>
21
- lint
58
- <linux/*.h>
18
- manual pages
5
-
<math.h>
70
- maths
69
-
mktemp()
55
- optimisation
27
- QMAGIC
76
- segmentation fault
30
54
- segmentation fault, in GCC
33
- select()
50
-
SIGBUS
34
-
SIGEMT
35
-
SIGIOT
36
- SIGSEGV
31
53
- SIGSEGV, in gcc
32
-
SIGSYS
38
-
SIGTRAP
37
-
sin()
67
- soname
73
-
sprintf()
42
- statically linked binaries, unexpected
66
78
- <stdarg.h>
23
- <stddef.h>
24
-
strings
11
-
<sys/time.h>
48
-
<unistd.h>
49
- <varargs.h>
22
- version numbers
12
74
- weird things
72
- ZMAGIC
75