· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Docbook Sgml/Linker Loader-TRANS

You are not allowed to 'LikePages'


¸µÄ¿¿Í ·Î´õ

¸µÄ¿¿Í ·Î´õ

SandeepGrover

À±Àμö

ÀÌ ±ÛÀº ÄÄÆÄÀÏ·¯, ¸µÄ¿, ·Î´õµéÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö¸¦ °£·«È÷ º¸À̸ç, ¶ÇÇÑ °øÀ¯ ¶óÀ̺귯¸®ÀÇ ÀÌÁ¡¿¡ ´ëÇؼ­ ¾ê±âÇÑ´Ù.

고친 과정
고침 0.12002-11-28고친이 Äð¸µÆÒ
ÃÖÃÊ ¹ø¿ª


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 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 ±¸°£¿¡ ÀÖ´Â ½Éº¼ Å×ÀÌºí¿¡ µé¾îÀÖ´Â ½ºÆ®¸µµé¿¡ ´ëÇÑ Å×À̺íÀÌ´Ù.


5. ½Éº¼µé°ú ½Éº¼ Çؼ®

¸ðµç Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀº ½Éº¼ Å×À̺í°ú ±×¿Í °ü·ÃµÈ ½Éº¼µéÀ» °¡Áö°í ÀÖ´Ù. ¸µÄ¿ÀÇ °üÁ¡¿¡¼­ º¼ ¶§ ½Éº¼µéÀ» ´ÙÀ½°ú °°ÀÌ ºÐ·ùÇÒ ¼ö ÀÖ´Ù.

  • ÇöÀçÀÇ ÆÄÀÏ¿¡¼­ Á¤Àǵǰí, ´Ù¸¥ ÆÄÀϵ鿡¼­ ÂüÁ¶µÇ´Â Àü¿ª ½Éº¼. ¸ðµç non-static ÇÔ¼öµé°ú Àü¿ª º¯¼öµéÀÌ ÀÌ ºÐ·ù¿¡ ÇØ´çÇÑ´Ù.

  • ÇöÀçÀÇ ÆÄÀÏ¿¡¼­ ÂüÁ¶´Â µÇ³ª, ´Ù¸¥ °÷¿¡¼­ Á¤ÀÇµÈ Àü¿ª ½Éº¼. externÀ¸·Î Á¤ÀÇµÈ ¸ðµç ÇÔ¼öµé°ú º¯¼öµéÀÌ ÀÌ ºÐ·ù¿¡ ÇØ´çÇÑ´Ù.

  • ÇöÀçÀÇ ÆÄÀÏ¿¡¼­¸¸ Á¤Àǵǰí ÂüÁ¶µÇ´Â Áö¿ª ½Éº¼. ¸ðµç static ÇÔ¼öµé°ú º¯¼öµéÀÌ ÀÌ ºÐ·ù¿¡ ÇØ´çÇÑ´Ù.

¸µÄ¿´Â ½Éº¼ÀÇ ÂüÁ¶¸¦ Çؼ®ÇÒ ¶§, ÀÔ·ÂÀ¸·Î ÁÖ¾îÁö´Â Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ ½Éº¼ Å×À̺í·ÎºÎÅÍ ²À Çϳª¸¸ Á¸ÀçÇÏ´Â ½Éº¼ÀÇ Á¤ÀǸ¦ ÂüÁ¶ÇÏ¿© ½Éº¼ ÂüÁ¶¸¦ Çؼ®ÇÑ´Ù. Áö¿ª ½Éº¼(local symbol)Àº ±×¿¡ ´ëÇÑ ´ÙÁß Á¤ÀÇ(multiple definitions)¸¦ ½Éº¼ Å×À̺íÀÌ °¡Áú ¼ö ¾øÀ¸¹Ç·Î ½±°Ô Çؼ®µÈ´Ù. ±×·¯³ª Àü¿ª ½Éº¼ÀÇ Çؼ®Àº ¾à°£ÀÇ Æ®¸¯ÀÌ ¿ä±¸µÈ´Ù. ÄÄÆÄÀÏ Å¸ÀÓ¶§, ÄÄÆÄÀÏ·¯´Â Àü¿ª ½Éº¼µéÀ» strong ȤÀº weakÇÑ °ÍÀ¸·Î ¸¸µå´Âµ¥, ÇÔ¼öµé°ú ÃʱâÈ­µÈ Àü¿ª º¯¼öµéÀº strongÇÏ°Ô, ÃʱâÈ­µÇÁö ¾ÊÀº º¯¼öµéÀº weakÇÏ°Ô ¸¸µç´Ù. ±×·¯¸é ¸µÄ¿´Â ¾Æ·¡ÀÇ ·êÀ» Àû¿ëÇÏ¿© ½Éº¼µéÀ» Çؼ®ÇÏ°Ô µÈ´Ù.

  1. ´ÙÁß strong ½Éº¼µéÀº Çã°¡µÇÁö ¾Ê´Â´Ù.

  2. ÇϳªÀÇ strong ½Éº¼°ú ¿©·¯°³ÀÇ weak ½Éº¼µéÀÌ ÀÖÀ¸¸é, strong ½Éº¼À» ¼±ÅÃÇÑ´Ù.

  3. ¿©·¯°³ÀÇ 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°ú °°Àº ¼öÇаü·Ã ÇÔ¼öµéÀ» ´ã°í ÀÖ´Â ¶óÀ̺귯¸®ÀÌ´Ù.


ID
Password
Join
Your temporary financial embarassment will be relieved in a surprising manner.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-08-25 02:36:18
Processing time 0.0013 sec