<!-- Warning to the author: -->
<!-- Automatically generated by ./makeindex.pl: EDIT THE SOURCE INSTEAD -->
<!doctype linuxdoc system>   <!--  Oy!  -*- SGML -*- mode, for this one -->
<!-- $Id: gcc-howto.sgmlp,v 1.17 1996/02/28 19:35:50 dan Exp dan $ -->


<!-- 
     ¹ø¿ª	:	ÀÌ¸¸¿ë <geoman@nownuri.net>
     SGML ÆíÁý	:	¾ö±â¼º <jurist@kldp.org>
 -->
<article>

<title>The Linux GCC HOWTO
<author>Daniel Barlow <tt>&lt;dan@detached.demon.co.uk&gt;</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"> <!-- &lt;linux/*.h&gt; -->
<label id="index.19"> <!-- &lt;asm/*.h&gt; -->

<item> <tt>/usr/include/linux</tt>¿Í <tt>/usr/include/asm</tt>(<tt>&lt;linux/*.h&gt;</tt>È­ÀÏ°ú
<tt>&lt;asm/*.h&gt;</tt>¿¡ ÀÇÇØ
ÂüÁ¶µÇ´Â Çì´õÈ­ÀÏµéÀÌ ÀÖ´Â Àå¼Ò)´Â °¢°¢ Ä¿³Î ¼Ò½º¿¡¼­ <tt>linux/include/linux</tt>¿Í <tt>linux/include/asm</tt>À»
°¡¸®Å°´Â ½Éº¼¸¯ ¸µÅ©¿©¾ß ÇÑ´Ù. <em>¹º°¡ Á¶±ÝÀÌ¶óµµ Å« ÀÛ¾÷À»</em> ÇÏ·Á°í ÇÑ´Ù¸é
ºÐ¸íÈ÷ ¼³Ä¡ÇØ¾ß ÇÑ´Ù. Ä¿³Î ÄÄÆÄÀÏÀ» ÇÏ±â À§ÇØ¼­¸¸ ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù.

<p>¶ÇÇÑ Ä¿³Î ¼Ò½º¸¦ Ç®°í ³ª¼­ <tt>make config</tt>¶ó´Â ÀÛ¾÷À» ÇØÁÖ¾î¾ß ÇÒ °ÍÀÌ´Ù.
¸¹Àº È­ÀÏµéÀÌ ±× °úÁ¤À» ÅëÇØ¼­ »ý°Ü³ª´Â <tt>&lt;linux/autoconf.h&gt;</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"> <!-- &lt;float.h&gt -->
<label id="index.21"> <!-- &lt;limits.h&gt; -->
<label id="index.22"> <!-- &lt;varargs.h&gt; -->
<label id="index.23"> <!-- &lt;stdarg.h&gt; -->
<label id="index.24"> <!-- &lt;stddef.h&gt; -->

<item> <tt/&lt;float.h&gt;/, <tt/&lt;limits.h&gt;/,
<tt/&lt;varargs.h&gt;/, <tt/&lt;stdarg.h&gt;/ ±×¸®°í
<tt/&lt;stddef.h&gt;/ µîÀÇ È­ÀÏµéÀº ÄÄÆÄÀÏ·¯ ¹öÀü¸¶´Ù ´Ù¸¦ °ÍÀÌ´Ù. ±×¸®°í
±×µéÀº <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, ¸Þ¸ð¸®, ¸¶´õº¸µå³ª Ä³½¬) ¿©·¯ºÐÀÇ ÄÄÇ»ÅÍ°¡ ÆÄ¿ö ¿Â Ã¼Å·À» °ÅÃÄ¼­ Àß
ºÎÆÃµÇ¾ú°í ±×¸®°í À©µµ¿ìÁî °°Àº °Íµµ Àß µ¹¾Æ°£´Ù°í ÇØ¼­ <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/&lt;sgtty.h&gt;/)

<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/&lt;signal.h&gt;/¸¦ ¼Ò½º ¾È¿¡¼­ Æ÷ÇÔÇÏ¸é ¸ðµç ÀÏÀÌ Á¦´ë·Î ÀÌ·ç¾îÁø´Ù.

<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 &amp; 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>&lt;sys/time.h&gt;</tt> -->
<label id="index.49"> <!-- <tt>&lt;unistd.h&gt;</tt> -->

<p><tt>&lt;sys/time.h&gt;</tt>¿¡ ÀÖ´Ù. ¸¸¾à <tt/fcntl/À» ÀÌ¿ëÇÏ°íÀÚ ÇÑ´Ù¸é ½ÇÁ¦
ÇÁ·ÎÅäÅ¸ÀÔÀ» À§ÇÏ¿© <tt/&lt;unistd.h&gt;/ ¶ÇÇÑ Æ÷ÇÔ½ÃÅ°°í ½ÍÀ» °ÍÀÌ´Ù.

ÀÏ¹ÝÀûÀ¸·Î ¸»ÇÏÀÚ¸é ¾î¶² ÇÔ¼ö¿¡ ´ëÇÑ ¸ÇÆäÀÌÁö¸¦ º¸¸é 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¸¦ »ç¿ëÇÏ´Â »ç¶÷µéÀÌ ¹®ÀÚ¿­ »ó¼ö¿¡ ´ëÇÏ¿© Á¤È®È÷ »ó¼ö·Î¼­ °è¼Ó
»ç¿ëÇÒ °ÍÀÌ¶ó°í ³«°üÇÏ°í ÀÖ´Â µí ÇÏ´Ù. µû¶ó¼­ ±× ¹®ÀÚ¿­ »ó¼ö¸¦ ÇÁ·Î±×·¥ÀÇ
ÅØ½ºÆ® ¿µ¿ª¿¡ Áý¾î³Ö´Â´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ½º¿Ò ¿µ¿ªÀ» »ç¿ëÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó
ÇÁ·Î±×·¥ÀÇ µð½ºÅ© ÀÌ¹ÌÁö·ÎºÎÅÍ ÆäÀÌÁö ÀÎ &amp; ¾Æ¿ôÀ» ÇàÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.
±×·¯¹Ç·Î ¹®ÀÚ¿­ »ó¼ö¿¡ ´ëÇÏ¿© ´Ù½Ã ¾²±â ÀÛ¾÷À» ÇÏ°Ô µÇ¸é ¼¼±×¸àÅ×ÀÌ¼Ç ÆúÆ®¸¦
ÀÏÀ¸Å°°Ô µÇ´Â °ÍÀÌ´Ù.

¿¹¸¦ µé¾î¼­ ¹®ÀÚ¿­ »ó¼ö¸¦ ÀÎ¼ö·Î ÇÏ¿© <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/&lt;math.h&gt;/ -->

sin()ÀÌ ¾îµð¿¡ ÀÖ´Â°¡¶ó´Â Áú¹®¿¡ ´ëÇÑ °¡Àå ÂªÀº ´äÀº <tt/libm.(so|a)/ÀÌ´Ù. <tt>&lt;math.h&gt;</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/&lt;dan@detached.demon.co.uk&gt;/ 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> &lt;asm/*.h&gt; <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> &lt;float.h&gt <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> &lt;limits.h&gt; <ref id="index.21" name="21"> 
<item> lint <ref id="index.58" name="58"> 
<item> &lt;linux/*.h&gt; <ref id="index.18" name="18"> 
<item> manual pages <ref id="index.5" name="5"> 
<item> <tt/&lt;math.h&gt;/ <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> &lt;stdarg.h&gt; <ref id="index.23" name="23"> 
<item> &lt;stddef.h&gt; <ref id="index.24" name="24"> 
<item> <tt/strings/ <ref id="index.11" name="11"> 
<item> <tt>&lt;sys/time.h&gt;</tt> <ref id="index.48" name="48"> 
<item> <tt>&lt;unistd.h&gt;</tt> <ref id="index.49" name="49"> 
<item> &lt;varargs.h&gt; <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>
