|
EmacsExpandMemberFunctions › LinuxdocSgml/Lex_Yacc-KLDP › LinuxAdminBookmarkForNovice › DocbookSgml/Python_XML-TRANS › AndroidPortingOnRealTarget/ko › DocbookSgml/LinkerLoader-TRANS 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
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. ¸µÄ¿¿Í ·Î´õ¸µÄ¿¿Í ·Î´õ´Â ¸¹Àº ºÎºÐÀÌ ¿¬°üµÇ¾î ¼öÇàµÇÁö¸¸ °³³äÀûÀ¸·Î´Â ´Ù¸¥ ÀÛ¾÷µéÀ» ¼öÇàÇÑ´Ù.
¸µÄ¿¿Í ·Î´õ»çÀÌ¿¡´Â ÁßøµÇ´Â Àϵé°ú °¢°¢ Â÷À̳ª´Â Àϵ鵵 Àִµ¥, ÀÌ·¸°Ô »ý°¢Çϵµ·Ï ÇÏÀÚ: ·Î´õ´Â ÇÁ·Î±×·¥ÀÌ ·ÎµùµÇµµ·Ï Çϸç; ¸µÄ¿´Â ½Éº¼À» ÇØ¼®Çϸç; ¸µÄ¿¿Í ·Î´õ, µÑ ´Ù Àç¹èÄ¡¸¦ ÇÒ ¼ö ÀÖ´Ù. 4. ¿ÀºêÁ§Æ® ÆÄÀϵé¿ÀºêÁ§Æ® ÆÄÀϵéÀº ¼¼°¡Áö·Î ºÐ·ùµÉ ¼ö ÀÖ´Ù.
ÄÄÆÄÀÏ·¯¿Í ¾î¼Àºí·¯´Â Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» »ý¼ºÇÑ´Ù(°øÀ¯ ¿ÀºêÁ§Æ® ÆÄÀϵµ ¶ÇÇÑ »ý¼ºÇÑ´Ù). ¸µÄ¿´Â ÀÌ·¯ÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀ» ÇÕÃÄ ½ÇÇà°¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀ» »ý¼ºÇÑ´Ù. ¿ÀºêÁ§Æ® ÆÄÀϵéÀº ½Ã½ºÅÛ¿¡ µû¶ó ±× Çü½ÄÀÌ ´Ù¸£´Ù. ÃÖÃÊÀÇ À¯´Ð½º ½Ã½ºÅÛÀº 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 Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ °¢ ±¸°£ÀÇ Àǹ̴ ¾Æ·¡¿Í °°´Ù.
5. ½Éº¼µé°ú ½Éº¼ ÇØ¼®¸ðµç Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀº ½Éº¼ Å×À̺í°ú ±×¿Í °ü·ÃµÈ ½Éº¼µéÀ» °¡Áö°í ÀÖ´Ù. ¸µÄ¿ÀÇ °üÁ¡¿¡¼ º¼ ¶§ ½Éº¼µéÀ» ´ÙÀ½°ú °°ÀÌ ºÐ·ùÇÒ ¼ö ÀÖ´Ù.
¸µÄ¿´Â ½Éº¼ÀÇ ÂüÁ¶¸¦ ÇØ¼®ÇÒ ¶§, ÀÔ·ÂÀ¸·Î ÁÖ¾îÁö´Â Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ ½Éº¼ Å×À̺í·ÎºÎÅÍ ²À Çϳª¸¸ Á¸ÀçÇÏ´Â ½Éº¼ÀÇ Á¤ÀǸ¦ ÂüÁ¶ÇÏ¿© ½Éº¼ ÂüÁ¶¸¦ ÇØ¼®ÇÑ´Ù. Áö¿ª ½Éº¼(local symbol)Àº ±×¿¡ ´ëÇÑ ´ÙÁß Á¤ÀÇ(multiple definitions)¸¦ ½Éº¼ Å×À̺íÀÌ °¡Áú ¼ö ¾øÀ¸¹Ç·Î ½±°Ô ÇØ¼®µÈ´Ù. ±×·¯³ª Àü¿ª ½Éº¼ÀÇ ÇØ¼®Àº ¾à°£ÀÇ Æ®¸¯ÀÌ ¿ä±¸µÈ´Ù. ÄÄÆÄÀÏ Å¸ÀÓ¶§, ÄÄÆÄÀÏ·¯´Â Àü¿ª ½Éº¼µéÀ» strong ȤÀº weakÇÑ °ÍÀ¸·Î ¸¸µå´Âµ¥, ÇÔ¼öµé°ú ÃʱâÈµÈ Àü¿ª º¯¼öµéÀº strongÇϰÔ, ÃʱâȵÇÁö ¾ÊÀº º¯¼öµéÀº weakÇÏ°Ô ¸¸µç´Ù. ±×·¯¸é ¸µÄ¿´Â ¾Æ·¡ÀÇ ·êÀ» Àû¿ëÇÏ¿© ½Éº¼µéÀ» ÇØ¼®ÇÏ°Ô µÈ´Ù.
¿¹·Î, ´ÙÀ½°ú °°Àº µÎ ÇÁ·Î±×·¥ÀÇ ¸µÅ·Àº ¸µÅ©-ŸÀÓ ¿¡·¯¸¦ ³½´Ù.
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°ú °°Àº ¼öÇаü·Ã ÇÔ¼öµéÀ» ´ã°í ÀÖ´Â ¶óÀ̺귯¸®ÀÌ´Ù. Á¤Àû ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÒ ¶§, ½Éº¼ ÇØ¼®°úÁ¤ÀÌ ¾î¶»°Ô ÀÌ·ç¾îÁö³ª º¸¸é, ¸µÄ¿´Â Ä¿¸Çµå ¶óÀο¡¼ ÀÔ·ÂÀ¸·Î ¹ÞÀº Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵé°ú ¾ÆÄ«À̺êµéÀ» ¿ÞÂÊ¿¡¼ ¿À¸¥ÂÊÀ¸·Î ½ºÄµÇÑ´Ù. ÀÌ·¯ÇÑ ½ºÄµ °úÁ¤Áß¿¡, ¸µÄ¿´Â ¼¼°¡ÁöÀÇ ÁýÇÕÀ» À¯ÁöÇÑ´Ù. ¸ÕÀú, Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀÌ ½ÇÇà °¡´ÉÇÑ ÆÄÀÏÀÇ »óÅ·Πµé¾î°£ ÁýÇÕ O; ¾ÆÁ÷ ÇØ¼®µÇÁö ¾ÊÀº ½Éº¼µéÀ» ´ã°í ÀÖ´Â ÁýÇÕ U, ÀÌÀüÀÇ ÀÔ·Â ÆÄÀÏ¿¡¼ Á¤ÀÇµÈ ½Éº¼À» ´ã°í ÀÖ´Â ÁýÇÕ D°¡ ±×°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÁýÇÕµéÀº Ãʱ⿡ ºñ¿öÁø »óÅÂÀÌ´Ù.
À§ÀÇ ÀÏ·ÃÀÇ ¼ø¼¶§¹®¿¡ Ä¿¸Çµå ¶óÀο¡¼ Á¤Àû ¶óÀ̺귯¸®°¡ ³¡¿¡ ¿Â´Ù. ¶ÇÇÑ ¶óÀ̺귯¸®µé »çÀÌ¿¡ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¼øÈ¯ÀûÀÎ ÀÇÁ¸¼ºµµ ÁÖÀDZí°Ô »ìÆì¾ßÇÑ´Ù. ÀÔ·ÂÀ¸·Î ÁÖ¾îÁö´Â ¶óÀ̺귯¸®µéÀº ¼ø¼´ë·Î ÁÖ¾îÁ®¼ ¾ÆÄ«À̺êÀÇ ¸â¹öµéÀÌ ÂüÁ¶ÇÒ ¼ö ÀÖµµ·Ï ÇØ¾ßÇϸç, Á¤ÀÇµÈ ÇϳªÀÇ ½Éº¼Àº µÚµû¸£´Â Ä¿¸Çµå ¶óÀÎÀÇ ÀԷ¿¡ ÀÇÇØ ÂüÁ¶µÇ¾î¾ß ÇÑ´Ù. ¸¸¾à ÇØ¼®ÀÌ ¾ÈµÈ ½Éº¼ÀÌ ÀÖ°í, ±× ½Éº¼ÀÌ ¿©·¯ Á¤Àû ¶óÀ̺귯¸®µé³»¿¡¼ Á¤ÀǵǾî ÀÖÀ¸¸é, Ä¿¸Çµå ¶óÀο¡¼ óÀ½¿¡ ÁÖ¾îÁø ¶óÀ̺귯¸®¿¡ Á¤ÀÇµÈ °ÍÀ» ¹Þ¾ÆµéÀδÙ. 7. Àç¹èÄ¡(Relocation)¸µÄ¿°¡ ¸ðµç ½Éº¼À» ÇØ¼®ÇÏ°í ³ª¸é, ½Éº¼ ÂüÁ¶´Â ¿ÀÁ÷ ÇϳªÀÇ ½Éº¼ Á¤ÀǸ¸À» °¡Áö°Ô µÈ´Ù. ±× ¶§, ¸µÄ¿´Â ¾Æ·¡ µÎ ½ºÅÜÀ¸·Î ±¸¼ºµÈ Àç¹èÄ¡ ÀÛ¾÷À» ÇϰԵȴÙ.
¾î¼Àºí·¯°¡ ÇØ¼®¾ÈµÈ ½Éº¼µéÀ» ¸¸³¯ ¶§¸¶´Ù, ¾î¼Àºí·¯´Â ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ .rel.text/.rel.data ¼½¼Ç¿¡ ÇØ¼®¾ÈµÈ ½Éº¼µéÀ» À§ÇÑ Àç¹èÄ¡ Ç׸ñÀ» »ý¼ºÇÑ´Ù. ÀÌ·¯ÇÑ Àç¹èÄ¡ Ç׸ñÀº ÇØ¼®¾ÈµÈ ½Éº¼µéÀÌ ¾î¶»°Ô ÇØ¼®µÇ¾î¾ß ÇÏ´ÂÁö¿¡ ´ëÇÑ Á¤º¸µéÀ» ´ã°í ÀÖ´Ù. ÀüÇüÀûÀÎ ELF Àç¹èÄ¡ Ç׸ñÀº ´ÙÀ½°ú °°Àº ¸â¹öµé·Î ±¸¼ºµÈ´Ù.
¸µÄ¿´Â Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ¸ðµâµé ¾È¿¡ ÀÖ´Â ¸ðµç Àç¹èÄ¡ ¿£Æ®¸®¿¡ ´ëÇØ ÀÌ ÀÛ¾÷À» ¹Ýº¹ÇÏ°í ±×°ÍµéÀÇ Å¸ÀÔ¿¡ µû¶ó ÇØ¼®¾ÈµÈ ½Éº¼µéÀ» Àç¹èÄ¡ÇÑ´Ù. R_386_PC32´Â Àç¹èÄ¡ ÁÖ¼Ò¸¦ S+A-P·Î °è»êÇϸç, R_386_32´Â S+A·Î °è»êÇÑ´Ù. ÀÌ °è»ê¿¡¼, S´Â Àç¹èÄ¡ Ç׸ñÀÇ ½Éº¼Ç׸ñ¿¡ µé¾îÀÖ´Â °ªÀ» °¡¸®Å°¸ç, P´Â ¼½¼Ç ¿É¼Â ȤÀº Àç¹èÄ¡µÇ´Â ÀúÀåÀåÄ¡ÀÇ ÁÖ¼Ò¸¦ ³ªÅ¸³½´Ù (Àç¹èÄ¡ Ç׸ñÀÇ ¿É¼Â°ªÀ¸·ÎºÎÅÍ °è»êµÈ´Ù). ±×¸®°í A´Â Àç¹èÄ¡ °¡´ÉÇÑ Çʵ带 °è»êÇϴµ¥ ÇÊ¿äÇÑ ÁÖ¼ÒÀÌ´Ù. 1. µ¿Àû ¸µÅ·: °øÀ¯ ¶óÀ̺귯¸®À§ÀÇ Á¤Àû ¶óÀ̺귯¸®´Â ¸î°¡Áö Áß¿äÇÑ ´ÜÁ¡µéÀ» Áö´Ï°í ÀÖ´Ù; ¿¹·Î, 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 Äڵ带 °¡Áö°í ÀÖ°í ´ÙÀ½°ú °°ÀÌ µ¿ÀÛÇÑ´Ù.
¸¶Áö¸·À¸·Î, µ¿Àû¸µÄ¿´Â Á¦¾î±ÇÀ» ÀÀ¿ëÇÁ·Î±×·¥À¸·Î ³Ñ±ä´Ù. À̶§ºÎÅÍ °øÀ¯ ¿ÀºêÁ§Æ®´Â ¸Þ¸ð¸®¿¡ °íÁ¤µÇ°Ô µÈ´Ù. 2. ÀÀ¿ë ÇÁ·Î±×·¥À¸·ÎºÎÅÍ µ¿Àû ¶óÀ̺귯¸® ·Îµùµ¿Àû ¶óÀ̺귯¸®µéÀº ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ°í ÀÖ´Â Áß¿¡µµ ·ÎµåµÉ ¼ö ÀÖ´Ù. ÀÀ¿ë ÇÁ·Î±×·¥Àº °øÀ¯ ¶óÀ̺귯¸®µéÀ» ÀڽŰú ¸µÅ·ÇÏÁö ¾Ê¾Æµµ, µ¿Àû¸µÄ¿¿¡°Ô ¿äûÇÏ¿© °øÀ¯ ¶óÀ̺귯¸®µéÀ» ·ÎµåÇÏ°í ¸µÅ·½Ãų ¼ö ÀÖ´Ù. ¸®´ª½º¿Í ¼Ö¶ó¸®½º ±×¸®°í ´Ù¸¥ ½Ã½ºÅ۵鿡¼´Â À̸¦ À§ÇØ µ¿ÀûÀ¸·Î °øÀ¯ ¿ÀºêÁ§Æ®µéÀ» ·ÎµåÇÒ ¼ö ÀÖ´Â ¸î°¡Áö Á¾·ùÀÇ ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. ¸®´ª½º¿¡¼´Â °øÀ¯ ¿ÀºêÁ§Æ®¸¦ ¿ ¼ö ÀÖ´Â dlopen; °øÀ¯ ¿ÀºêÁ§Æ®ÀÇ ½Éº¼ Å×À̺íÀ» º¼ ¼ö ÀÖ´Â dlsym, °øÀ¯ ¿ÀºêÁ§Æ®¸¦ ´ÝÀ» ¼ö ÀÖ´Â dlclose¿Í °°Àº ½Ã½ºÅÛ ÄÝÀ» Á¦°øÇϸç, À©µµ¿ìÁî¿¡¼´Â LoadLibrary¿Í GetProcAddress¿Í °°Àº ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. ¿ÀºêÁ§Æ® ÆÄÀϵéÀ» Á¶ÀÛÇÒ ¼ö ÀÖ´Â Åøµé ¿©±â¿¡ ¿ÀºêÁ§Æ® ÆÄÀϵé°ú ½ÇÇàÆÄÀϵéÀ» Á¶»çÇÒ ¼ö ÀÖ´Â ÅøµéÀÇ ¸ñ·ÏÀÌ ÀÖ´Ù.
|
Alimony and bribes will engage a large share of your wealth. |











