¸µÄ¿¿Í ·Î´õ Grover Sandeep
sgrover (at) quicklogic.com
Àμö À±
isyoon (at) pusan.ac.kr
0.1 2002-11-28 Äð¸µÆÒ ÃÖÃÊ ¹ø¿ª ÀÌ ±ÛÀº ÄÄÆÄÀÏ·¯, ¸µÄ¿, ·Î´õµéÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö¸¦ °£·«È÷ º¸À̸ç, ¶ÇÇÑ °øÀ¯ ¶óÀ̺귯¸®ÀÇ ÀÌÁ¡¿¡ ´ëÇؼ­ ¾ê±âÇÑ´Ù.
¼­¹® ¸µÅ·(linking)Àº ¿©·¯°¡Áö ÄÚµå¿Í µ¥ÀÌÅ͸¦ ¹­¾î ¸Þ¸ð¸®·Î ·ÎµåµÉ ¼ö ÀÖ´Â ÇϳªÀÇ ½ÇÇà°¡´ÉÇÑ ÆÄÀÏÀ» ¸¸µå´Â ÀÛ¾÷ÀÌ´Ù. ¸µÅ·Àº ÄÄÆÄÀÏ-ŸÀÓ¶§ ÇàÇØÁú ¼öµµ ÀÖ°í, ·Îµå-ŸÀÓ(·Î´õ¿¡ ÀÇÇØ), ȤÀº ·±-ŸÀÓ(ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ÀÇÇØ)¶§µµ ÇàÇØÁú ¼ö ÀÖ´Ù. 1940³â´ë¿¡´Â ÀÌ·¯ÇÑ ¸µÅ·ÀÛ¾÷À» »ç¶÷ÀÌ ¼Õ¼ö ÇÏ¿´´Ù. ÇöÀç¿¡´Â °øÀ¯ ¶óÀ̺귯¸®(shared library)µéÀ» µ¿ÀûÀ¸·Î ¸µÅ·½ÃÄÑÁÖ´Â µîÀÇ º¹ÀâÇÑ ÀÏÀ» ÇÒ ¼ö ÀÖ´Â ¸µÄ¿(linker)¶ó´Â °ÍÀÌ ÀÖ´Ù. ÀÌ ¹®¼­´Â ¸µÅ·ÀÇ ¸ðµç °úÁ¤, ¿¹·Î µéÀÚ¸é Àç¹èÄ¡(relocation)¿Í ½Éº¼ Çؼ®(symbol resolution)ºÎÅÍ À§Ä¡ µ¶¸³Àû(position independent)ÀÎ °øÀ¯ ¶óÀ̺귯¸® Áö¿øµî¿¡ ´ëÇØ ´Ù·é´Ù.¹®Á¦¸¦ °£´ÜÇÏ°í ÀÌÇØÇϱ⠽±°Ô ÇϱâÀ§ÇØ, ³ª´Â ÀÌ ¹®¼­¸¦ x86 ¾ÆÅ°ÅØó¿¡ ±â¹ÝÇÑ ¸®´ª½º¿Í GNU ÄÄÆÄÀÏ·¯(GCC)¿Í ¸µÄ¿(ld)¿¡ ±â¹ÝÇÑ ELF(executable and linking format) ½ÇÇàÆÄÀÏ¿¡ ÃÊÁ¡À» ¸ÂÃß¾ú´Ù. ±×·¯³ª, ±âº»ÀûÀÎ ¸µÅ·ÀÇ ¾ÆÀ̵ð¾î´Â ¿î¿µÃ¼Á¦, ÇÁ·Î¼¼¼­ ¶Ç´Â ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ Çü½Ä¿¡ ¹«°üÇÏ°Ô Àû¿ëµÉ ¼ö ÀÖ´Ù. ÀúÀÛ±Ç Á¤º¸ ÀÌ ¹®¼­´Â 2002³â 11¿ù 26ÀÏ, Linux Journal¿¡ Sandeep Grover¾¾°¡ Linkers and Loaders¶ó´Â Á¦¸ñÀ¸·Î ±âÀçÇϽŠ±ÛÀÔ´Ï´Ù. ¿ø ÀúÀÚ¿¡°Ô ¸ÞÀÏ·Î ¿¬¶ôÇÏ¿© ½Ç·È´ø ÀâÁöÀÇ À̸§°ú ¿øÀúÀÚ°¡ ´©±ºÁö¸¦ ¹àÈ÷¸é ¹ø¿ªÀ» Çصµ ÁÁ´Ù´Â µ¿ÀǸ¦ ¾ò¾ú½À´Ï´Ù. Çǵå¹é ÀÌ ¹®¼­¿¡ ´ëÇÑ ¹ßÀüÀûÀÎ Á¦¾ÈÀ̳ª ¼öÁ¤»çÇ×, ¹®Á¦Á¡ µî¿¡ ´ëÇÑ Çǵå¹éÀº ¾ðÁ¦µçÁö ȯ¿µÇÕ´Ï´Ù. ¸ÞÀÏÀ» º¸³» ÁֽʽÿÀ. ÄÄÆÄÀÏ·¯, ¸µÄ¿, ·Î´õµéÀÇ µ¿ÀÛ: ±âº» »çÇ× a.c¿Í b.c µÎ °³ÀÇ ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù°í °¡Á¤ÇÏ°í, ½© ÇÁ·ÒÇÁÆ®¿¡¼­ a.c¿Í b.c¸¦ gcc¸¦ ÀÌ¿ëÇÏ¿© ¾Æ·¡¿Í °°Àº ¸í·ÉÀ» ¼öÇàÇÏ¸é ´ÙÀ½°ú °°Àº ÀϵéÀÌ ¼ø¼­´ë·Î ¼öÇàµÈ´Ù. gcc a.c b.c a.c¿¡ ´ëÇÏ¿© Àü󸮱â(preprocessor)¸¦ ¼öÇà½ÃÅ°°í, ±× °á°ú¸¦ Àüó¸®µÈ ÀÓ½ÃÆÄÀÏ¿¡ ÀúÀåÇÑ´Ù. cpp [other-command-line options] a.c /tmp/a.i a.i¿¡ ´ëÇÏ¿© ÄÄÆÄÀÏ·¯¸¦ ¼öÇà½ÃÅ°°í, a.s¶ó´Â ¾î¼Àºí·¯ Äڵ带 »ý¼ºÇÑ´Ù. cc1 [other-command-line options] /tmp/a.i -o /tmp/a.s a.s¿¡ ´ëÇÏ¿© ¾î¼Àºí·¯¸¦ ¼öÇà½ÃÅ°°í, a.o¶ó´Â ¿ÀºêÁ§Æ® ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. as [other-command-line options] /tmp/a.s -o /tmp/a.o cpp, cc1, as´Â GNUÀÇ Àü󸮱â, ÄÄÆÄÀÏ·¯, ¾î¼Àºí·¯¸¦ °¢°¢ ³ªÅ¸³»¸ç, GCC ¹èÆ÷º» ¾È¿¡ µé¾îÀÖ´Ù. À§¿Í °°Àº ½ºÅÜÀº b.c¿¡µµ ¶È°°ÀÌ Àû¿ëµÇ¾î b.o¶ó´Â ¿ÀºêÁ§Æ® ÆÄÀÏÀ» Çϳª ´õ »ý¼ºÇÏ°Ô µÈ´Ù. ±×·¯¸é ¸µÄ¿ÀÇ ÀÛ¾÷Àº ÀÌ·¯ÇÑ µÎ °³ÀÇ ¿ÀºêÁ§Æ® ÆÄÀϵé(a.o, b.o)À» ÀÔ·ÂÀ¸·Î ¹Þ¾Æ¼­ ÃÖÁ¾ÀûÀ¸·Î ½ÇÇà°¡´ÉÇÑ ÆÄÀÏÀ» ¸¸µå´Â °ÍÀÌ´Ù. ld [other-command-line options] /tmp/a.o /tmp/b.o -o a.out ÃÖÁ¾ÀûÀ¸·Î ¸¸µé¾îÁø ½ÇÇàÆÄÀÏ(a.out)Àº ÀÌÁ¦ ·ÎµåµÉ Áغñ°¡ µÇ¾ú´Ù. ÀÌ°ÍÀ» ½ÇÇà½ÃÅ°±â À§Çؼ­ ¿ì¸®´Â ½© ÇÁ·ÒÇÁÆ®»ó¿¡¼­ ¾Æ·¡¿Í °°ÀÌ Å¸ÀÌÇÎÇÑ´Ù. ./a.out ±×·¯¸é ½©Àº ·Î´õ¸¦ ºÒ·¯ a.outÀÇ ÄÚµå¿Í µ¥ÀÌÅ͸¦ ¸Þ¸ð¸®·Î º¹»çÇÏ°í, ÇÁ·Î±×·¥³»ÀÇ Á¦ÀÏ Ã³À½À¸·Î Á¦¾î±ÇÀ» ³Ñ±ä´Ù. ¿©±â¼­ ¸»ÇÏ´Â ·Î´õ´Â execve¶ó´Â °ÍÀ¸·Î ½ÇÇà°¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ ÄÚµå¿Í µ¥ÀÌÅ͸¦ ¸Þ¸ð¸®·Î ·ÎµåÇÏ°í ±× ÇÁ·Î±×·¥ÀÇ Ã¹¹ø° ¸í·É¾î°¡ ÀúÀåµÈ ÁÖ¼Ò·Î Á¡ÇÁÇÔÀ¸·Î½á ÇÁ·Î±×·¥À» ¼öÇàÇÏ°Ô ÇÑ´Ù. a.outÀ̶ó´Â ¸íĪÀº a.out ¿ÀºêÁ§Æ® ÆÄÀϵé¾È¿¡ ÀÖ´Â ¾î¼Àºí·¯ÀÇ Ãâ·Â¹°¿¡¼­ ±× À¯·¡¸¦ ãÀ» ¼ö ÀÖ´Ù. ±× ÀÌÈÄ·Î ¿ÀºêÁ§Æ® Çü½ÄÀº ´Ù¾çÇÏ°Ô ¹Ù²î¾î ¿ÔÁö¸¸, ±× À̸§Àº °è¼Ó »ç¿ëµÇ¾îÁö°í ÀÖ´Ù. ¸µÄ¿¿Í ·Î´õ ¸µÄ¿¿Í ·Î´õ´Â ¸¹Àº ºÎºÐÀÌ ¿¬°üµÇ¾î ¼öÇàµÇÁö¸¸ °³³äÀûÀ¸·Î´Â ´Ù¸¥ ÀÛ¾÷µéÀ» ¼öÇàÇÑ´Ù. ÇÁ·Î±×·¥ ·Îµù(Program Loading). ÀÌ°ÍÀº ÇÁ·Î±×·¥À» ½ÇÇà°¡´ÉÇÑ »óÅ·Π¸¸µé±â À§ÇØ ÇÏµå µð½ºÅ©·ÎºÎÅÍ ÇÁ·Î±×·¥ À̹ÌÁö¸¦ Àо ¸ÞÀÎ ¸Þ¸ð¸®·Î º¹»çÇÏ´Â °ÍÀ» ¸»ÇÑ´Ù. ¾î¶² °æ¿ì¿¡´Â ÇÁ·Î±×·¥ ·ÎµùÀÌ ÀúÀå(storage)°ø°£À» ÇÒ´çÇϰųª °¡»óÁÖ¼Ò¸¦ µð½ºÅ© ÆäÀÌÁö·Î ¸ÅÇÎÇÏ´Â Àϵµ ÇÑ´Ù. Àç¹èÄ¡(Relocation). ÄÄÆÄÀÏ·¯¿Í ¾î¼Àºí·¯´Â °¢°¢ÀÇ ÀÔ·Â ÆÄÀϵé·ÎºÎÅÍ ½ÃÀÛÁÖ¼Ò°¡ Á¦·ÎÀÎ ¿ÀºêÁ§Æ® Äڵ带 »ý¼ºÇÑ´Ù. Àç¹èÄ¡¶ó´Â °ÍÀº ÇÁ·Î±×·¥ÀÇ °¢±â ´Ù¸¥ ºÎºÐµé(ÄÚµå¿Í µ¥ÀÌÅÍ)¿¡ ´ëÇØ ·ÎµåµÇ´Â ÁÖ¼Ò¸¦ ÇÒ´çÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÀÛ¾÷Àº °°Àº ŸÀÔ(ÄÚµå ȤÀº µ¥ÀÌÅÍ)À¸·Î Á¤ÀÇµÈ ¸ðµç ±¸°£µéÀ» ÇϳªÀÇ ±¸°£À¸·Î ÇÕÄ¡°í, ÀÌ·¯ÇÑ ±¸°£µéÀÌ ·±-ŸÀÓ¶§ ¿Ã¹Ù¸¥ ÁÖ¼Ò¸¦ °¡¸®Å³ ¼ö ÀÖµµ·Ï Á¶Á¤ÇÏ´Â °ÍÀ» ¸»ÇÑ´Ù. ½Éº¼ Çؼ®(Symbol Resolution). ÇÁ·Î±×·¥Àº ´Ù¾çÇÑ ÇÏÀ§ ÇÁ·Î±×·¥(subprogram)µé·Î ±¸¼ºµÈ´Ù; ÇϳªÀÇ »óÀ§ ÇÁ·Î±×·¥ÀÌ ´Ù¸¥ ÇÏÀ§ ÇÁ·Î±×·¥À» ÂüÁ¶ÇÏ´Â °ÍÀº ½Éº¼À̶ó´Â °ÍÀ» ÅëÇØ ÀÌ·ç¾îÁø´Ù. ¸µÄ¿ÀÇ ÀÛ¾÷Àº ÀÌ·¯ÇÑ ½Éº¼ÀÇ À§Ä¡¸¦ ¾Ë¾Æ³»¾î »óÀ§ ÇÁ·Î±×·¥ÀÇ ¿ÀºêÁ§Æ® Äڵ忡 ÇÏÀ§ ÇÁ·Î±×·¥ÀÇ ÁÖ¼Ò¸¦ ±âÀÔÇÏ¿© ÂüÁ¶¸¦ Çؼ®Çϵµ·Ï ÇÑ´Ù. ¸µÄ¿¿Í ·Î´õ»çÀÌ¿¡´Â ÁßøµÇ´Â Àϵé°ú °¢°¢ Â÷À̳ª´Â Àϵ鵵 Àִµ¥, ÀÌ·¸°Ô »ý°¢Çϵµ·Ï ÇÏÀÚ: ·Î´õ´Â ÇÁ·Î±×·¥ÀÌ ·ÎµùµÇµµ·Ï Çϸç; ¸µÄ¿´Â ½Éº¼À» Çؼ®Çϸç; ¸µÄ¿¿Í ·Î´õ, µÑ ´Ù Àç¹èÄ¡¸¦ ÇÒ ¼ö ÀÖ´Ù. ¿ÀºêÁ§Æ® ÆÄÀÏµé ¿ÀºêÁ§Æ® ÆÄÀϵéÀº ¼¼°¡Áö·Î ºÐ·ùµÉ ¼ö ÀÖ´Ù. Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏ(Relocatable object file). ÀÌ°ÍÀº ¹ÙÀ̳ʸ® ÄÚµå¿Í µ¥ÀÌÅ͸¦ °¡Áö°í ÀÖÀ¸¸ç, ½ÇÇà°¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ¸¸µé±â À§ÇØ ÄÄÆÄÀÏ-ŸÀÓ¶§ Àç¹èÄ¡ °¡´ÉÇÑ ´Ù¸¥ ¿ÀºêÁ§Æ® ÆÄÀϵé°ú °áÇÕµÉ ¼ö ÀÖ´Â °ÍÀ» °¡¸®Å²´Ù. ½ÇÇà°¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏ(Executable object file). ÀÌ°ÍÀº ¹ÙÀ̳ʸ® ÄÚµå¿Í µ¥ÀÌÅ͸¦ °¡Áö°í ÀÖÀ¸¸ç, ¸Þ¸ð¸®·Î Á÷Á¢ ·ÎµåµÇ¾î ½ÇÇàµÉ ¼ö ÀÖ´Â °ÍÀ» °¡¸®Å²´Ù. °øÀ¯ ¿ÀºêÁ§Æ® ÆÄÀÏ(Shared object file). ÀÌ°ÍÀº Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ Æ¯º°ÇÑ Å¸ÀÔÀ¸·Î, ·Îµå-ŸÀÓÀ̳ª ·±-ŸÀÓ¶§ µ¿ÀûÀ¸·Î ¸Þ¸ð¸®·Î ·ÎµåµÇ°í ¸µÅ·µÉ ¼ö ÀÖ´Â °ÍÀ» °¡¸®Å²´Ù. ÄÄÆÄÀÏ·¯¿Í ¾î¼Àºí·¯´Â Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» »ý¼ºÇÑ´Ù(°øÀ¯ ¿ÀºêÁ§Æ® ÆÄÀϵµ ¶ÇÇÑ »ý¼ºÇÑ´Ù). ¸µÄ¿´Â ÀÌ·¯ÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀ» ÇÕÃÄ ½ÇÇà°¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀ» »ý¼ºÇÑ´Ù. ¿ÀºêÁ§Æ® ÆÄÀϵéÀº ½Ã½ºÅÛ¿¡ µû¶ó ±× Çü½ÄÀÌ ´Ù¸£´Ù. ÃÖÃÊÀÇ À¯´Ð½º ½Ã½ºÅÛÀº a.out Æ÷¸ËÀ» »ç¿ëÇÏ¿´´Ù. System VÀÇ Ãʱ⠹öÀü¿¡¼­´Â COFF(Common object file format)¶ó´Â °ÍÀ» »ç¿ëÇÏ¿´°í, À©µµ¿ìÁî NT´Â COFFÀÇ º¯ÇüÀÎ PE(portable executable)¶ó´Â Çü½ÄÀ» »ç¿ëÇÑ´Ù; IBMÀº µ¶ÀÚÀûÀÎ IBM 360 Çü½ÄÀ» »ç¿ëÇÑ´Ù. ¸®´ª½º¿Í ¼Ö¶ó¸®½º¿Í °°Àº Çö´ëÀûÀÎ À¯´Ð½º ½Ã½ºÅÛµéÀº À¯´Ð½º ELF(executable and linking format)Æ÷¸ËÀ» »ç¿ëÇÑ´Ù. ÀÌ ¹®¼­´Â ÁÖ·Î ELF¿¡ ´ëÇØ ´Ù·é´Ù. ÀüÇüÀûÀÎ Àç¹èÄ¡ °¡´ÉÇÑ ELF ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ Çü½Ä ELF Header.text.rodata.data.bss.symtab.rel.text.rel.data.debug.line.strtab
ELF Çì´õ´Â 4-byte magic¹®ÀÚ¿­(177ELF)·Î ½ÃÀÛÇÑ´Ù. ELF Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ °¢ ±¸°£ÀÇ Àǹ̴ ¾Æ·¡¿Í °°´Ù. .text, ÄÄÆÄÀÏµÈ ÄÚµåÀÇ ¸Ó½Å Äڵ尡 µé¾îÀÖ´Ù. .rodata, read-only µ¥ÀÌÅÍ°¡ µé¾îÀÖ´Ù, printf¹®ÀÇ ¹®ÀÚ¿­µîÀÌ ÀÌ¿¡ ÇØ´çÇÑ´Ù. .data, ÃʱâÈ­µÈ Àü¿ª º¯¼öµéÀÌ µé¾îÀÖ´Ù. .bss, ÃʱâÈ­µÇÁö ¾ÊÀº Àü¿ª º¯¼öµéÀÌ µé¾îÀÖ´Ù. BSS´Â block storage startÀÇ À̴ϼÈÀÌ°í, ÀÌ ±¸°£Àº ½ÇÁ¦ÀûÀ¸·Î ¿ÀºêÁ§Æ® ÆÄÀÏ¿¡¼­ °ø°£À» Â÷ÁöÇÏÁö ¾Ê°í ´ÜÁö °ø°£À» È®º¸ÇÏ´Â ¿ªÇÒ¸¸ ÇÑ´Ù. .symtab, ÇÁ·Î±×·¥¿¡¼­ Á¤ÀÇµÈ Àü¿ª º¯¼öµé°ú ÇÔ¼öµé¿¡ ´ëÇÑ ÂüÁ¶ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù. ÀÌ Å×À̺íÀº Áö¿ª º¯¼ö¿¡ ´ëÇÑ °ÍÀº ´ã°í ÀÖÁö ¾Ê´Ù; Áö¿ª º¯¼öµéÀº ½ºÅÿ¡ ÀÇÇØ À¯ÁöµÈ´Ù. .rel.text, .text¿¡ µé¾îÀÖ´Â °¢ ¸Ó½Å ÄÚµåÀÇ À§Ä¡¸¦ ³ªÅ¸³½´Ù. À̰͵éÀº ³ªÁß¿¡ ¸µÄ¿°¡ ÀÌ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ´Ù¸¥ ¿ÀºêÁ§Æ® ÆÄÀϵé°ú ¿¬°á½Ãų¶§ ÇÊ¿äÇÏ´Ù. .rel.data, ÇöÀçÀÇ ÆÄÀÏ¿¡¼­´Â Á¤ÀǵǾî ÀÖÁö ¾ÊÁö¸¸ ÂüÁ¶µÇ´Â Àü¿ª º¯¼ö¿¡ ´ëÇÑ Àç¹èÄ¡ Á¤º¸¸¦ ´ã°í ÀÖ´Ù. .debug, Áö¿ª, Àü¿ª º¯¼öµé¿¡ ´ëÇÑ µð¹ö±ë ½Éº¼µéÀÌ µé¾îÀÖ´Ù. ÀÌ ±¸°£Àº ÄÄÆÄÀÏ·¯°¡ -g ¿É¼Ç°ú ÇÔ²² ¼öÇàµÉ ¶§ »ý¼ºµÈ´Ù. .line, .text¿¡ µé¾îÀÖ´Â ¸Ó½Å ÄÚµå¿Í ½ÇÁ¦ C ÄÚµåÀÇ ¶óÀÎ ³Ñ¹ö¿¡ ´ëÇÑ ¸ÞÇÎ Á¤º¸°¡ µé¾îÀÖ´Ù. µð¹ö°Å ÇÁ·Î±×·¥ÀÌ ÀÌ Á¤º¸¸¦ ÇÊ¿ä·Î ÇÑ´Ù. .strtab, .symtab, .debug ±¸°£¿¡ ÀÖ´Â ½Éº¼ Å×ÀÌºí¿¡ µé¾îÀÖ´Â ½ºÆ®¸µµé¿¡ ´ëÇÑ Å×À̺íÀÌ´Ù.
½Éº¼µé°ú ½Éº¼ Çؼ® ¸ðµç Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀº ½Éº¼ Å×À̺í°ú ±×¿Í °ü·ÃµÈ ½Éº¼µéÀ» °¡Áö°í ÀÖ´Ù. ¸µÄ¿ÀÇ °üÁ¡¿¡¼­ º¼ ¶§ ½Éº¼µéÀ» ´ÙÀ½°ú °°ÀÌ ºÐ·ùÇÒ ¼ö ÀÖ´Ù. ÇöÀçÀÇ ÆÄÀÏ¿¡¼­ Á¤Àǵǰí, ´Ù¸¥ ÆÄÀϵ鿡¼­ ÂüÁ¶µÇ´Â Àü¿ª ½Éº¼. ¸ðµç non-static ÇÔ¼öµé°ú Àü¿ª º¯¼öµéÀÌ ÀÌ ºÐ·ù¿¡ ÇØ´çÇÑ´Ù. ÇöÀçÀÇ ÆÄÀÏ¿¡¼­ ÂüÁ¶´Â µÇ³ª, ´Ù¸¥ °÷¿¡¼­ Á¤ÀÇµÈ Àü¿ª ½Éº¼. externÀ¸·Î Á¤ÀÇµÈ ¸ðµç ÇÔ¼öµé°ú º¯¼öµéÀÌ ÀÌ ºÐ·ù¿¡ ÇØ´çÇÑ´Ù. ÇöÀçÀÇ ÆÄÀÏ¿¡¼­¸¸ Á¤Àǵǰí ÂüÁ¶µÇ´Â Áö¿ª ½Éº¼. ¸ðµç static ÇÔ¼öµé°ú º¯¼öµéÀÌ ÀÌ ºÐ·ù¿¡ ÇØ´çÇÑ´Ù. ¸µÄ¿´Â ½Éº¼ÀÇ ÂüÁ¶¸¦ Çؼ®ÇÒ ¶§, ÀÔ·ÂÀ¸·Î ÁÖ¾îÁö´Â Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ ½Éº¼ Å×À̺í·ÎºÎÅÍ ²À Çϳª¸¸ Á¸ÀçÇÏ´Â ½Éº¼ÀÇ Á¤ÀǸ¦ ÂüÁ¶ÇÏ¿© ½Éº¼ ÂüÁ¶¸¦ Çؼ®ÇÑ´Ù. Áö¿ª ½Éº¼(local symbol)Àº ±×¿¡ ´ëÇÑ ´ÙÁß Á¤ÀÇ(multiple definitions)¸¦ ½Éº¼ Å×À̺íÀÌ °¡Áú ¼ö ¾øÀ¸¹Ç·Î ½±°Ô Çؼ®µÈ´Ù. ±×·¯³ª Àü¿ª ½Éº¼ÀÇ Çؼ®Àº ¾à°£ÀÇ Æ®¸¯ÀÌ ¿ä±¸µÈ´Ù. ÄÄÆÄÀÏ Å¸ÀÓ¶§, ÄÄÆÄÀÏ·¯´Â Àü¿ª ½Éº¼µéÀ» strong ȤÀº weakÇÑ °ÍÀ¸·Î ¸¸µå´Âµ¥, ÇÔ¼öµé°ú ÃʱâÈ­µÈ Àü¿ª º¯¼öµéÀº strongÇÏ°Ô, ÃʱâÈ­µÇÁö ¾ÊÀº º¯¼öµéÀº weakÇÏ°Ô ¸¸µç´Ù. ±×·¯¸é ¸µÄ¿´Â ¾Æ·¡ÀÇ ·êÀ» Àû¿ëÇÏ¿© ½Éº¼µéÀ» Çؼ®ÇÏ°Ô µÈ´Ù. ´ÙÁß strong ½Éº¼µéÀº Çã°¡µÇÁö ¾Ê´Â´Ù. ÇϳªÀÇ strong ½Éº¼°ú ¿©·¯°³ÀÇ weak ½Éº¼µéÀÌ ÀÖÀ¸¸é, strong ½Éº¼À» ¼±ÅÃÇÑ´Ù. ¿©·¯°³ÀÇ weak ½Éº¼µéÀÌ ÀÖÀ¸¸é, ±×°ÍµéÁß ¾Æ¹«°Å³ª ¼±ÅÃÇÑ´Ù. ¿¹·Î, ´ÙÀ½°ú °°Àº µÎ ÇÁ·Î±×·¥ÀÇ ¸µÅ·Àº ¸µÅ©-ŸÀÓ ¿¡·¯¸¦ ³½´Ù. /* foo.c */ int foo() { return 0; } /* bar.c */ int foo() { return 1; } int main() { foo(); } foo (Àü¿ª ÇÔ¼ö·Î½á strong ½Éº¼ÀÌ´Ù)°¡ µÎ ¹ø Á¤ÀÇ µÇ¾úÀ¸¹Ç·Î, ¸µÄ¿´Â ¾Æ·¡¿Í °°Àº ¿¡·¯ ¸Þ¼¼Áö¸¦ ³½´Ù. gcc foo.c bar.c /tmp/ccM1DKre.o: In function 'foo': /tmp/ccM1DKre.o(.text+0x0): multiple definition of 'foo' /tmp/ccIhvEMn.o(.text+0x0): first defined here collect2: ld returned 1 exit status collec2´Â GCC¿¡ ÀÇÇØ È£ÃâµÇ´Â ¸µÄ¿ ldÀÇ wrapperÀÌ´Ù. Á¤Àû ¶óÀ̺귯¸®ÀÇ ¸µÅ· Á¤Àû ¶óÀ̺귯¸®´Â ºñ½ÁÇÑ ÇüÀ» Áö´Ñ ¿ÀºêÁ§Æ® ÆÄÀϵéÀÇ ÁýÇÕÀÌ´Ù. ÀÌ·¯ÇÑ ¶óÀ̺귯¸®µéÀº µð½ºÅ©¿¡ ¾ÆÄ«À̺ê(archive) Çü½ÄÀ¸·Î ÀúÀåµÈ´Ù. ¾ÆÄ«À̺ê´Â ¶óÀ̺귯¸®¸¦ ±¸¼ºÇÏ°í ÀÖ´Â °ÍµéÀ» Á» ´õ ºü¸£°Ô °Ë»öÇϱâ À§ÇØ µð·ºÅ丮 Á¤º¸¸¦ ¶ÇÇÑ °¡Áö°í ÀÖ´Ù. °¢°¢ÀÇ ELF ¾ÆÄ«À̺ê´Â !<arch>\n (\nÀº ´º¶óÀÎÀ» ¶æÇÑ´Ù)ÀÇ 8ÀÚ·Î ±¸¼ºµÈ magic ¹®ÀÚ¿­·Î ½ÃÀÛÇÑ´Ù. Á¤Àû ¶óÀ̺귯¸®µéÀº ¸µÄ¿¿¡°Ô ÀÎÀÚ (arguments)·Î½á Àü´ÞµÈ´Ù. ±×·¯¸é ¸µÄ¿´Â ÇÁ·Î±×·¥¿¡¼­ ÂüÁ¶µÇ´Â ¿ÀºêÁ§Æ® ¸ðµâµé¸¸À» º¹»çÇÑ´Ù. À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ libc.a´Â ¸ðµç C ¶óÀ̺귯¸® ÇÔ¼öµé (printf³ª fopenµî°ú °°Àº)À» ´ã°í ÀÖ´Ù. gcc foo.o bar.o /usr/lib/libc.a /usr/lib/libm.a libm.a´Â À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ sqrt, sin, cos°ú °°Àº ¼öÇаü·Ã ÇÔ¼öµéÀ» ´ã°í ÀÖ´Â ¶óÀ̺귯¸®ÀÌ´Ù. Á¤Àû ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÒ ¶§, ½Éº¼ Çؼ®°úÁ¤ÀÌ ¾î¶»°Ô ÀÌ·ç¾îÁö³ª º¸¸é, ¸µÄ¿´Â Ä¿¸Çµå ¶óÀο¡¼­ ÀÔ·ÂÀ¸·Î ¹ÞÀº Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵé°ú ¾ÆÄ«À̺êµéÀ» ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î ½ºÄµÇÑ´Ù. ÀÌ·¯ÇÑ ½ºÄµ °úÁ¤Áß¿¡, ¸µÄ¿´Â ¼¼°¡ÁöÀÇ ÁýÇÕÀ» À¯ÁöÇÑ´Ù. ¸ÕÀú, Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀÌ ½ÇÇà °¡´ÉÇÑ ÆÄÀÏÀÇ »óÅ·Πµé¾î°£ ÁýÇÕ O; ¾ÆÁ÷ Çؼ®µÇÁö ¾ÊÀº ½Éº¼µéÀ» ´ã°í ÀÖ´Â ÁýÇÕ U, ÀÌÀüÀÇ ÀÔ·Â ÆÄÀÏ¿¡¼­ Á¤ÀÇµÈ ½Éº¼À» ´ã°í ÀÖ´Â ÁýÇÕ D°¡ ±×°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÁýÇÕµéÀº Ãʱ⿡ ºñ¿öÁø »óÅÂÀÌ´Ù. Ä¿¸Çµå ¶óÀÎÀÇ °¢°¢ÀÇ ÀÔ·Â ÆÄÀÏ¿¡ ´ëÇØ, ¸µÄ¿´Â ±×°ÍÀÌ ¿ÀºêÁ§Æ® ÆÄÀÏÀÎÁö ¾ÆÄ«À̺êÀÎÁö¸¦ ¸ÕÀú °áÁ¤ÇÑ´Ù. ¸¸¾à ÀÔ·ÂÀÌ Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀ̸é, ¸µÄ¿´Â ±×°ÍÀ» ÁýÇÕ O¿¡ Ãß°¡ÇÏ°í, ÁýÇÕ U¿Í D¸¦ ¾÷µ¥ÀÌÆ®ÇÑ ÈÄ, ´ÙÀ½ ÀÔ·Â ÆÄÀÏ·Î ³Ñ¾î°£´Ù. ¸¸¾à ÀÔ·Â ÆÄÀÏÀÌ ¾ÆÄ«À̺ê¶ó¸é, ¸µÄ¿´Â ÇöÀçÀÇ ÁýÇÕ U¿¡ µé¾îÀÖ´Â ¾ÆÁ÷ Çؼ®ÀÌ ¾ÈµÈ ½Éº¼µéÀ» Çؼ®Çϱâ À§ÇØ ¾ÆÄ«À̺긦 ±¸¼ºÇÏ°í ÀÖ´Â ¸â¹ö ¸ðµâµéÀ» ½ºÄµÇÏ¿© Ç®¾î³ª°£´Ù. ¸¸¾à ¾ÆÄ«À̺긦 ±¸¼ºÇÏ°í ÀÖ´Â ¸â¹ö ¸ðµâ ÀÚü¿¡µµ Çؼ®ÀÌ ¾ÈµÈ ½Éº¼µéÀÌ ÀÖÀ¸¸é, ±× ¸â¹ö´Â ÁýÇÕ O¿¡ Ãß°¡µÇ°í ÁýÇÕ U¿Í Dµµ ¾÷µ¥ÀÌÆ® µÈ´Ù. ÀÌ·¯ÇÑ °úÁ¤Àº ¾ÆÄ«À̺긦 ±¸¼ºÇÏ°í ÀÖ´Â ¸ðµç ¿ÀºêÁ§Æ® ÆÄÀÏ ¸ðµâµé¿¡ ´ëÇØ ÇàÇØÁø´Ù. ¸¸¾à Ä¿¸Çµå ¶óÀο¡ ÁÖ¾îÁø ¸ðµç ÀÔ·Â ÆÄÀϵ鿡 À§ÀÇ µÎ ½ºÅÜÀ» ÇàÇÏ¿´´Âµ¥µµ, ÁýÇÕ U°¡ ¾ÆÁ÷ ºñ¾î ÀÖÁö¾Ê´Ù¸é, ¸µÄ¿´Â ¿¡·¯ ¸Þ¼¼Áö¸¦ ³»°í Á¾·áÇÑ´Ù. ÁýÇÕ U°¡ ºñ¾î ÀÖ´Ù¸é, ¸µÄ¿´Â ÁýÇÕ O¿¡ µé¾îÀÖ´Â ¸ðµç ¿ÀºêÁ§Æ® ÆÄÀϵéÀ» º´ÇÕÇÏ°í Àç¹èÄ¡½ÃÄÑ ½ÇÇà°¡´ÉÇÑ Ãâ·Â ÆÄÀÏÀ» ¸¸µé¾î ³½´Ù. À§ÀÇ ÀÏ·ÃÀÇ ¼ø¼­¶§¹®¿¡ Ä¿¸Çµå ¶óÀο¡¼­ Á¤Àû ¶óÀ̺귯¸®°¡ ³¡¿¡ ¿Â´Ù. ¶ÇÇÑ ¶óÀ̺귯¸®µé »çÀÌ¿¡ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¼øȯÀûÀÎ ÀÇÁ¸¼ºµµ ÁÖÀDZí°Ô »ìÆì¾ßÇÑ´Ù. ÀÔ·ÂÀ¸·Î ÁÖ¾îÁö´Â ¶óÀ̺귯¸®µéÀº ¼ø¼­´ë·Î ÁÖ¾îÁ®¼­ ¾ÆÄ«À̺êÀÇ ¸â¹öµéÀÌ ÂüÁ¶ÇÒ ¼ö ÀÖµµ·Ï ÇؾßÇϸç, Á¤ÀÇµÈ ÇϳªÀÇ ½Éº¼Àº µÚµû¸£´Â Ä¿¸Çµå ¶óÀÎÀÇ ÀԷ¿¡ ÀÇÇØ ÂüÁ¶µÇ¾î¾ß ÇÑ´Ù. ¸¸¾à Çؼ®ÀÌ ¾ÈµÈ ½Éº¼ÀÌ ÀÖ°í, ±× ½Éº¼ÀÌ ¿©·¯ Á¤Àû ¶óÀ̺귯¸®µé³»¿¡¼­ Á¤ÀǵǾî ÀÖÀ¸¸é, Ä¿¸Çµå ¶óÀο¡¼­ óÀ½¿¡ ÁÖ¾îÁø ¶óÀ̺귯¸®¿¡ Á¤ÀÇµÈ °ÍÀ» ¹Þ¾ÆµéÀδÙ. Àç¹èÄ¡(Relocation) ¸µÄ¿°¡ ¸ðµç ½Éº¼À» Çؼ®ÇÏ°í ³ª¸é, ½Éº¼ ÂüÁ¶´Â ¿ÀÁ÷ ÇϳªÀÇ ½Éº¼ Á¤ÀǸ¸À» °¡Áö°Ô µÈ´Ù. ±× ¶§, ¸µÄ¿´Â ¾Æ·¡ µÎ ½ºÅÜÀ¸·Î ±¸¼ºµÈ Àç¹èÄ¡ ÀÛ¾÷À» ÇϰԵȴÙ. ¼½¼Ç°ú ½Éº¼Á¤ÀǵéÀ» Àç¹èÄ¡ÇÑ´Ù. ¸µÄ¿´Â °°Àº ŸÀÔÀÇ ¸ðµç ¼½¼ÇµéÀ» »õ·Î¿î ÇϳªÀÇ ¼½¼ÇÀ¸·Î ÅëÇÕÇÑ´Ù. ¿¹·Î µé¸é, ¸µÄ¿´Â ÀÔ·ÂÀ¸·Î ¹ÞÀº ¸ðµç Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀÇ .data¼½¼ÇÀ» ÇÕÃÄ ÇϳªÀÇ .data¼½¼ÇÀ» ¸¸µç´Ù. °°Àº °úÁ¤ÀÌ .code¿¡ ´ëÇؼ­µµ ÇàÇØÁø´Ù. ±×·± ÈÄ¿¡ ¸µÄ¿´Â º´ÇÕµÈ »õ·Î¿î ¼½¼Ç°ú, º´ÇÕµÈ »õ·Î¿î ¼½¼Ç³»ÀÇ °¢ ¼½¼Ç, ±×¸®°í ¸ðµç ½Éº¼µé¿¡ ´ëÇØ ·±-ŸÀÓ ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ÇÒ´çÇÑ´Ù. ÀÌ·¯ÇÑ ÀÛ¾÷ÈÄ¿¡´Â ÇÁ·Î±×·¥ÀÇ ¸ðµç ÄÚµå¿Í Àü¿ª º¯¼öµéÀº °íÀ¯ÇÑ ·Îµå-ŸÀÓ ÁÖ¼Ò¸¦ °¡Áö°Ô µÈ´Ù. ¼½¼Çµé¾È¿¡ ÀÖ´Â ½Éº¼ÀÇ ÂüÁ¶¸¦ Àç¹èÄ¡ÇÑ´Ù. ÀÌ °úÁ¤¿¡¼­, ¸µÄ¿´Â ÄÚµå¿Í µ¥ÀÌÅÍ ¼½¼Ç¿¡ ÀÖ´Â ¸ðµç ½Éº¼ ÂüÁ¶¸¦ ¼öÁ¤ÇÏ¿©, ±×°ÍµéÀÌ ¿Ã¹Ù¸¥ ·Îµå-ŸÀÓ ÁÖ¼Ò¸¦ °¡Áö°Ô ÇÑ´Ù. ¾î¼Àºí·¯°¡ Çؼ®¾ÈµÈ ½Éº¼µéÀ» ¸¸³¯ ¶§¸¶´Ù, ¾î¼Àºí·¯´Â ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ .rel.text/.rel.data ¼½¼Ç¿¡ Çؼ®¾ÈµÈ ½Éº¼µéÀ» À§ÇÑ Àç¹èÄ¡ Ç׸ñÀ» »ý¼ºÇÑ´Ù. ÀÌ·¯ÇÑ Àç¹èÄ¡ Ç׸ñÀº Çؼ®¾ÈµÈ ½Éº¼µéÀÌ ¾î¶»°Ô Çؼ®µÇ¾î¾ß ÇÏ´ÂÁö¿¡ ´ëÇÑ Á¤º¸µéÀ» ´ã°í ÀÖ´Ù. ÀüÇüÀûÀÎ ELF Àç¹èÄ¡ Ç׸ñÀº ´ÙÀ½°ú °°Àº ¸â¹öµé·Î ±¸¼ºµÈ´Ù. ¿É¼Â, Àç¹èÄ¡µÇ¾îÁú ÇÊ¿ä°¡ ÀÖ´Â ½Éº¼ ÂüÁ¶ÀÇ ¼½¼Ç³»¾Ö¼­ÀÇ ¿É¼ÂÀ» ³ªÅ¸³»¸ç, ȤÀº µð½ºÅ©ÀÇ ÀúÀå°ø°£ÀÌ ¿ÀºêÁ§Æ® ÆÄÀϳ»¿¡¼­ Àç¹èÄ¡µÇ¾îÁú ÇÊ¿ä°¡ ÀÖÀ» ½Ã, ÀÌ °ªÀº Àç¹èÄ¡µÉ ÇÊ¿ä°¡ ÀÖ´Â µð½ºÅ© ¼½¼ÇÀÇ Ã³À½ºÎÅÍ ¹ÙÀÌÆ®´ÜÀ§·Î ¾ó¸¶¸¸Å­ ¶³¾îÁ® Àִ°¡¸¦ ³ªÅ¸³½´Ù. ½Éº¼, ÀÌ°ÍÀº ½Éº¼ Å×ÀÌºí¿¡¼­ÀÇ À妽º·Î¼­, ¾ÆÁ÷ Çؼ®ÀÌ ¾ÈµÈ ½Éº¼ÀÌ ½Éº¼ Å×ÀÌºí¿¡¼­ ¸î ¹ø° À§Ä¡¿¡ Àִ°¡¸¦ ³ªÅ¸³½´Ù. ŸÀÔ, Àç¹èÄ¡ ŸÀÔ, ÀϹÝÀûÀ¸·Î R_386_PC32, ÀÌ´Â PC-relative ÁÖ¼ÒÁöÁ¤¹æ½ÄÀ» ³ªÅ¸³»¸ç, R_386_32´Â Àý´ëÁÖ¼ÒÁöÁ¤¹æ½ÄÀ» ³ªÅ¸³½´Ù. ¸µÄ¿´Â Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ¸ðµâµé ¾È¿¡ ÀÖ´Â ¸ðµç Àç¹èÄ¡ ¿£Æ®¸®¿¡ ´ëÇØ ÀÌ ÀÛ¾÷À» ¹Ýº¹ÇÏ°í ±×°ÍµéÀÇ Å¸ÀÔ¿¡ µû¶ó Çؼ®¾ÈµÈ ½Éº¼µéÀ» Àç¹èÄ¡ÇÑ´Ù. R_386_PC32´Â Àç¹èÄ¡ ÁÖ¼Ò¸¦ S+A-P·Î °è»êÇϸç, R_386_32´Â S+A·Î °è»êÇÑ´Ù. ÀÌ °è»ê¿¡¼­, S´Â Àç¹èÄ¡ Ç׸ñÀÇ ½Éº¼Ç׸ñ¿¡ µé¾îÀÖ´Â °ªÀ» °¡¸®Å°¸ç, P´Â ¼½¼Ç ¿É¼Â ȤÀº Àç¹èÄ¡µÇ´Â ÀúÀåÀåÄ¡ÀÇ ÁÖ¼Ò¸¦ ³ªÅ¸³½´Ù (Àç¹èÄ¡ Ç׸ñÀÇ ¿É¼Â°ªÀ¸·ÎºÎÅÍ °è»êµÈ´Ù). ±×¸®°í A´Â Àç¹èÄ¡ °¡´ÉÇÑ Çʵ带 °è»êÇϴµ¥ ÇÊ¿äÇÑ ÁÖ¼ÒÀÌ´Ù. µ¿Àû ¸µÅ·: °øÀ¯ ¶óÀ̺귯¸® À§ÀÇ Á¤Àû ¶óÀ̺귯¸®´Â ¸î°¡Áö Áß¿äÇÑ ´ÜÁ¡µéÀ» Áö´Ï°í ÀÖ´Ù; ¿¹·Î, printf³ª scanf¿Í °°Àº ÇÔ¼öµéÀ» °í·ÁÇغ¸ÀÚ. ÀÌ·¯ÇÑ ÇÔ¼öµéÀº °ÅÀÇ ¸ðµç ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÈ´Ù. ¸¸¾à ½Ã½ºÅÛÀÌ 50~100°³ÀÇ ÇÁ·Î¼¼½º¸¦ µ¿ÀÛ½ÃÅ°°í ÀÖ´Ù¸é, °¢ ÇÁ·Î¼¼½º´Â °¢°¢ printf¿Í scanfÀÇ ½ÇÇà °¡´ÉÇÑ ÄÚµåÀÇ º¹»çº»À» °¡Áö°í µ¿ÀÛÇÏ°Ô µÈ´Ù. ÀÌ°ÍÀº ¸Þ¸ð¸® °ø°£ÀÇ Áß´ëÇÑ ³¶ºñ¸¦ ÃÊ·¡ÇÑ´Ù. °øÀ¯ ¶óÀ̺귯¸®´Â ÀÌ·¯ÇÑ Á¤Àû ¶óÀ̺귯¸®ÀÇ ´ÜÁ¡À» ÇØ°áÇÑ´Ù. °øÀ¯ ¶óÀ̺귯¸®´Â ·±-ŸÀÓ¶§ ¸Þ¸ð¸®ÀÇ ÀÓÀÇÀÇ À§Ä¡·Î ·ÎµåµÉ ¼ö ÀÖ´Â ¿ÀºêÁ§Æ® ¸ðµâÀÌ´Ù. ±×¸®°í ±×°ÍÀº ¸Þ¸ð¸®¿¡¼­ ÇÁ·Î±×·¥°ú ¸µÅ·µÉ ¼ö ÀÖ´Ù. °øÀ¯ ¶óÀ̺귯¸®´Â Á¾Á¾ °øÀ¯ ¿ÀºêÁ§Æ®¶ó°íµµ ºÒ¸®¿î´Ù. ´ëºÎºÐÀÇ À¯´Ð½º ½Ã½ºÅÛ¿¡¼­´Â .so·Î °øÀ¯ ¶óÀ̺귯¸® ÆÄÀϸíÀÌ ³¡³ª¸ç; HP-UX¿¡¼­´Â .sl·Î ³¡³ª°í ¸¶ÀÌÅ©·Î ¼ÒÇÁÆ®»ç´Â DLL(dynamic link libraries)·Î ºÎ¸¥´Ù. °øÀ¯ ¿ÀºêÁ§Æ®¸¦ ¸¸µé±â À§ÇØ, ÄÄÆÄÀÏ·¯´Â ´ÙÀ½°ú °°Àº ¿É¼ÇÀ» °¡Áö°í È£ÃâµÈ´Ù. gcc -shared -fPIC -o libfoo.so a.o b.o À§ÀÇ ¸í·É¾î´Â ÄÄÆÄÀÏ·¯°¡ a.o, b.o¶ó´Â µÎ °³ÀÇ ¿ÀºêÁ§Æ® ¸ðµâµé·ÎºÎÅÍ libfoo.so¶ó´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µéµµ·Ï ÇÑ´Ù. -fPIC ¿É¼ÇÀº ÄÄÆÄÀÏ·¯¿¡°Ô À§Ä¡ µ¶¸³ÀûÀÎ ÄÚµå(position independent code)¸¦ ¸¸µéµµ·Ï ÇÑ´Ù. ¸¸¾à bar.o¶ó´Â ¿ÀºêÁ§Æ® ¸ðµâÀÌ a.o, b.o¿Í ÀÇÁ¸¼ºÀÌ Á¸ÀçÇÑ´Ù°í °¡Á¤Çϸé, ¸µÄ¿´Â ´ÙÀ½Ã³·³ ºÒ¸®¿öÁø´Ù. gcc bar.o ./libfoo.so ÀÌ ¸í·É¾î´Â ·Îµå-ŸÀÓ¶§ ¸µÅ©µÉ ¼ö ÀÖ´Â a.outÀ̶ó´Â ½ÇÇàÆÄÀÏÀ» ¸¸µç´Ù. ¿©±â¼­ a.outÀº Á¤Àû ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ ¶§´Â Æ÷ÇԵǾú´ø a.o¿Í b.o ¿ÀºêÁ§Æ® ¸ðµâÀ» Æ÷ÇÔÇÏ°í ÀÖÁö ¾Ê´Ù. ÀÌ ½ÇÇàÆÄÀÏÀº ·±-ŸÀÓ¶§ libfoo.so¿Í ÇÔ²² Çؼ®µÉ ¼ö ÀÖ´Â Àç¹èÄ¡¿Í ½Éº¼ Å×ÀÌºí¸¸À» Æ÷ÇÔÇÏ°í ÀÖ´Ù. µû¶ó¼­, a.outÀº libfoo.so¿ÍÀÇ ÀÇÁ¸¼ºÀÌ Á¸ÀçÇÏ´Â ºÎºÐÀûÀ¸·Î ½ÇÇà°¡´ÉÇÑ ÆÄÀÏ(partially executable file)ÀÌ´Ù. ÀÌ ½ÇÇà°¡´ÉÇÑ ÆÄÀÏÀº .interp¶ó´Â ¼½¼ÇÀ» °¡Áö°í Àִµ¥, ÀÌ ¼½¼ÇÀº µ¿Àû¸µÄ¿(dynamic linker)ÀÇ À̸§À» °¡¸®Å°°í ÀÖ´Ù. µ¿Àû¸µÄ¿ ÀÚüµµ ¸®´ª½º¿¡¼­´Â ld-linux.so¶ó´Â °øÀ¯ ¿ÀºêÁ§Æ®ÀÌ´Ù. ±×·¡¼­ ½ÇÇàÆÄÀÏÀÌ ¸Þ¸ð¸®·Î ÀûÀçµÉ ¶§, ·Î´õ´Â Á¦¾î±ÇÀ» µ¿Àû¸µÄ¿·Î ³Ñ±ä´Ù. µ¿Àû¸µÄ¿´Â °øÀ¯ ¶óÀ̺귯¸®µé°ú ÇØ´ç ÇÁ·Î±×·¥ÀÇ ÁÖ¼Ò°ø°£À» ¸ÅÇνÃų ¼ö ÀÖ´Â start-up Äڵ带 °¡Áö°í ÀÖ°í ´ÙÀ½°ú °°ÀÌ µ¿ÀÛÇÑ´Ù. libfoo.soÀÇ ÄÚµå¿Í µ¥ÀÌÅ͸¦ ¸Þ¸ð¸® ¼ÓÀ¸·Î Àç¹èÄ¡ÇÑ´Ù. a.out¿¡ ÀÖ´Â ÂüÁ¶µéÀ» libfoo.so¿¡ Á¤ÀǵǾî ÀÖ´Â °ÍÀ¸·Î Àç¹èÄ¡ÇÑ´Ù. ¸¶Áö¸·À¸·Î, µ¿Àû¸µÄ¿´Â Á¦¾î±ÇÀ» ÀÀ¿ëÇÁ·Î±×·¥À¸·Î ³Ñ±ä´Ù. À̶§ºÎÅÍ °øÀ¯ ¿ÀºêÁ§Æ®´Â ¸Þ¸ð¸®¿¡ °íÁ¤µÇ°Ô µÈ´Ù. ÀÀ¿ë ÇÁ·Î±×·¥À¸·ÎºÎÅÍ µ¿Àû ¶óÀ̺귯¸® ·Îµù µ¿Àû ¶óÀ̺귯¸®µéÀº ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ°í ÀÖ´Â Áß¿¡µµ ·ÎµåµÉ ¼ö ÀÖ´Ù. ÀÀ¿ë ÇÁ·Î±×·¥Àº °øÀ¯ ¶óÀ̺귯¸®µéÀ» ÀڽŰú ¸µÅ·ÇÏÁö ¾Ê¾Æµµ, µ¿Àû¸µÄ¿¿¡°Ô ¿äûÇÏ¿© °øÀ¯ ¶óÀ̺귯¸®µéÀ» ·ÎµåÇÏ°í ¸µÅ·½Ãų ¼ö ÀÖ´Ù. ¸®´ª½º¿Í ¼Ö¶ó¸®½º ±×¸®°í ´Ù¸¥ ½Ã½ºÅ۵鿡¼­´Â À̸¦ À§ÇØ µ¿ÀûÀ¸·Î °øÀ¯ ¿ÀºêÁ§Æ®µéÀ» ·ÎµåÇÒ ¼ö ÀÖ´Â ¸î°¡Áö Á¾·ùÀÇ ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. ¸®´ª½º¿¡¼­´Â °øÀ¯ ¿ÀºêÁ§Æ®¸¦ ¿­ ¼ö ÀÖ´Â dlopen; °øÀ¯ ¿ÀºêÁ§Æ®ÀÇ ½Éº¼ Å×À̺íÀ» º¼ ¼ö ÀÖ´Â dlsym, °øÀ¯ ¿ÀºêÁ§Æ®¸¦ ´ÝÀ» ¼ö ÀÖ´Â dlclose¿Í °°Àº ½Ã½ºÅÛ ÄÝÀ» Á¦°øÇϸç, À©µµ¿ìÁî¿¡¼­´Â LoadLibrary¿Í GetProcAddress¿Í °°Àº ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. ¿ÀºêÁ§Æ® ÆÄÀϵéÀ» Á¶ÀÛÇÒ ¼ö ÀÖ´Â Åøµé ¿©±â¿¡ ¿ÀºêÁ§Æ® ÆÄÀϵé°ú ½ÇÇàÆÄÀϵéÀ» Á¶»çÇÒ ¼ö ÀÖ´Â ÅøµéÀÇ ¸ñ·ÏÀÌ ÀÖ´Ù. ar: Á¤Àû ¶óÀ̺귯¸®µéÀ» ¸¸µç´Ù. objdump: °¡Àå Áß¿äÇÑ ¹ÙÀ̳ʸ® Åø; ¹ÙÀ̳ʸ® Çü½Ä ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ ¸ðµç Á¤º¸¸¦ º¸¿©ÁØ´Ù. strings: ¹ÙÀ̳ʸ® ÆÄÀÏÀÇ Ãâ·Â°¡´ÉÇÑ ¸ðµç ¹®ÀÚ¿­µéÀ» º¸¿©ÁØ´Ù. nm: ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ ½Éº¼ Å×ÀÌºí¿¡ Á¤ÀÇµÈ ½Éº¼µéÀÇ ¸®½ºÆ®¸¦ º¸¿©ÁØ´Ù. ldd: ¿ÀºêÁ§Æ® ¹ÙÀ̳ʸ® ÆÄÀÏÀÌ ÀÇÁ¸ÇÏ°í ÀÖ´Â °øÀ¯ ¶óÀ̺귯¸®µéÀÇ ¸ñ·ÏÀ» º¸¿©ÁØ´Ù. strip: ½Éº¼ Å×À̺í Á¤º¸¸¦ Áö¿î´Ù. Àо °Íµé Linkers and Loaders by John Levine Linkers and Libraries Guide from Sun