¸µÄ¿¿Í ·Î´õ
SandeepGrover
À±Àμö
ÀÌ ±ÛÀº ÄÄÆÄÀÏ·¯, ¸µÄ¿, ·Î´õµéÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö¸¦ °£·«È÷ º¸À̸ç, ¶ÇÇÑ °øÀ¯ ¶óÀ̺귯¸®ÀÇ ÀÌÁ¡¿¡ ´ëÇØ¼ ¾ê±âÇÑ´Ù.
1. ¼¹®
¸µÅ·(linking)Àº ¿©·¯°¡Áö ÄÚµå¿Í µ¥ÀÌÅ͸¦ ¹¾î ¸Þ¸ð¸®·Î ·ÎµåµÉ ¼ö ÀÖ´Â ÇϳªÀÇ ½ÇÇà°¡´ÉÇÑ ÆÄÀÏÀ» ¸¸µå´Â ÀÛ¾÷ÀÌ´Ù. ¸µÅ·Àº ÄÄÆÄÀÏ-ŸÀÓ¶§ ÇàÇØÁú ¼öµµ ÀÖ°í, ·Îµå-ŸÀÓ(·Î´õ¿¡ ÀÇÇØ), ȤÀº ·±-ŸÀÓ(ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ÀÇÇØ)¶§µµ ÇàÇØÁú ¼ö ÀÖ´Ù. 1940³â´ë¿¡´Â ÀÌ·¯ÇÑ ¸µÅ·ÀÛ¾÷À» »ç¶÷ÀÌ ¼Õ¼ö ÇÏ¿´´Ù. ÇöÀç¿¡´Â °øÀ¯ ¶óÀ̺귯¸®(shared library)µéÀ» µ¿ÀûÀ¸·Î ¸µÅ·½ÃÄÑÁÖ´Â µîÀÇ º¹ÀâÇÑ ÀÏÀ» ÇÒ ¼ö ÀÖ´Â ¸µÄ¿(linker)¶ó´Â °ÍÀÌ ÀÖ´Ù. ÀÌ ¹®¼´Â ¸µÅ·ÀÇ ¸ðµç °úÁ¤, ¿¹·Î µéÀÚ¸é Àç¹èÄ¡(relocation)¿Í ½Éº¼ ÇØ¼®(symbol resolution)ºÎÅÍ À§Ä¡ µ¶¸³Àû(position independent)ÀÎ °øÀ¯ ¶óÀ̺귯¸® Áö¿øµî¿¡ ´ëÇØ ´Ù·é´Ù.¹®Á¦¸¦ °£´ÜÇϰí ÀÌÇØÇϱ⠽±°Ô ÇϱâÀ§ÇØ, ³ª´Â ÀÌ ¹®¼¸¦ x86 ¾ÆÅ°ÅØÃ³¿¡ ±â¹ÝÇÑ ¸®´ª½º¿Í GNU ÄÄÆÄÀÏ·¯(GCC)¿Í ¸µÄ¿(ld)¿¡ ±â¹ÝÇÑ ELF(executable and linking format) ½ÇÇàÆÄÀÏ¿¡ ÃÊÁ¡À» ¸ÂÃß¾ú´Ù. ±×·¯³ª, ±âº»ÀûÀÎ ¸µÅ·ÀÇ ¾ÆÀ̵ð¾î´Â ¿î¿µÃ¼Á¦, ÇÁ·Î¼¼¼ ¶Ç´Â ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ Çü½Ä¿¡ ¹«°üÇÏ°Ô Àû¿ëµÉ ¼ö ÀÖ´Ù.
1.1. ÀúÀÛ±Ç Á¤º¸
ÀÌ ¹®¼´Â 2002³â 11¿ù 26ÀÏ, Linux Journal¿¡ Sandeep Grover¾¾°¡ Linkers and Loaders¶ó´Â Á¦¸ñÀ¸·Î ±âÀçÇϽбÛÀÔ´Ï´Ù. ¿ø ÀúÀÚ¿¡°Ô ¸ÞÀÏ·Î ¿¬¶ôÇÏ¿© ½Ç·È´ø ÀâÁöÀÇ À̸§°ú ¿øÀúÀÚ°¡ ´©±ºÁö¸¦ ¹àÈ÷¸é ¹ø¿ªÀ» ÇØµµ ÁÁ´Ù´Â µ¿ÀǸ¦ ¾ò¾ú½À´Ï´Ù.
1.2. Çǵå¹é
ÀÌ ¹®¼¿¡ ´ëÇÑ ¹ßÀüÀûÀÎ Á¦¾ÈÀ̳ª ¼öÁ¤»çÇ×, ¹®Á¦Á¡ µî¿¡ ´ëÇÑ Çǵå¹éÀº ¾ðÁ¦µçÁö ȯ¿µÇÕ´Ï´Ù. ¸ÞÀÏÀ» º¸³» ÁֽʽÿÀ.
2. ÄÄÆÄÀÏ·¯, ¸µÄ¿, ·Î´õµéÀÇ µ¿ÀÛ: ±âº» »çÇ×
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 ¿ÀºêÁ§Æ® ÆÄÀϵé¾È¿¡ ÀÖ´Â ¾î¼Àºí·¯ÀÇ Ãâ·Â¹°¿¡¼ ±× À¯·¡¸¦ ãÀ» ¼ö ÀÖ´Ù. ±× ÀÌÈÄ·Î ¿ÀºêÁ§Æ® Çü½ÄÀº ´Ù¾çÇÏ°Ô ¹Ù²î¾î ¿ÔÁö¸¸, ±× À̸§Àº °è¼Ó »ç¿ëµÇ¾îÁö°í ÀÖ´Ù.
3. ¸µÄ¿¿Í ·Î´õ
¸µÄ¿¿Í ·Î´õ´Â ¸¹Àº ºÎºÐÀÌ ¿¬°üµÇ¾î ¼öÇàµÇÁö¸¸ °³³äÀûÀ¸·Î´Â ´Ù¸¥ ÀÛ¾÷µéÀ» ¼öÇàÇÑ´Ù.
-
ÇÁ·Î±×·¥ ·Îµù(Program Loading). À̰ÍÀº ÇÁ·Î±×·¥À» ½ÇÇà°¡´ÉÇÑ »óÅ·Π¸¸µé±â À§ÇØ ÇÏµå µð½ºÅ©·ÎºÎÅÍ ÇÁ·Î±×·¥ À̹ÌÁö¸¦ ÀÐ¾î¼ ¸ÞÀÎ ¸Þ¸ð¸®·Î º¹»çÇÏ´Â °ÍÀ» ¸»ÇÑ´Ù. ¾î¶² °æ¿ì¿¡´Â ÇÁ·Î±×·¥ ·ÎµùÀÌ ÀúÀå(storage)°ø°£À» ÇÒ´çÇϰųª °¡»óÁÖ¼Ò¸¦ µð½ºÅ© ÆäÀÌÁö·Î ¸ÅÇÎÇÏ´Â Àϵµ ÇÑ´Ù.
-
Àç¹èÄ¡(Relocation). ÄÄÆÄÀÏ·¯¿Í ¾î¼Àºí·¯´Â °¢°¢ÀÇ ÀÔ·Â ÆÄÀϵé·ÎºÎÅÍ ½ÃÀÛÁÖ¼Ò°¡ Á¦·ÎÀÎ ¿ÀºêÁ§Æ® Äڵ带 »ý¼ºÇÑ´Ù. Àç¹èÄ¡¶ó´Â °ÍÀº ÇÁ·Î±×·¥ÀÇ °¢±â ´Ù¸¥ ºÎºÐµé(ÄÚµå¿Í µ¥ÀÌÅÍ)¿¡ ´ëÇØ ·ÎµåµÇ´Â ÁÖ¼Ò¸¦ ÇÒ´çÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÀÛ¾÷Àº °°Àº ŸÀÔ(ÄÚµå ȤÀº µ¥ÀÌÅÍ)À¸·Î Á¤ÀÇµÈ ¸ðµç ±¸°£µéÀ» ÇϳªÀÇ ±¸°£À¸·Î ÇÕÄ¡°í, ÀÌ·¯ÇÑ ±¸°£µéÀÌ ·±-ŸÀÓ¶§ ¿Ã¹Ù¸¥ ÁÖ¼Ò¸¦ °¡¸®Å³ ¼ö ÀÖµµ·Ï Á¶Á¤ÇÏ´Â °ÍÀ» ¸»ÇÑ´Ù.
-
½Éº¼ ÇØ¼®(Symbol Resolution). ÇÁ·Î±×·¥Àº ´Ù¾çÇÑ ÇÏÀ§ ÇÁ·Î±×·¥(subprogram)µé·Î ±¸¼ºµÈ´Ù; ÇϳªÀÇ »óÀ§ ÇÁ·Î±×·¥ÀÌ ´Ù¸¥ ÇÏÀ§ ÇÁ·Î±×·¥À» ÂüÁ¶ÇÏ´Â °ÍÀº ½Éº¼À̶ó´Â °ÍÀ» ÅëÇØ ÀÌ·ç¾îÁø´Ù. ¸µÄ¿ÀÇ ÀÛ¾÷Àº ÀÌ·¯ÇÑ ½Éº¼ÀÇ À§Ä¡¸¦ ¾Ë¾Æ³»¾î »óÀ§ ÇÁ·Î±×·¥ÀÇ ¿ÀºêÁ§Æ® Äڵ忡 ÇÏÀ§ ÇÁ·Î±×·¥ÀÇ ÁÖ¼Ò¸¦ ±âÀÔÇÏ¿© ÂüÁ¶¸¦ ÇØ¼®Çϵµ·Ï ÇÑ´Ù.
¸µÄ¿¿Í ·Î´õ»çÀÌ¿¡´Â ÁßøµÇ´Â Àϵé°ú °¢°¢ Â÷À̳ª´Â Àϵ鵵 Àִµ¥, ÀÌ·¸°Ô »ý°¢Çϵµ·Ï ÇÏÀÚ: ·Î´õ´Â ÇÁ·Î±×·¥ÀÌ ·ÎµùµÇµµ·Ï Çϸç; ¸µÄ¿´Â ½Éº¼À» ÇØ¼®Çϸç; ¸µÄ¿¿Í ·Î´õ, µÑ ´Ù Àç¹èÄ¡¸¦ ÇÒ ¼ö ÀÖ´Ù.
4. ¿ÀºêÁ§Æ® ÆÄÀϵé
¿ÀºêÁ§Æ® ÆÄÀϵéÀº ¼¼°¡Áö·Î ºÐ·ùµÉ ¼ö ÀÖ´Ù.
-
Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏ(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¿¡ ´ëÇØ ´Ù·é´Ù.
표 1. ÀüÇüÀûÀÎ Àç¹èÄ¡ °¡´ÉÇÑ ELF ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ Çü½Ä
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 ±¸°£¿¡ ÀÖ´Â ½Éº¼ Å×ÀÌºí¿¡ µé¾îÀÖ´Â ½ºÆ®¸µµé¿¡ ´ëÇÑ Å×À̺íÀÌ´Ù.
5. ½Éº¼µé°ú ½Éº¼ ÇØ¼®
¸ðµç Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀº ½Éº¼ Å×À̺í°ú ±×¿Í °ü·ÃµÈ ½Éº¼µéÀ» °¡Áö°í ÀÖ´Ù. ¸µÄ¿ÀÇ °üÁ¡¿¡¼ º¼ ¶§ ½Éº¼µéÀ» ´ÙÀ½°ú °°ÀÌ ºÐ·ùÇÒ ¼ö ÀÖ´Ù.
-
ÇöÀçÀÇ ÆÄÀÏ¿¡¼ Á¤Àǵǰí, ´Ù¸¥ ÆÄÀϵ鿡¼ ÂüÁ¶µÇ´Â Àü¿ª ½Éº¼. ¸ðµç 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ÀÌ´Ù.
6. Á¤Àû ¶óÀ̺귯¸®ÀÇ ¸µÅ·
Á¤Àû ¶óÀ̺귯¸®´Â ºñ½ÁÇÑ ÇüÀ» Áö´Ñ ¿ÀºêÁ§Æ® ÆÄÀϵéÀÇ ÁýÇÕÀÌ´Ù. ÀÌ·¯ÇÑ ¶óÀ̺귯¸®µéÀº µð½ºÅ©¿¡ ¾ÆÄ«À̺ê(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°ú °°Àº ¼öÇаü·Ã ÇÔ¼öµéÀ» ´ã°í ÀÖ´Â ¶óÀ̺귯¸®ÀÌ´Ù.