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

¸µÄ¿¿Í ·Î´õ

¸µÄ¿¿Í ·Î´õ

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
Love is in the offing. Be affectionate to one who adores you.


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.0020 sec