=== ½ÃÀÛÇϱ⿡ ¾Õ¼­ gcc¶ó´Â ÄÄÆÄÀÏ·¯¸¦ ÀÌ¿ëÇÏ¿© C ¾ð¾î ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ Çϱâ À§Çؼ­ ¾Ë¾Æ¾ß ÇÒ ±âº»ÀûÀÎ ¿É¼Ç ¹× ¹ß»ýÇÒ ¼ö ÀÖ´Â ¿¡·¯¿¡ ´ëÇØ Ãʺ¸ÀÚ¸¦ ´ë»óÀ¸·Î ÀÛ¼ºµÈ ±ÛÀÔ´Ï´Ù. °í±Þ »ç¿ëÀÚ¶ó¸é ÀÐÀ¸½Ç Çʿ䰡 ¾øÀ» °ÍÀ¸·Î »ý°¢µË´Ï´Ù. Architecture dependentÇÑ ºÎºÐÀº °¡´ÉÇÑ ¹èÁ¦ÇÏ¿´½À´Ï´Ù. ´Ü gccÀÇ »ç¿ëÀº Linux¸¦ ºñ·ÔÇÑ Unix °è¿­ÀÇ OS¿¡¼­ »ç¿ëµÈ´Ù´Â °¡Á¤À» ÇÏ¿´½À´Ï´Ù. ¶ÇÇÑ ÀÌ ±Û¿¡ ´ëÇÑ ¸ðµç ³»¿ëÀº º»ÀÎÀÌ »ç¿ëÇϰí ÀÖ´Â alzza linux 6.1¿¡¼­ gcc-2.91.66À» ¹ÙÅÁÀ¸·Î Çϰí ÀÖ½À´Ï´Ù. gcc¿¡ ´ëÇÏ¿© Á»´õ ¸¹Àº °ÍÀ» ¾Ë°í ½ÍÀ¸½Å ºÐÀº gcc manpage¿Í gcc manualÀ» ÂüÁ¶ÇϽñ⠹ٶø´Ï´Ù. ÀÌ ±Û¿¡ ³ª¿À´Â ¸ðµç ³»¿ëÀÌ Á¤È®ÇÏ´Ù°í ÇÒ ¼ö´Â ¾øÀ¸¸ç, ±× ±Û¿¡ ³ª¿À´Â ³»¿ëÀ» µû¶ó gcc¸¦ »ç¿ëÇϴµ¥ À־ ¹®Á¦°¡ ¹ß»ýÇÒ °æ¿ì, º»ÀÎÀº Ã¥ÀÓÀ» ÁöÁö ¾Ê½À´Ï´Ù. ÀÌ ±Û¿¡ ´ëÇÑ ÀúÀÛ±ÇÀº º»ÀÎ(holelee)¿¡°Ô ÀÖ½À´Ï´Ù. ±Û¿¡ ´ëÇØ À߸øµÈ Á¡À̳ª ÁöÀûÇÒ »çÇ×ÀÌ ÀÖÀ¸½Å ºÐÀº Àú À§ÀÇ ¡°holelee¡±¸¦ Ŭ¸¯ÇÏ¿© ¸ÞÀÏÀ» º¸³» Áֽñ⠹ٶø´Ï´Ù. === ½ÃÀÛ ¹× º¹½À gcc À̾߱â(5)¿¡¼­ ÀÌ¹Ì linking °úÁ¤¿¡¼­ ÇÏ´Â ÀÏÀÇ º»Áú°ú library¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò½À´Ï´Ù. ±×¸®°í ÈçÈ÷ ¹ß»ýÇÏ´Â ¿¡·¯ ¸Þ½ÃÁö µÎ °¡Áö°¡ ¹ß»ýÇÏ´Â ÀÌÀ¯¿Í ´ëó ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸°í library¿Í °ü·ÃµÈ ¿É¼Ç ¸î°¡Áö¸¦ ¾Ë¾Æº¸¾Ò½À´Ï´Ù. ÇÏÁö¸¸ ¾ÆÁ÷µµ linking °úÁ¤ ÀüºÎ¸¦ ¾Ë±â À§Çؼ­´Â Á»´õ °ËÅäÇØ¾ß ÇÒ °Íµé ÀÖ½À´Ï´Ù. ±×°Íµé¿¡ ´ëÇØ¼­ Â÷±Ù Â÷±Ù ¾Ë¾Æº¸µµ·Ï ÇϰڽÀ´Ï´Ù. == entry À̾߱â applicationÀ» ÀÛ¼ºÇϰí compile, linking °úÁ¤ÀÌ Áö³ª¸é ½ÇÇà ÆÄÀÏÀÌ ¸¸µé¾îÁý´Ï´Ù. ±×¸®°í ±× ½ÇÇà ÆÄÀÏÀÌ ¼öÇàµÉ ¶§´Â ¸Þ¸ð¸®·Î loadµÇ¾î ¼öÇàÀÌ ½ÃÀ۵ȴٴ »ç½ÇÀ» ¾Ë°í ÀÖ½À´Ï´Ù. ¿©±â¼­ ÇѰ¡Áö Àǹ®ÀÌ »ý±â´Âµ¥, ¡°°ú¿¬ ÄÚµåÀÇ ¾î¶² ºÎºÐ¿¡¼­ ¼öÇàÀÌ ½ÃÀ۵Ǵ°¡?¡±ÀÔ´Ï´Ù. ´äÀÌ ³Ê¹« »·ÇѰ¡¿ä? mainÇÔ¼öºÎÅÍ ¼öÇàµÈ´Ù°í ´äÇϽðÚÁÒ? ´Ù¼Ò Ãæ°ÝÀûÀ̰ÚÁö¸¸ ¡°¶¯¡±ÀÔ´Ï´Ù. mainÇÔ¼öºÎÅÍ ¼öÇàµÇÁö ¾Ê°í ±×Àü¿¡ ¼öÇàµÇ´Â Äڵ尡 Á¸ÀçÇÕ´Ï´Ù. ±× ¸ÕÀú ¼öÇàµÇ´Â Äڵ忡¼­ ÇÏ´Â ÀÏÀº ¿©·¯ °¡Áö°¡ Àִµ¥ ±×³É °Ç³Ê ¶Ùµµ·Ï ÇϰڽÀ´Ï´Ù. ¾Æ¹«Æ° ±× Äڵ忡¼­ mainÇÔ¼ö¸¦ È£ÃâÇØ ÁÖ°í mainÇÔ¼ö°¡ returnÇϸé exit ½Ã½ºÅÛÈ£ÃâÀ» ºÒ·¯ ÁÝ´Ï´Ù. ±×·¡¼­ mainÀÌ ¸Ç óÀ½ ¼öÇàµÇ´Â °Íó·³ º¸À̰í mainÀÌ returnÇϸé ÇÁ·Î±×·¥ ¼öÇàÀÌ Á¾·áµÇ´Â °Ì´Ï´Ù. ±×·³ ±× ÄÚµå´Â ¾îµð ÀÖÀ»±î¿ä? ½Ã½ºÅÛ¿¡ µû¶ó¼­ ´Ù¸£°ÚÁö¸¸ ÀϹÝÀûÀ¸·Î /libȤÀº /usr/lib µð·ºÅ丮¿¡ crt1.o¶ó´Â À̸§ÀÇ object ÆÄÀÏÀÌ Àִµ¥ ±× object ÆÄÀÏ ¾È¿¡ ÀÖ´Â _start¶ó´Â À̸§ÀÇ ÇÔ¼ö(?)°¡ ¸Ç ¸ÕÀú ¼öÇàµÇ´Â ³à¼®ÀÔ´Ï´Ù. °á±¹ º¸Åë applicationÀÇ entry´Â _startÇÔ¼ö°¡ µË´Ï´Ù. ±×·³ crt1.o object ÆÄÀÏ ¿ª½Ã °°ÀÌ linkingµÇ¾î¾ß °ÚÁÒ? gcc¸¦ ÀÌ¿ëÇØ linkingÀ» ¼öÇàÇÒ ¶§ command line¿¡ ¾Æ¹« À̾߱⸦ ÇØÁÖÁö ¾Ê¾Æµµ ÀÚµ¿À¸·Î crt1.o ÆÄÀÏÀÌ ÇÔ²² linkingµË´Ï´Ù. ½ÇÁ¦·Î´Â crt1.o »Ó ¾Æ´Ï¶ó ºñ½ÁÇÑ crt*.o ÆÄÀϵ鵵 °°ÀÌ linkingµÇ´Âµ¥¿ä. ±×·¸°Ô °°ÀÌ linkingµÇ°í ÀÖ´Â objectÆÄÀϵéÀ» startup fileÀ̶ó°í ºÎ¸£´Â °Í °°½À´Ï´Ù.(-nostdlib ¿É¼Ç ¼³¸íÇÒ ¶§ Àá½Ã ³ª¿Ô´ø startup fileÀÌ ¹Ù·Î ÀÌ ³à¼®µéÀÔ´Ï´Ù.) ¿©±â¼­ ÇÑ °¡Áö Àǹ®»çÇ×ÀÌ ¶°¿À¸¦¸¸ ÇÕ´Ï´Ù. ±×·³ ld´Â _startÆÄÀÏÀÌ entryÀÎÁö ¾î¶»°Ô ¾Ë°í, ´Ù¸¥ À̸§ÀÇ ÇÔ¼ö¸¦ entry·Î ÇÒ ¼ö´Â ¾ø´Â°É±î¿ä? Àǹ®ÀÇ ÇØ°áÀº ¾Æ·¡ linking scriptºÎºÐ¿¡¼­ ÇØ°áµÉ °Ì´Ï´Ù. == ½ÇÇà ÆÄÀÏ¿¡ ³²¾Æ ÀÖ´Â Á¤º¸ linkingÀÇ °á°ú ½ÇÇàÆÄÀÏÀÌ »ý°å´Âµ¥, º¸Åë linux¿¡¼­´Â ½ÇÇàÆÄÀÏ Çü½ÄÀÌ ELF¶ó´Â Æ÷¸äÀ» °¡Áý´Ï´Ù.(linux ½Ã½ºÅÛ¿¡ µû¶ó ´Ù¸¦ ¼ö ÀÖ´ÂÁö ¸ð¸£°Ú³×¿ä.) ELF´Â Executable and Linkable FormatÀÇ ¾àÀÚÀÔ´Ï´Ù. º¸Åë linux ½Ã½ºÅÛ¿¡¼­ÀÇ relocatable object ÆÄÀÏÀÇ Çü½Äµµ ELFÀä, ½ÇÁ¦·Î ½ÇÇàÆÄÀϰú relocatable object ÆÄÀϰú´Â Á¶±Ý ´Ù¸¥ Çü½ÄÀ» °¡Áý´Ï´Ù. ¾Ïư ±×°Ç »ó½ÄÀ¸·Î ¾Ë¾ÆµÎ°í, ±×·³ ½ÇÇàÆÄÀÏ¿¡ ÀÖ´Â Á¤º¸´Â ¹«¾ùÀϱî¿ä? ÀÌÁ¦±îÁöÀÇ ¾Ë¾Æ³½ Á¤º¸µéÀ» ¸ðµÎ Á¾ÇÕÇÏ¸é ¾Ë ¼ö ÀÖ½À´Ï´Ù. ¿ì¼± ½ÇÇà ÆÄÀÏÀ̶ó´Â ³à¼®ÀÌ °á±¹Àº relocatable object¸¦ ¿©·¯ °³ ½×¾Æ³õÀº ³à¼®À̹ǷΠ¿ø·¡ relocatable object ÆÄÀÏÀÌ °¡Áö°í ÀÖ´ø code¿Í data Á¤º¸´Â ¸ðµÎ ³²¾ÆÀÖÀ» °Ì´Ï´Ù. ±×¸®°í entry¸¦ ³ªÅ¸³»´Â address°¡ ÀÖ¾î¾ß ¼öÇàÀ» ÇÒ ¼ö ÀÖ°ÚÁÒ? ¶Ç, dynamic linkingÀ» ÇßÀ» °æ¿ì °ü·ÃµÈ shared object Á¤º¸µµ ³²¾ÆÀÖ¾î¾ß ÇϰÚÁÒ. ½ÇÇà ÆÄÀÏ ¼Ó¿¡ ³²¾ÆÀÖ´Â data´Â relocatable object¿¡ ÀÖ´Â dataó·³ ÇÁ·Î±×·¥ ¼öÇà¿¡ ÇÊ¿äÇÑ data°¡ ÀÖ°í ±×³É ½ÇÇà ÆÄÀÏÀ» ¼³¸íÇÏ´Â Á¤º¸·Î¼­ÀÇ data°¡ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î ?g ¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏÇÑ ½ÇÇàÆÄÀÏ¿¡¼­ µð¹ö±ë Á¤º¸µéÀº ½ÇÇà°ú´Â ÀüÇô °ü°è ¾øÁÒ. µû¶ó¼­ ±×·¯ÇÑ Á¤º¸µéÀº ½ÇÇà ÆÄÀÏ ¼öÇà½Ã¿¡ ¸Þ¸ð¸®¿¡ loadµÉ Çʿ䵵 ¾ø½À´Ï´Ù.(loadÇÏ¸é ¸Þ¸ð¸® ³¶ºñ´Ï±ñ) ½ÇÇà ÆÄÀÏ ¼Ó¿¡ ³²¾ÆÀÖ´Â code¿Í data´Â relocatable objectó·³ Ưº°ÇÑ ´ÜÀ§·Î ÀúÀåµÇ¾î ÀÖ½À´Ï´Ù. ELF Ç¥ÁØ¿¡¼­´Â segment¶ó°í ºÎ¸£´Âµ¥ º¸ÅëÀÇ °æ¿ì´Â object ÆÄÀÏó·³ sectionÀ̶ó´Â ¸»ÀÌ ¾²ÀÔ´Ï´Ù. reloctable object ÆÄÀϰú ¸¶Âù°¡Áö·Î code´Â text section¿¡ ÀúÀåµÇ°í ÇÁ·Î±×·¥ ¼öÇà Áß¿¡ ÇÊ¿äÇÑ data°¡ ¼º°Ý¿¡ µû¶ó ³ª´©¾îÁ® data, rodata, bss sectionÀ̶õ À̸§À¸·Î ÀúÀåµÇ¾î ÀÖ½À´Ï´Ù. ±× section´ÜÀ§·Î ¸Þ¸ð¸®·Î loadµÉ Çʿ䰡 ÀÖ´ÂÁö¿¡ ´ëÇÑ flagÁ¤º¸°¡ ÀÖ°í °¢ sectionÀÌ loadµÉ address(location°úÁ¤¿¡¼­ Á¤Çß°ÚÁÒ?)°¡ ÀûÇô ÀÖ¾î¾ß Á¤È®ÇÏ°Ô loadingÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±âŸ·Î symbol reference resolvingÀÌ ³¡³µ´Âµ¥µµ ELFÇü½ÄÀÇ ½ÇÇàÆÄÀÏÀº º¸ÅëÀÇ °æ¿ì ¸¹Àº symbol Á¤º¸¸¦ ±×³É °¡Áö°í ÀÖ´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù. symbol Á¤º¸ ¿ª½Ã ¼öÇà¿¡´Â ÇÏµî °ü°è°¡ ¾øÀ¸¹Ç·Î ¾ø¾Öµµ µÇ´Âµ¥, stripÀ̶ó°í ÇÏ´Â binutils¾È¿¡ ÀÖ´Â tool·Î ¾ø¾Ù ¼ö ÀÖ½À´Ï´Ù. == linking script Èì ÀÌÁ¦ Á» ¾î·Á¿î À̾߱⸦ ÇÒ Â÷·ÊÀÔ´Ï´Ù. Location°úÁ¤¿¡¼­ ¾î¶² Àý´ë address¸¦ ±âÁØÀ¸·Î °¢ sectionµéÀ» ½×´ÂÁö, ±×¸®°í entry´Â ¾î¶² symbolÀÎÁö¿¡ ´ëÇÑ Á¤º¸¸¦ linker¿¡°Ô ¾Ë·ÁÁÙ Çʿ䰡 ÀÖ½À´Ï´Ù. º¸Åë applicationÀÇ °æ¿ì´Â ½Ã½ºÅÛ ¸¶´Ù Ç¥ÁØ(?, ¿¹¸¦ µé¾î entry´Â _start´Ù ÇÏ´Â ½Ä)ÀÌ ÀÖ´ÂÁö¶ó º°·Î ¹®Á¦µÉ °ÍÀº ¾ø´Âµ¥, bootloader³ª kernelÀ» ¸¸µé ¶§´Â ±×·± Á¤º¸¸¦ »ç¿ëÀÚ°¡ ³Ñ°Ü ÁÖ¾î¾ß ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ±×·± °ÍµéÀ» ldÀÇ command line argument·Î ³Ñ±æ ¼öµµ ÀÖÁö¸¸ º¸ÅëÀÇ °æ¿ì´Â linking script¶ó°í ÇÏ´Â ÅØ½ºÆ® Çü½ÄÀÇ ÆÄÀÏ ¾È¿¡ ÀúÀåÇÏ¿© ±× script¸¦ ÂüÁ¶Ç϶ó°í ¾Ë·Á ÁÝ´Ï´Ù.(¾Æ¹«·¡µµ command line argument·Î ³Ñ°Ü ÁÙ ¼ö ÀÖ´Â Á¤º¸°¡ ÇѰ谡 Àֱ⠶§¹®À̶ó°í »ý°¢ÀÌ µì´Ï´Ù. location°ú entry¿¡ °üÇÑ ³»¿ë Áß¿¡ ldÀÇ command line argument·Î ÁÙ ¼ö ÀÖ´Â ¿É¼ÇÀÌ ¸î°¡Áö ÀÖÀ¸³ª ÇѰ谡 ÀÖ½À´Ï´Ù.) ldÀÇ ¿É¼Ç ?TÀ¸·Î linking script ÆÄÀÏ À̸§À» ³Ñ°Ü ÁÖ°Ô µË´Ï´Ù.(gccÀÇ ¿É¼Ç ¾Æ´Ô) linux kernel source¸¦ °¡Áö°í ÀÖ´Â ºÐÀº arch/*/*.lds ÆÄÀÏÀ» ÇÔ ¿­¾î º¸¼¼¿ä. ±×°Ô linking script°í, Ãʱâ Àý´ë addressÇϰí sectionº°·Î ¾î¶»°Ô ½×À¸¶ó´Â Áö½Ã¾î¿Í entry, ½ÇÇà ÆÄÀÏÀÇ Çü½Ä µîÀ» Àû¾î ³õÀº ³»¿ëÀÌ º¸ÀÏ °Ì´Ï´Ù. ¹°·Ð ÇÑ ÁÙ ÇÑ ÁÙ ÇØ¼®ÀÌ µÈ´Ù¸é ÀÌ·± ±ÛÀ» ÀÐÀ¸½Ç Çʿ䰡 ¾ø½À´Ï´Ù. ±× script¸¦ ÇÑ ÁÙ ÇÑ ÁÙ Á¤È®È÷ ÇØ¼®ÇØ ³»·Á¸é GNU ld manual µîÀ» ÀÐÀ¸¼Å¾ß ÇÒ °ÍÀÔ´Ï´Ù. == linuxÀÇ insmod À̰÷ KELP »çÀÌÆ®¿¡ ¿À½Ã´Â ¸¹Àº ºÐµéÀº Ư¼º»ó linux kernelÀ» ±¸¼ºÇϰí device driver µîÀº linux kernel module(ÀÌÇÏ module) Çü½ÄÀ¸·Î run-time¿¡ ¿Ã¸± ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Æ½Ç °Ì´Ï´Ù. moduleÀ» run-time¿¡ kernel¿¡ ³Ö±â À§Çؼ­ »ç¿ëÇÏ´Â ¸í·É¾î°¡ insmodÁÒ.(modprobeµµ °¡´É) ÀÌ moduleÀ̶ó´Â °ÍÀÌ ¸¸µé¾î Áö´Â °úÁ¤À» Àß »ìÆì º¸½Ã¸é gccÀÇ ¿É¼ÇÁß¿¡ -c¿É¼ÇÀ¸·Î ÄÄÆÄÀϸ¸ ÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï¸¶. È®ÀåÀÚ´Â .o¸¦ »ç¿ëÇϱ¸¿ä. ±×·³ relocatable object ÆÄÀÏÀ̰ڳ׿ä. ´ç¿¬È÷ ELFÇü½ÄÀ̰ڱ¸¿ä. ±×·³ ÀÌ moduleÀÌ linux kernel°ú ¾î¶»°Ô ÇÕÃÄÁú±î¿ä? ´ç¿¬È÷ linking °úÁ¤À» °ÅÃÄ¾ß µË´Ï´Ù. ÀÏÁ¾ÀÇ run-time linkingÀä. ´ç¿¬È÷ moduleÀº kernel³»ÀÇ ¸¹Àº ÇÔ¼ö¿Í Àü¿ª º¯¼ö¸¦ ÂüÁ¶ÇÕ´Ï´Ù. ±×·¸Áö ¾Ê´Ù¸é ±× moduleÀº linux kernelÀÇ µ¿ÀÛ°ú´Â ÀüÇô °ü°è ¾ø´Â ÀÇ¹Ì ¾ø´Â moduleÀÌ µÉÅ״ϱî¿ä. ±×·³ ÂüÁ¶µÇ°í ÀÖ´Â symbolÀ» resolvingÇϱâ À§Çؼ­´Â symbolÀÇ Àý´ë address¸¦ ¾Ë¾Æ¾ß °Ú³×¿ä. ±× ³»¿ëÀº linux kernel ³»ºÎ¿¡ table·Î Á¸ÀçÇÕ´Ï´Ù. /proc/ksyms¶ó°í ÇÏ´Â ÆÄÀÏÀ» catÇØº¸½Ã¸é Àý´ë address¿Í symbol À̸§À» »ìÆìº¸½Ç ¼ö ÀÖÀ» °Ì´Ï´Ù. »ìÆìº¸½Ã¸é ¾Æ½Ã°ÚÁö¸¸ »ý°¢º¸´Ù ÀûÀº ¾çÀÌÁÒ? ÀûÀº ÀÌÀ¯´Â ±× tableÀÌ linux kernel source¿¡ ÀÖ´Â Àü¿ª symbolÀÇ ÀüºÎ¸¦ Æ÷ÇÔÇÑ °ÍÀÌ ¾Æ´Ï¶ó kernel source ³»ºÎ³ª module ³»ºÎ¿¡¼­ EXPORT_SYMBOL()°ú °°Àº Ưº°ÇÑ ¹æ¹ýÀ¸·Î ¼±¾ðµÈ(?, ÀÌ ¼±¾ðÀº C ¾ð¾î ¹®¹ýÀÇ declaration°ú´Â ´Ù¸¨´Ï´Ù.) symbolµé¸¸ Æ÷ÇÔÇϱ⠶§¹®ÀÔ´Ï´Ù. ´Ù¸¥ Àü¿ª symbol µéÀº module ÇÁ·Î±×·¡¹Ö¿¡ º° Çʿ䰡 ¾ø´Ù°í »ý°¢µÇ¾î Áö´Â ³à¼®µéÀ̱⠶§¹®¿¡ ºüÁø °Ì´Ï´Ù. µû¶ó¼­ EXPORT_SYMBOL()µîÀ¸·Î ¼±¾ðµÈ symbolµé¸¸ »ç¿ëÇÏ¿© moduleÀ» ÀÛ¼ºÇØ¾ß ÇÕ´Ï´Ù. ´ç¿¬È÷ linking °úÁ¤À» °ÅÄ¡±â ¶§¹®¿¡ ¾Õ¼­ ¼³¸íµå¸° linking¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¿¡·¯µéÀÌ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. Á¦ÀÏ ¸¹ÀÌ ¹ß»ýÇÒ ¼ö ÀÖ´Â °ÍÀº ¿ª½Ã undefined reference ¿¡·¯ÀÏ °Ì´Ï´Ù. gccÀÇ ¿¡·¯¿Í´Â Á¶±Ý ´Ù¸¥ ¸Þ½ÃÁö°¡ ³ª¿À°ÚÁö¸¸ °á±¹Àº °°Àº ³»¿ëÀÔ´Ï´Ù. == map ÆÄÀÏ linking °úÁ¤À» ³¡³»¸é ´ç¿¬È÷ ¸ðµç symbol¿¡ ´ëÇÑ Àý´ë address°¡ Á¤ÇØÁö°Ô µË´Ï´Ù. ±× Á¤º¸¸¦ ¾Ë¸é ÇÁ·Î±×·¥ µð¹ö±ë¿¡ µµ¿òÀÌ µÉ ¼öµµ ÀÖÀ¸´Ï ¾Ë¾ÒÀ¸¸é ÁÁ°ÚÁÒ. ldÀÇ ¿É¼ÇÁß¿¡ '-Map ÆÄÀÏÀ̸§'À̶ó´Â ¿É¼ÇÀÌ Àִµ¥ ¿ì¸®°¡ ¿øÇÏ´Â Á¤º¸¸¦ ¹®¼­ ÆÄÀÏ Çü½ÄÀ¸·Î ¸¸µé¾î ÁÝ´Ï´Ù. ±× ÆÄÀÏÀ» º¸Åë map ÆÄÀÏÀ̶ó°í ºÎ¸£ÁÒ. symbol°ú address Á¤º¸ ¸»°í section¿¡ ´ëÇÑ Á¤º¸µµ ÀÖ°í ¸¹Àº Á¤º¸°¡ µé¾î ÀÖ½À´Ï´Ù. linux kernelÀ» ÄÄÆÄÀÏÀ» ÇÏ°í ³ª¸é ³ª¿À´Â °á°ú Áß¿¡ System.mapÀ̶ó´Â ÆÄÀÏÀÌ Àִµ¥ ÀÌ ³à¼®ÀÌ ¹Ù·Î ld°¡ ¸¸µé¾î ÁØ map ÆÄÀÏÀÇ ³»¿ë Áß¿¡ symbol°ú symbolÀÇ Àý´ë address°¡ ÀûÇô ÀÖ´Â ÆÄÀÏÀÔ´Ï´Ù. linux kernel panicÀ¸·Î ƯÁ¤ address¿¡¼­ kernelÀÌ Á×¾ú´Ù´Â ¸Þ½ÃÁö°¡ console¿¡ ³ª¿À¸é ÀÌ System.map ÆÄÀÏÀ» ¿­¾î¼­ ¾î¶² ÇÔ¼ö¿¡¼­ Á×¾ú´ÂÁö ¾Ë¾Æº¼ ¼öµµ ÀÖ½À´Ï´Ù. == ¿É¼Ç ³Ñ±â±â gccÀÇ ÀÌ¾ß±â ¸Ç Ã³À½¿¡ gcc´Â ´Ü¼øÈ÷ frontend·Î command lineÀ¸·Î ¹ÞÀº ¿É¼ÇÀ» °¢ ´Ü°è¸¦ ´ã´çÇϰí ÀÖ´Â tool·Î ÀûÀýÇÑ Ã³¸®¸¦ ÇÏ¿© ³Ñ°ÜÁØ´Ù°í ¸»¾¸µå·È½À´Ï´Ù. À§¿¡¼­ ³ª¿Â ldÀÇ ¿É¼Ç -T¿Í -Map °ú °°Àº ¿É¼ÇÀº gcc¿¡´Â ´ëÀÀÇÏ´Â ¿É¼ÇÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ·± °æ¿ì Á÷Á¢ ld¸¦ ½ÇÇàÇÒ ¼öµµ ÀÖ°í gcc¿¡°Ô ÀÌ·± ¿É¼ÇÀ» ld¿¡°Ô ³Ñ°Ü ÁÖ¶ó°í ¿äûÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ applicationÀ» ÄÄÆÄÀÏÇÒ ¶§´Â ld¸¦ Á÷Á¢ ½ÇÇàÇÏ´Â °ÍÀº Á¶±Ý ºÎ´ãÀÌ µÇ¹Ç·Î, gcc¿¡ ¿É¼ÇÀ» ³Ñ±â¶ó°í ¿äûÇÏ´Â ¹æ¹ýÀÌ Á¶±Ý ½±´Ù°í º¼ ¼ö ÀÖ½À´Ï´Ù. ±×·± °æ¿ì »ç¿ëµÇ´Â °ÍÀÌ -Wl ¿É¼ÇÀε¥ °£´ÜÈ÷ ÀÌ¿ëÇØ º¸µµ·Ï ÇϰڽÀ´Ï´Ù. $ gcc -o hello -static -Wl,-Map,hello.map hello.c ±×·³ hello.mapÀ̶ó´Â ¸Å¿ì Å« ¹®¼­ ÆÄÀÏÀÌ ¸¸µé¾î Áý´Ï´Ù. Çѹø »ìÆì º¸¼¼¿ä.(-static ¿É¼ÇÀ» ¾È ³ÖÀ¸¸é »ìÆìº¼ ³»¿ëÀÌ º°·Î ¾øÀ»±îºÁ Ãß°¡Çß½À´Ï´Ù.) ½ÇÁ¦·Î´Â -Wl ¿É¼Çó·³ as¿¡°Ôµµ ¿É¼ÇÀ» ³Ñ°Ü ÁÙ ¼ö ÀÖ´Â -Wa¿Í °°Àº ¿É¼ÇÀÌ Àִµ¥ ¾²´Â »ç¶÷À» º» ÀûÀÌ ¾ø½À´Ï´Ù. === ³¡ ÀÌ»ó gcc¸¦ »ç¿ëÇÒ ¶§ ÇÊ¿äÇÑ Áö½Ä¿¡ ´ëÇØ¼­ °£·«È÷ ¾Ë¾Æº¸¾Ò½À´Ï´Ù. ´õ ¸¹Àº Á¤º¸¸¦ ¾ò°í ½ÍÀº ºÐµéÀº gcc, cpp, as, ld µîÀÇ manpage¿Í manualÀ» ÂüÁ¶ÇÏ½Ã±æ ¹Ù¶ø´Ï´Ù.