· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Linuxdoc Sgml/Program-Library-HOWTO

You are not allowed to 'edit'


ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ÇÏ¿ìÅõ

ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ÇÏ¿ìÅõ

David A. WheelerÁöÀ½

¹öÀü 0.60, 2000³â 4¿ù 27ÀÏ ¹ø¿ª : Ȳ Áø Èñ( jeenee@soback.kornet.net) 2000³â 5¿ù
ÀÌ ÇÏ¿ìÅõ ¹®¼­´Â ÇÁ·Î±×·¡¸Ó°¡ ¾î¶»°Ô ¸®´ª½ºÈ¯°æ¿¡¼­ ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ¸¦ »ý¼ºÇÏ°í »ç¿ëÇÒ¼ö ÀÖ´ÂÁö¸¦ ´Ù·ç°í ÀÖÀ¸¸ç ¶óÀ̺귯¸®¿¡´Â Á¤Àû ¶óÀ̺귯¸®, °øÀ¯ ¶óÀ̺귯¸® ¹× µ¿Àû(DL) ¶óÀ̺귯¸®°¡ ÀÖ´Ù.

1. °³¿ä

ÀÌ ÇÏ¿ìÅõ ¹®¼­´Â ÇÁ·Î±×·¡¸Ó°¡ ¾î¶»°Ô GNUÀÇ Åø¼ÂÀ» ÀÌ¿ëÇÏ¿© ¸®´ª½º¿¡ ¼­ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¸¦ »ý¼ºÇÏ°í ÀÌ¿ëÇÒ¼ö ÀÖ´ÂÁö¸¦ ´Ù·é´Ù. ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¶õ ´Ü¼øÇÏ°Ô º¸¸é ³ªÁß¿¡ ¾î¶² ÇÁ·Î±×·¥ Äڵ忡 ³¢¿ö³Ö¾îÁú¼ö ÀÖ´Â ÄÄ ÆÄÀÏµÈ ÄÚµå(±×¸®°í µ¥ÀÌÅÍ)°¡ µé¾îÀÖ´Â ÆÄÀÏÀ̸ç, À̸¦ ÅëÇؼ­ ÇÁ·Î±×·¥µéÀº ´õ¿í ¸ðµâÈ­µÉ¼ö ÀÖÀ¸¸ç, ÀçÄÄÆÄÀÏÀÌ ºü¸£¸ç, °»½ÅÀÌ ¿ëÀÌÇØÁø´Ù. ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â Á¤Àû, °øÀ¯, µ¿Àû(DL) ¶óÀ̺귯¸®ÀÇ ¼¼°¡Áö ÇüÅ·Π´ëº°µÈ´Ù. ¸ÕÀú ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±âÀü¿¡ ¹Ì¸® ½ÇÇàÇÁ·Î±×·¥¿¡ ¼³Ä¡µÇ´Â Á¤Àû ¶óÀ̺귯¸®°¡ ´Ù·ç¾î Áú°ÍÀ̸ç, ±× ´ÙÀ½Àº ÇÁ·Î±×·¥ ½ÃÀ۽ÿ¡ ÀûÀçµÇ¾î ¿©·¯ ÇÁ·Î±× ·¥¿¡ ÀÇÇØ °øÀ¯µÇ´Â °øÀ¯ ¶óÀ̺귯¸®, ±×¸®°í ¸¶Áö¸·À¸·Î ÇÁ·Î±×·¥ ½ÇÇàÁßÀÇ ¾î¶² ¼ø°£¿¡µµ ÀûÀç ¹× »ç¿ëÀÌ °¡´ÉÇÑ µ¿Àû ¶óÀ̺귯¸®¸¦ ´Ù·ê °ÍÀÌ´Ù. µ¿Àû ¶óÀ̺귯¸®¸¦ ´Ù¸¥ ¾î¶² ÇÑ ¶óÀ̺귯¸®ÀÇ Æ÷¸ËÀ̶ó°í º¸±â´Â ¾î·Á¿ï °ÍÀÌ ´Ù.(Á¤Àû ¶óÀ̺귯¸®ÀÌ°Ç °øÀ¯ ¶óÀ̺귯¸®ÀÌ°Ç ¸ðµÎ µ¿Àû ¶óÀ̺귯¸®·Î »ç¿ë °¡´ÉÇÔ) ´ë½Å µ¿Àû ¶óÀ̺귯¸®°¡ ´Ù¸¥Á¡Àº ±×°ÍÀÌ ÇÁ·Î±×·¡¸Ó¿¡ ÀÇÇؼ­ ÀÌ¿ë µÇ´Â ¹æ½Ä¿¡ ÀÖ´Â °ÍÀÌ´Ù. ÀÌ Ã¥ÀÇ ´Ù¸¥ Àå¿¡´Â ±×°ÍÀÇ ¿¹µé°ú Âü°íÇÒ ¸¸ÇÑ ¹® ÇåµéÀ» ½ÇÀ» °ÍÀÌ´Ù.

ÀÌ Ã¥Àº ÀÌÁ¦´Â ´ëºÎºÐÀÇ ¸®´ª½º ¹èÆ÷º»¿¡¼­ »ç¿ëµÇ´Â ELF Æ÷¸ËÀÇ ½ÇÇà ÇÁ·Î±×·¥°ú ¶óÀ̺귯¸®¸¸À» ´Ù·ê °ÍÀÌ´Ù. GNUÀÇ gcc Åø¼ÂÀº ELF¿Ü¿¡ ´Ù¸¥ ÇüÅÂÀÇ ¶óÀ̺귯¸®µµ ´Ù·ê¼ö Àִµ¥ ¾ÆÁ÷µµ ´ëºÎºÐÀÇ ¸®´ª½º ¹èÆ÷ÆÇÀº ÀÌ¹Ì Åð¹°ÀÌµÈ a.outÇüÀÇ Æ÷¸ËÀ» ´Ù·ç°í´Â ÀÖ´Ù, ÇÏÁö¸¸ ÀÌ°ÍÀº ÀÌÃ¥ÀÇ ¹üÀ§¸¦ ¹þ ¾î³­ ¾ê±âÀÌ´Ù.

¾î¶² »ç¶÷µéÀº µ¿Àû ¸µÅ© ¶óÀ̺귯¸®(DLL)¶õ ¿ë¾î¸¦ »ç¿ëÇÏ¿© °øÀ¯ ¶óÀ̺귯¸®¸¦ ĪÇϱ⵵ ÇÏ°í, ¶§·Ð Á¤ÀûÀÌ°Ç °øÀ¯°Ç µ¿Àû ¶óÀ̺귯¸®·Î »ç¿ëµÉ ¶§ DLLÀ̶ó ĪÇϱ⵵ ÇÏ°í ¶Ç, ¶§·Î´Â À§ÀÇ µÎ Á¶°ÇÀ» ¸ðµÎ ¸¸Á·ÇÒ ¶§ DLLÀ̶õ ¿ë¾î¸¦ ¾²±âµµ Çϳª ÀÌ°ÍÀº º°·Î Áß¿äÇÑ ¾ê±â°¡ ¾Æ´Ï´Ù. À̹®¼­´Â ´ç½ÅÀÌ ¾î ¶² Àǹ̸¦ ¼±ÅÃÇÏ°Ç°£¿¡ ¸®´ª½º¿¡¼­ÀÇ DLLÀ» ´Ù·ïÁÙ °ÍÀÌ´Ù.

¸¸¾à ¿©·¯ ½Ã½ºÅÛ¿¡ Æ÷Æõɼö ÀÖ´Â ÇÁ·Î±×·¥À» °³¹ßÇÏ·Á ÇÑ´Ù¸é LINUX ToolÀ» ¹Ù·Î »ç¿ëÇÏ´Â °Í º¸´Ù´Â GNU LibtoolÀÇ »ç¿ëÀ» °í·ÁÇØ º¸±æ ¹Ù¶õ´Ù. GNU LibtoolÀº °øÀ¯ ¶óÀ̺귯¸®ÀÇ »ç¿ë(»ý¼º°ú ¼³Ä¡µî)ÀÇ º¹À⼺À» ÀÏ°üµÇ°í À̽ÄÀûÀÎ ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ­ Á¦°ÅÇØÁÖ´Â ÀüÇüÀûÀÎ ¶óÀ̺귯¸® Áö¿ø ½ºÅ©¸³ Æ®ÀÌ´Ù. ¸®´ª½º¿¡¼­ GNU LibtoolÀº ToolµéÁß¿¡¼­ ÃÖ»óÀ§¿¡ ±¸ÇöµÇ¾î ÀÖÀ¸¸ç ±× »ç¿ë°ü·Êµµ ÀÌ ÇÏ¿ìÅõ ¹®¼­¿¡ ±â¼úµÇ¾îÀÖ´Ù. DL ¶óÀ̺귯¸®ÀÇ À̽İ¡´É ÇÑ ÀÎÅÍÆäÀ̽º ±¸ÇöÀ» À§Çؼ­´Â ¿©·¯°¡Áö À̽ļº ±¸ÇöÀåÄ¡°¡ ÀÖÀ¸¸ç ±× Áß GNU Libtool Àº "Libltdl" ÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ´Ù¸¥ ¼±ÅÃÀ¸·Î´Â glib ¶óÀ̺귯¸® (glibc¿Í È¥µ¿ÇÏÁö¸»°Í)ÀÇ µ¿Àû ¸ðµâ ÀûÀçÀÇ À̽ļºÁö¿ø±â´ÉÀ» »ç¿ëÇÒ¼ö ÀÖ´Ù. ±×°ÍÀ» »ç¿ëÇÏ·Á ÇÑ´Ù¸é ÀÌ ¹®¼­¸»°í [10] developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html ¿¡¼­ º¸±æ ¹Ù¶õ´Ù. ´Ù½Ã Çѹø ¸» Çϰǵ¥ ¸®´ª½º¿¡¼­ ¶óÀ̺귯¸®ÀÇ »ç¿ë¿¡ °üÇÑ Á¦¹Ý ±â´ÉµéÀÇ ±¸ÇöÀÌ ÀÌ ¹®¼­ ¿¡¼­ ±â¼úµÉ °ÍÀÌ¸ç ¸®´ª½º¿ë Äڵ带 °³¹ßÁßÀ̰ųª µð¹ö±ë ÁßÀ̶ó¸é À̹®¼­ÀÇ ³»¿ëÀÌ À¯¿ëÇÒ°ÍÀÌ´Ù. ÀÌ ÇÏ¿ìÅõ ¹®¼­ÀÇ ¸ÞÀÎÁÖ¼Ò´Â [11] www.dwheeler.com/program-library À̸ç LDP([12] http://www.linuxdoc.org)¿¡ Á¦°øµÈ´Ù. ÀúÀÛ±ÇÀÚ´Â David A. WheelerÀ̸ç GPLÀÇ ¶óÀ̼¾½º¸¦ µû¸¥´Ù.

2. Á¤Àû ¶óÀ̺귯¸®

Á¤Àû ¶óÀ̺귯¸®´Â ´ÜÁö Åë»óÀÇ ¿ÀºêÁ§Æ® È­ÀÏÀ» ¸ðÀº°ÍÀÌ´Ù. Åë»óÀûÀ¸·Î Á¤ Àû ¶óÀ̺귯¸®´Â .a¶ó´Â Á¢¹Ì¾î·Î ³¡³­´Ù. ÀÌ ¿ÀºêÁ§Æ® ÁýÇÕÀº ar(archiver) ÇÁ·Î±×·¥¿¡ ÀÇÇؼ­ »ý¼ºµÈ´Ù. Á¤Àû ¶óÀ̺귯¸®´Â °øÀ¯ ¶óÀ̺귯¸®°¡ °¡Áö´Â Àå Á¡µé ¶§¹®¿¡ ÀÌÁ¦´Â ¿¾³¯Ã³·³ ±×·¸°Ô ¸¹ÀÌ »ç¿ëµÇ¾î ÁöÁö´Â ¾Ê´Â´Ù. ±×·¸Áö¸¸ ¾ÆÁ÷µµ »ç¿ëµÇ¾î Áö°í ÀÖ°í ¿ª»çÀûÀ¸·Î °¡Àå¸ÕÀú Á¸ÀçÇß°í ¼³¸íÀÌ °£´ÜÇÏ´Ù. Á¤Àû ¶óÀ̺귯¸®´Â ÀçÄÄÆÄÀϾøÀÌ ÇÁ·Î±×·¥¿¡ ¸µÅ©µÉ¼ö Àֱ⠶§¹®¿¡ ÀçÄÄÆÄÀÏ ¿¡ ÇÊ¿äÇÑ ½Ã°£ÀÌ Àý¾àµÉ¼ö ÀÖ´Ù. ¿äÁòÀº ÄÄÇ»ÅÍÀÇ ºü¸¥ ½ÇÇà½Ã°£¶§¹®¿¡ ÀÌ·± ÀçÄÄÆÄÀÏ¿¡ µå´Â ½Ã°£ Àý¾àÀº ¿¾³¯Ã³·³ ±×·¸°Ô Áß¿äÇÑ ÀÌÀ¯°¡ µÉ¼ö´Â ¾øÀ» °ÍÀÌ´Ù. Á¤Àû ¶óÀ̺귯¸®´Â °³¹ßÀÚµéÀÌ ¼Ò½ºÄÚµåÀÇ Àç°ø¾øÀÌ ÇÁ·Î±×·¡¸Óµé·Î ÇÏ¿©±Ý ¸µÅ©ÇÏ¿© »ç¿ëÇϵµ·Ï ÇÒ¶§´Â °¡²û¾¿ À¯¿ëÇÑ °ÍÀ̵ȴÙ. (À̶§ ¶óÀ̺귯¸®ÀÇ ÆǸÅÀÚ´Â ÀÌÀÍÀÌÁö¸¸ ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÏ°íÀÚ ÇÏ´Â ÇÁ·Î±×·¡¸Óµé¿¡°Ô ´Â À¯¿ëÇÑ°ÍÀÌ ¾Æ´Ï´Ù.) À̷лóÀ¸·Î ½ÇÇàÆÄÀÏ¿¡ ¸µÅ©µÇ´Â Á¤Àû ELF ¶óÀ̺귯¸® ÄÚµå´Â 1-5%Á¤µµ »¡¸® ¼öÇàµÇ¾îÁ®¾ßÇϳª ½ÇÁ¦¿¡ À־´Â ´Ù¸¥ ¿©·¯°¡Áö º¹ÇÕÀûÀÎ ÀÌÀ¯·Î ÀÎÇÏ¿© ÀÌ·± ¿¹´Â Àß ¸ÂÁö ¾Ê´Â°Í °°´Ù.

Á¤Àû ¶óÀ̺귯¸®¸¦ »ý¼ºÇϰųª ±âÁ¸ÀÇ Á¤Àû ¶óÀ̺귯¸®¿¡ ºÎ°¡Àû ¿ÀºêÁ§Æ® ÆÄÀÏÀ» Ãß°¡ÇÒ °æ¿ì ´ÙÀ½ÀÇ ¸í·ÉÀ» »ç¿ëÇÑ´Ù.

ar rcs my_library.a file1.o file2.o À§ÀÇ ¿¹ÀÇ ¸í·ÉÀº file1.o file2.o¶ó´Â ¿ÀºêÁ§Æ® ÆÄÀÏÀ» mylibrary.a¿¡ Ãß°¡ÇÏ °Å³ª Á¸ÀçÇÏÁö ¾ÊÀ»°æ¿ì ÀÌ ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. Á¤Àû ¶óÀ̺귯¸® »ý¼º°ú °ü·ÃÇÑ ´õ ÀÌ»óÀÇ Á¤º¸´Â ar(1)À» º¸±â ¹Ù¶õ´Ù.

Á¤Àû ¶óÀ̺귯¸®¸¦ ´ç½ÅÀÌ ¸¸µé¾ú´Ù¸é »ç¿ëÇϱ⸦ ¿øÇÒ °ÍÀÌ´Ù. À̸¦ »ç¿ëÇÏ ·Á¸é ½ÇÇà ÇÁ·Î±×·¥À» »ý¼ºÇϱâ À§ÇÑ ÄÄÆÄÀÏ°ú ¸µÅ©°úÁ¤ÀÇ ÇÑ ºÎºÐ¿¡ ÀÌ ÆÄ ÀÏÀ» Æ÷ÇÔ½ÃÅ°¸é µÈ´Ù. ¸¸¾à¿¡ gcc(1)À» »ç¿ëÇÏ¿© ½ÇÇàÆÄÀÏÀ» ¸¸µç´Ù¸é -l ¿É ¼ÇÀ» »ç¿ëÇÏ¿© ´ç½ÅÀÌ ¸¸µç ¶óÀ̺귯¸®¸¦ ¸í½ÃÇÏ¸é µÈ´Ù. (info:gccÀ» ÂüÁ¶ÇÏ ¸é ´õ ¸¹Àº Á¤º¸¸¦ ¾òÀ»¼ö ÀÖÀ½). ¸µÄ¿ÀÎ ld(1)¸¦ ¹Ù·Î »ç¿ëÇÏ¿©µµ(-l,¶É´À -L ¿É¼Ç) µÇ³ª ld(1)ÀÇ ÀÎÅÍÆäÀ̽º°¡ ÀÚÁÖ º¯ÇϹǷΠgcc(1)À» ¾²´Â °ÍÀÌ ´õ ³ª À» °ÍÀÌ´Ù.

3. °øÀ¯ ¶óÀ̺귯¸®

°øÀ¯ ¶óÀ̺귯¸®¶õ ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÉ ¶§ ÀÌ ÇÁ·Î±×·¥¿¡ ÀÇÇؼ­ ÀûÀçµÇ´Â ¶óÀ̺귯¸®¸¦ ¸»ÇÑ´Ù. ¾î¶² °øÀ¯ ¶óÀ̺귯¸®°¡ ¹Ù¸£°Ô ÀûÀç¾ú´Ù¸é ÀÌÈÄ¿¡ ½ÇÇàµÇ ´Â ¸ðµç ÇÁ·Î±×·¥µéÀº ÀÚµ¿ÀûÀ¸·Î ÀÌ »õ·Î¿î °øÀ¯ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ °ÍÀÌ ´Ù. ½ÇÀç¿¡ À־, ¸®´ª½º¿¡¼­ »ç¿ëµÇ´Â Á¢±Ù¹æ½ÄÀº ¾Æ·¡¿Í °°Àº ±â´ÉµéÀ» Çã ¿ëÇϹǷΠ´õ¿í ź·ÂÀûÀÌ¸ç ¶ÇÇÑ, ¼¼·ÃµÇ°Ô ±â´ÉÇÑ´Ù.

* ¶óÀ̺귯¸®¸¦ °»½ÅÇϸ鼭 ÀÌ ¶óÀ̺귯¸®ÀÇ ±¸¹öÀü Áö¿ø¿ë ¹öÀüÀÌ ¾øÀ̵µ ¿©ÀüÈ÷ ±¸ ¹öÀüÀÇ ¶óÀ̺귯¸®ÀÇ »ç¿ëÀ» ¿øÇÏ´Â ÇÁ·Î±×·¥À» Áö¿øÇÒ¼ö ÀÖ´Ù.

* ƯÁ¤ ÇÁ·Î±×·¥ÀÇ ¼öÇà½Ã ¶óÀ̺귯¸® ¶Ç´Â ½ÉÁö¾î ¶óÀ̺귯¸®ÀÇ Æ¯Á¤ÇÔ¼öÀÇ ¿À¹ö¶óÀ̵ù(´ëÄ¡)ÀÌ °¡´ÉÇÏ´Ù.

* ÀÌ ¸ðµç ±â´ÉÀ» ±âÁ¸ÀÇ ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÏ¿© ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ °¡´ÉÇÏ ´Ù.

°ü ·Ê

°øÀ¯ ¶óÀ̺귯¸®°¡ ÀÌ·¯ÇÑ ±â´ÉµéÀ» Áö¿øÇϱâ À§Çؼ­´Â »ç¿ëÀÚ°¡ ¹Ýµå½Ã µû ¶ó¾ßÇÒ ÀÌ¿ë»óÀÇ ¸î°¡Áö °ü·Ê¿Í °¡À̵å¶óÀÎÀÌ ÀÖ´Ù. ´ç½ÅÀº ÇÑ ¶óÀ̺귯¸®¸¦ ÀÏÄ´ À̸§µéÀÇ Â÷ÀÌ Æ¯È÷ "soname"°ú "real name"À» ±¸º°ÇÒ¼ö ÀÖ¾î¾ßÇÏ ¸ç, (¶ÇÇÑ À̵éÀÌ ¾î¶»°Ô »óÈ£ÀÛ¿ë Çϴ°¡µµ ¾Ë¾Æ¾ß ÇÑ´Ù) ¶ÇÇÑ, ¶óÀ̺귯¸®°¡ ÆÄÀÏ ½Ã½ºÅÛ»óÀÇ ¾îµð¿¡ À§Ä¡ÇØ¾ß Çϴ°¡µµ ¾Ë¾Æ¾ß ÇÑ´Ù.

°øÀ¯ ¶óÀ̺귯¸® À̸§µé

¸ðµç °øÀ¯ ¶óÀ̺귯¸®´Â "soname"À̶ó ºÒ¸®´Â Ưº°ÇÑ À̸§À» °¡Áö°í ÀÖ´Ù. "soname"Àº Á¢µÎ¾î "lib", ¶óÀ̺귯¸® À̸§, ".so"¶ó´Â ¹®±¸, ±× ´ÙÀ½ ¸¶Ä§Ç¥¿Í ÀÎÅÍÆäÀ̽º º¯°æ½Ã Áõ°¡µÇ´Â ¹öÀü ³Ñ¹ö·Î ±¸¼ºµÈ´Ù. ( ¿¹¿Ü·Î °¡Àå Àú¼öÁØÀÇ C¶óÀ̺귯¸®µéÀº "lib"·Î ½ÃÀÛµÇÁö ¾Ê´Â´Ù) ¿ÏÀüÇÑ °ø½ÄÀû "soname"¿¡´Â ¶óÀ̺귯¸®°¡ ¼ÓÇÑ µð·ºÅ丮¸íÀÌ ¾ÕºÎºÐ¿¡ µé¾î°£´Ù. ¿î¿ëÁßÀÎ ½Ã½ºÅÛ¿¡¼­´Â ¿ÏÀü ÇÑ °ø½ÄÀû "soname" À̶õ °øÀ¯¶óÀ̺귯¸®ÀÇ ½ÇÁ¦ À̸§("real name")¿¡ ´ëÇÑ ½Éº¼¸¯ ¸µÅ©(½ÇÁ¦ Äڵ带 ´ã°íÀÖ´Â ÆÄÀÏÀÌ ¾Æ´Ñ)°¡ µÉ °ÍÀÌ´Ù.

¸ðµç °øÀ¯ ¶óÀ̺귯¸®´Â ½ÇÁ¦ ¶óÀ̺귯¸® Äڵ尡 ÀúÀåµÇ¾î ÀÖ´Â ÆÄÀÏÀÇ ÆÄÀÏ ¸íÀÎ "real name"À» ¶ÇÇÑ °¡Áø´Ù. ½ÇÁ¦ ÆÄÀϸíÀº "soname"¿¡ ¸¶Ä§Ç¥¿Í ¸¶ÀÌ³Ê ¹öÀü ³Ñ¹ö, ¸¶Ä§Ç¥ ±×¸®°í ¸±¸®Áî ³Ñ¹ö¸¦ ´õÇÑ °ÍÀÌ´Ù. ¸±¸®Áî ³Ñ¹ö´Â ¼±Åûç Ç×ÀÌ´Ù. ¸¶ÀÌ³Ê ³Ñ¹ö¿Í ¸±¸®Áî ³Ñ¹ö·Î Á¤È®È÷ ¾î¶² ¹öÀüÀÇ ¶óÀ̺귯¸®°¡ ¼³Ä¡ µÇ¾î ÀÖ´ÂÁö ¾Ë°Ô ÇÔÀ¸·Î½á ½Ã½ºÅÛ ±¸¼ºÀ» Á¶ÀýÇÒ¼ö ÀÖ´Ù. ÀÌ ¹øÈ£µéÀº ¶óÀ̺귯¸®¸¦ ±â¼úÇϱâÀ§ÇÑ ¹®¼­È­½Ã¿¡ »ç¿ëµÈ ¹øÈ£¿Í ¸ÂÁö ¾ÊÀ»¼öµµ ÀÖÀ½¿¡ À¯ÀÇÇÏ ¶ó. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ¶óÀ̺귯¸®ÀÇ ¹®¼­È­°¡ ´õ ¿ëÀÌÇØÁø´Ù.

ºÎ°¡ÀûÀ¸·Î ÄÄÆÄÀÏ·¯°¡ ¶óÀ̺귯¸®¸¦ ¿ä±¸ÇÒ ¶§ »ç¿ëÇÏ´Â À̸§ÀÌ Çϳª ´õ Á¸ ÀçÇÑ´Ù.(³ª´Â À̸¦ "linker name"À̶ó ÀÏÄÃÀ» °ÍÀÌ´Ù.) ¿©±â¿¡´Â ¾î¶°ÇÑ ¹öÀü³Ñ ¹öµµ Æ÷ÇÔµÇÁö ¾Ê´Â "soname"ÀÌ ÇØ´çµÈ´Ù. °øÀ¯ ¶óÀ̺귯¸®¸¦ °ü¸®ÇÏ´Â ÇÙ½ÉÀº ÀÌ·¯ÇÑ À̸§µéÀ» Àß ºÐº°ÇÏ´Â °ÍÀÌ´Ù. ÇÁ ·Î±×·¥¿¡¼­ ÇÊ¿äÇÑ °øÀ¯ ¶óÀ̺귯¸®¸¦ ³»ºÎÀûÀ¸·Î Ç¥ÇöÇÒ¶§´Â ±× ¶óÀ̺귯¸® ÀÇ "soname"À» ½á¾ßÇÑ´Ù. ¹Ý´ë·Î ¸¸¾à¿¡ ´ç½ÅÀÌ °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µé¾ú´Ù ¸é ÀÚ¼¼ÇÑ ¹öÀü Á¤º¸¸¦ Æ÷ÇÔÇÑ ½ÇÁ¦ ÆÄÀϸíÀ» ÁÖ¾î¾ß ÇÑ´Ù. ´ç½ÅÀÌ »õ·Î¿î ¹ö ÀüÀÇ ¶óÀ̺귯¸®¸¦ ¼³Ä¡ÇÒ¶§´Â ¸î °³ÀÇ Á¤ÇØÁø µð·ºÅ丮µéÁßÀÇ ÇÑ°÷¿¡ ¼³Ä¡ÇÑ µÚ¿¡ ldconfig¶ó´Â ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¿©¾ß ÇÑ´Ù. ldconfig´Â µð·ºÅ丮¿¡ Á¸ÀçÇÏ ´Â ÆÄÀϵéÀ» Á¡°ËÇÑ µÚ ½ÇÁ¦ ÆÄÀϸíÀÇ ½Éº¼¸¯ ¸µÅ©·Î½á sonameÀ» »ý¼ºÇÏ¸ç µ¿½Ã¿¡ ij½¬ ÆÄÀÏÀÎ /etc/ld.so.cache¸¦ ¼ÂÆÃÇÑ´Ù.

ldconfig´Â linker nameÀ» ¼ÂÆÃÇÏÁö ¾Ê´Â´Ù. ÀÌ°ÍÀº º¸Åë ¶óÀ̺귯¸®ÀÇ ¼³Ä¡ ½Ã¿¡ ¼ÂÆÃÀ» Çϴµ¥, °£´ÜÇÏ°Ô °¡Àå ÃÖ±ÙÀÇ sonameÀ̳ª real name¿¡ ½Éº¼¸¯ ¸µÅ©¸¦ ¸¸µé¸é µÈ´Ù. ´ëºÎºÐÀÇ °æ¿ì ¶óÀ̺귯¸®¸¦ °»½ÅÇÏ°í ÀÚµ¿ÀûÀ¸·Î ¸µÅ©½Ã ¿¡ »ç¿ëÇϱ⸦ ¿øÇÒ°ÍÀ̹ǷΠsoname¿¡ ½Éº¼¸¯ ¸µÅ©Çϱ⸦ ±ÇÀåÇÑ´Ù. H. J. Lu ¿¡°Ô ldconfig°¡ ¿Ö ÀÚµ¿À¸·Î linker nameÀ» ¼ÂÆÃÇÏÁö ¾Ê´À³Ä°í ¹°¾ú´õ´Ï ±× ÀÇ ¼³¸íÀº °¡Àå ÃÖ±ÙÀÇ ¶óÀ̺귯¸®·Î ¸µÅ©½ÃÅ°°í ½ÍÀ»¶§°¡ ÀÖÀ»°ÍÀÌ¸ç ¶ÇÇÑ ÀÌÀü ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ °³¹ßÇϰųªÇÒ ¶§ ±×°ÍÀ» ¸µÅ©ÇÏ·Á ÇÒ ¶§°¡ ÀÖÀ¸¹Ç ·Î ldconfig´Â ¿©·¯ºÐÀÌ ¾î¶² ¶óÀ̺귯¸®¿Í ¸µÅ©ÇÏ°í ½ÍÀºÁö °¡Á¤ÇÏÁö ¾Ê´Â °ÍÀÌ¸ç ±×·¡¼­ ¼³Ä¡ÀÚ´Â ¾î¶² ¶óÀ̺귯¸®°¡ ¸µÅ©µÉ°ÍÀÎÁö¸¦ ¸í½ÃÇØ¾ß ÇÏ´Â°Í À̶ó Çß´Ù.

ÀÌ»óÀÇ ¾ê±â¸¦ Á¾ÇÕÇÑ ¿¹¸¦ µé¾îº¸¸é ldconfig°¡ /usr/lib/libreadline.so.3.0°ú °°Àº real nameÀÇ ½Éº¼¸¯ ¸µÅ©·Î ¼ÂÆÃÇÑ /usr/lib/libreadline.so.3 ÇüÅÂÀÇ ¿Ï ÀüÇÑ °ø½ÄÀû sonameÀÌ ÀÖÀ»°ÍÀ̸ç /usr/lib/libreadline.so.3¿¡ ½Éº¼¸¯ ¸µÅ©µÈ link nameÀ¸·Î½á /usr/lib/libreadline.so°¡ ¶ÇÇÑ ÀÖÀ» °ÍÀÌ´Ù.

ÆÄÀÏ ½Ã½ºÅÛ»óÀÇ À§Ä¡

°øÀ¯ ¶óÀ̺귯¸®´Â ÆÄÀÏ ½Ã½ºÅÛ »óÀÇ Æ¯Á¤À§Ä¡¿¡ Á¸ÀçÇؾßÇÑ´Ù. ¿ÀÇ ¼Ò½º ¼Ò ÇÁÆ®¿þ¾îµéÀº GNUÀÇ Ç¥ÁØÀ» µû¸£´Â °æÇâÀÌ ÀÖÀ¸¸ç ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº info¹® ¼­ÀÇ [13]info:standards#Directory_Variables ºÎºÐÀ» »ìÆ캸±æ ¹Ù¶õ´Ù. GNU Ç¥ ÁØÀº ¼Ò½ºÄÚµåÀÇ ¹èÆ÷½Ã¿¡ ¸ðµç ¶óÀ̺귯¸®¸¦ /usr/local/lib¿¡ ¼³Ä¡ÇÏ±æ ±Ç ÀåÇÑ´Ù(/usr/local/bin¿¡´Â ¸í·ÉµéÀÌ ¸ðÀÓ). GNUÇ¥ÁØÀº ¶ÇÇÑ ÀÌ·¯ÇÑ µðÆúÆ®µé À» ¹«½ÃÇϰųª ¼³Ä¡·çƾÀ» È£ÃâÇÏ´Â ÀýÂ÷ µî¿¡ °üÇÑ °ü·ÊµéÀ» Á¤ÀÇÇÏ°í ÀÖ´Ù. ÆÄÀϽýºÅÛ °èÃþÀû ±¸Á¶Ç¥ÁØ(FHS:File system Hierarchy Standard) ¶ÇÇÑ ¼Ò ½º¹èÆ÷½Ã¿¡ ¾î¶² À§Ä¡¿¡ ¹«¾ùÀ» µÎ¾î¾ß ÇÏ´ÂÁö¿¡ ´ëÇØ ³íÇÏ°í ÀÖ´Ù.( www.pathname.com/fhs ¸¦ ÂüÁ¶Çϱ⠹ٶ÷). FHS¿¡¼­´Â ´ëºÎºÐÀÇ ¶óÀ̺귯¸®¸¦ /usr/lib¿¡ ¼³Ä¡ÇÒ °ÍÀ» ±ÇÀåÇÑ´Ù, ±×·¯³ª ½Ã½ºÅÛ ½ÃÀ۽à ÇÊ¿äÇÑ ¶óÀ̺귯¸®´Â /lib¿¡ ¶ÇÇÑ, ºñ½Ã½ºÅÛ ¶óÀ̺귯¸®´Â /usr/local/lib¿¡ ¼³Ä¡µÇ¾î¾ß ÇÑ´Ù.

À§ÀÇ µÎ Ç¥ÁØÀÌ ¼­·Î ¸ð¼øµÇ´Â µí º¸ÀÌÁö¸¸ ½ÇÁ¦·Î ±×·¸Áö´Â ¾Ê´Ù. GNUÀÇ Ç¥ÁØÀº ¼Ò½ºÄÚµåÀÇ °³¹ßÀÚ¸¦ À§ÇÑ µðÆúÆ®°ªÀ» Á¦¾ÈÇÏ´Â °ÍÀÌ°í, FHS´Â ¼Ò½º ÀÇ ¹èÆ÷ÀÚ(½Ã½ºÅÛÀÇ µðÆúÆ® ¼Ò½ºÄڵ带 ¼±ÅÃÀûÀ¸·Î ±× ½Ã½ºÅÛÀÇ ÆÐÅ°Áö °ü¸® µµ±¸¸¦ ÅëÇؼ­ ´ëÄ¡½ÃÅ°´Â)¸¦ À§ÇÑ µðÆúÆ®°ªÀ» Á¦¾ÈÇÏ´Â °ÍÀÌ´Ù. ½ÇÁ¦·Î ÀÌ°Í Àº »ó´çÈ÷ È¿°úÀûÀÎ °ÍÀÌ´Ù, Áï, ´ç½ÅÀÌ ´Ù¿î·ÎµåÇÑ °¡Àå ÃÖ½ÅÀÇ(¹ö±×ÀÇ °¡´É ¼ºÀÌ ÀÖ´Â) ¼Ò½ºÄÚµå´Â ÀÚµ¿ÀûÀ¸·Î ·ÎÄà µð·ºÅ丮ÀÎ /usr/local¿¡ ¼³Ä¡µÉ°ÍÀÌ¸ç ±× Äڵ尡 ÀÌÁ¦ ¿Ïº®ÇØÁö¸é ÆÐÅ°Áö ¸Å´ÏÀú¸¦ ÀÌ¿ëÇÏ¿© ½Ã½ºÅÛ¿¡ ¼³Ä¡µÈ µð ÆúÆ®(¶óÀ̺귯¸®)¸¦ ´ëÄ¡ÇÏ°í ¹èÆ÷½ÃÀÇ Ç¥ÁØ µð·ºÅ丮·Î ¼³Ä¡ÇÒ¼ö ÀÖ´Â °ÍÀÌ ´Ù. ¶óÀ̺귯¸®¸¦ ÅëÇؼ­¸¸ È£Ãâ°¡´ÉÇÑ ÇÁ·Î±×·¥µéÀ» ¶óÀ̺귯¸®°¡ È£ÃâÇÏ´Â °æ¿ì¿¡´Â ¹Ýµå½Ã ±× ÇÁ·Î±×·¥µéÀ» usr/local/libexec(¹èÆ÷º»¿¡¼­´Â /usr/libexec ÀÓ)¿¡ µÎ¾î¾ßÇÔÀ» ¸í½ÉÇ϶ó. ÇÑ°¡Áö È¥µ¿Àº ·¹µåÇÞÀÇ ¹èÆ÷º»µéÀº ¶óÀ̺귯¸®¸¦ ã´Â °úÁ¤¿¡¼­ /usr/local µð·ºÅ丮¸¦ Á¦¿Ü ½ÃŲ´Ù´Â °ÍÀε¥, ¾Æ·¡¿¡¼­ ³íÀÇ µÉ /etc/so.confºÎºÐÀ» Âü°íÇÏ±æ ¹Ù¶õ´Ù. ±×¿Ü¿¡ ¶Ç´Ù¸¥ ÇϳªÀÇ Ç¥ÁØ ¶óÀ̺귯¸® µð·ºÅ丮°¡ Àִµ¥ X-À©µµ¿ì ½Ã½ºÅÛÀÌ »ç¿ëÇÏ´Â /usr/X11R6/libÀÌ ±× °ÍÀÌ´Ù. /lib/security µð·ºÅ丮´Â PAM¸ðµâ¿¡¼­ »ç¿ëµÊ¿¡ À¯ÀÇÇ϶ó. ÀÌ µð·º Å丮´Â Åë»ó µ¿Àû ¶óÀ̺귯¸®·Î½á ÀûÀçµÈ´Ù.(¿ª½Ã µÞºÎºÐ¿¡¼­ ³íÀǵɰÍÀÓ)

¶óÀ̺귯¸®´Â ¾î¶»°Ô »ç¿ëµÇ´Â°¡

¸ðµç ¸®´ª½º ½Ã½ºÅÛÀÌ Æ÷ÇԵǴ GNUÀÇ glibc-±â¹ÝÀÇ ½Ã½ºÅÛÀº ELF ÀÌÁø ½Ç Çà ÇÁ·Î±×·¥ÀÇ ½ÃÀ۽ÿ¡ ÀÚµ¿ÀûÀ¸·Î ÇÁ·Î±×·¥ ·Î´õ¸¦ ÀûÀçÇÏ°í ½ÇÇà½ÃŲ´Ù. ¸®´ª½º ½Ã½ºÅÛ¿¡¼­ ÀÌ ·Î´õ´Â /lib/ld-linux.so.X(X´Â ¹öÀü ³Ñ¹öÀÓ)À̶ó ºÒ¸®¿ö Áö¸ç ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÇ´Â ¸ðµç °øÀ¯ ¶óÀ̺귯¸®¸¦ Â÷·Ê´ë·Î ã¾Æ¼­ ÀûÀç½Ã Ų´Ù.

Ž»öµÇ¾îÁú µð·ºÅ丮ÀÇ ¸ñÂ÷´Â /etc/ld.so.conf¿¡ µé¾î ÀÖ´Ù. ·¹µåÇÞ¿¡ ±â¹ÝÇÑ ¹èÆ÷º»¿¡´Â ÀϹÝÀûÀ¸·Î /usr/local/lib°¡ /etc/ld.so.confÆÄÀÏ¿¡ µé¾î ÀÖÁö¾ÊÀºµ¥ ÀúÀÚ°¡ »ý°¢Çϱâ·Î ÀÌ°ÍÀº ÀÏÁ¾ÀÇ ¹ö±×°¡ ¾Æ´Ñ°¡ »ý°¢ÇÑ´Ù. ·¹µåÇÞÀÇ °æ¿ì /usr/local/libÀ» /etc/ld.so.conf¿¡ ÷°¡ÇÏ´Â °ÍÀº ¸¹Àº ÇÁ·Î±×·¥µéÀ» ¼öÇà½ÃÅ° ±âÀ§ÇØ ÈçÈ÷ ÀÖ´Â ¼öÁ¤ÀÛ¾÷ÀÌ´Ù.

¸¸¾à ¶óÀ̺귯¸®³»ÀÇ Æ¯Á¤ÇÑ ÇÔ¼ö¸¸À» ´ëÄ¡½ÃÅ°°í ³ª¸ÓÁö´Â ±×´ë·Î À¯ÁöÇÏ·Á ÇÒ¶§´Â ´ëÄ¡½Ãų ¶óÀ̺귯¸®(.oÆÄÀϵé)µéÀ» /etc/ld.so.preload ÆÄÀÏ¿¡ ¸í½ÃÇÏ¸é µÇ´Âµ¥ ÀÌ·¯ÇÑ ÇÁ¸®·Îµå ¶óÀ̺귯¸®µéÀº Ç¥ÁØÀûÀÎ ÇÔ¼öº¸´Ù ¿ì¼±±ÇÀ» °¡Áö°Ô µÈ´Ù. ÀÌ·¯ÇÑ ÇÁ¸®·Îµù ÆÄÀϵéÀº º¸Åë ÀÀ±Þ ÆÐÄ¡º»¿¡¼­ »ç¿ëµÇ´Âµ¥ Á¤»óÀû ¹èÆ÷º»¿¡´Â Àß Æ÷ÇÔµÇÁö ¾Ê´Â´Ù.

¸Å ÇÁ·Î±×·¥ÀÇ ½ÃÀ۽ø¶´Ù ÀÌ ¸ðµç µð·ºÅ丮µéÀ» Ž»öÇÏ´Â °ÍÀº Àü¹ÝÀûÀ¸·Î ¸Å¿ì ºñÈ¿À²ÀûÀ̱⠶§¹®¿¡ ½ÇÁ¦ÀûÀ¸·Î´Â ij½¬°¡ »ç¿ëµÈ´Ù. ldconfig ÇÁ·Î ±×·¥Àº Åë»ó /etc/ld.so.conf¸¦ Àо ¸ðµç ÇÊ¿äÇÑ µ¿Àû ¸µÅ© µð·ºÅ丮µé·ÎºÎ ÅÍ Àû´çÇÑ ½Éº¼¸¯ ¸µÅ©¸¦ »ý¼ºÇÑ´Ù.(±×·¡¼­ À̸§ »ç¿ëÀÇ ±ÔÄ¢À» Àß µû¶ó¾ß ÇÑ´Ù) ±× ´ÙÀ½À¸·Î /etc/ld.so.cache ¿¡ ÀÌ ³»¿ëµéÀ» ±â·ÏÇϸç ÀÌ ´ÙÀ½ ºÎÅÍ ´Â ÇÁ·Î±×·¥µéÀÌ ÀÌ ÆÄÀÏÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô Çؼ­ ¶óÀ̺귯¸®ÀÇ ¾×¼¼ ½º ¼Óµµ´Â »ó´çÈ÷ Çâ»óµÇ´Â °ÍÀÌ´Ù. À§ÀÇ ³»¿ëÀÌ ÇÔÃàÇÏ´Â ¹Ù´Â DLLÀÌ Ãß°¡ ¶Ç´Â Á¦°ÅµÉ ¶§, ¶Ç´Â DLLÀÇ µð·ºÅ丮°¡ º¯°æµÉ¶§´Â ¹Ýµå½Ã ldconfig°¡ ½ÇÇàµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀ̸ç, ±×·¡¼­ ÆÐÅ°Áö ¸Å´ÏÀú°¡ ¶óÀ̺귯¸®¸¦ ¼³Ä¡ÇÒ ¶§, ÀÌ °úÁ¤Àº Åë»óÀ¸·Î ¼öÇàµÇ´Â ÀýÂ÷ÀÎ °ÍÀÌ´Ù. ±×·¡¼­ ÇÁ·Î±×·¥ ½Ã À۽à µ¿Àû ·Î´õ´Â ½ÇÁ¦·Î´Â /etc/ld.so.cache¸¦ »ç¿ëÇÏ¿© ÇÊ¿äÇÑ ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ´Â °ÍÀÌ´Ù.

ȯ°æ º¯¼ö

¿©·¯ Á¾·ùÀÇ È¯°æº¯¼öµéÀÌ À§ÀÇ ÀÌ·¯ÇÑ ÇÁ·Î±×·¥ ½ÃÀÛ½ÃÀÇ ÀûÀç°úÁ¤µéÀ» Á¶ ÀýÇÒ¼ö ÀÖÀ¸¸ç ¶ÇÇÑ ÀÌ °úÁ¤µéÀ» ´ëÄ¡Çϵµ·Ï Çϴ ȯ°æº¯¼öµéµµ ÀÖ´Ù. ¿¹¸¦ µé ¸é ÀÌ ¼öÇà°úÁ¤Áß, ¾î¶² ¶óÀ̺귯¸®¸¦ ÀáÁ¤ÀûÀ¸·Î ±³Ã¼ÇÏ¿© ¼öÇàÇÒ¼öµµ ÀÖ´Ù. ¸®´ª½º¿¡¼­ ȯ°æº¯¼ö LD_LIBRARY_PATH´Â ÄÝ·ÐÀ¸·Î ºÐ¸®µÇ¾î Àִ ǥÁØ ÀûÀÎ ¶óÀ̺귯¸®¼Â¿¡ ¾Õ¼­¼­ °¡Àå ¸ÕÀú Ž»öµÇ¾îÁú ¶óÀ̺귯¸® µð·ºÅ丮ÁýÇÕ ÀÌ´Ù. ÀÌ·¸°Ô ÇÏ¸é »õ·Î¿î ¶óÀ̺귯¸®¸¦ µð¹ö±ëÇϰųª ºñÇ¥ÁØÀûÀÎ ¶óÀ̺귯¸® ¸¦ ¾î¶² Ư¼öÇÑ ¿ëµµ·Î »ç¿ëÇÒ ¶§¿¡ À¯¿ëÇÒ°ÍÀÌ´Ù. ȯ°æº¯¼ö LD_PRELOAD ´Â /etc/ld.so. preloadó·³ Ç¥ÁØÀûÀÎ ÇÔ¼öµé¿¡ ¿À¹ö¶óÀ̵åµÉ ÇÔ¼öµéÀÌ ÀÖ´Â ¿À ºêÁ§Æ® ÆÄÀÏÀÇ ¸®½ºÆ®¸¦ ³ªÅ¸³½´Ù. À§ÀÇ ÀÌ·¯ÇÑ ±â´ÉµéÀº ·Î´õ /lib/ld-linux.so °¡ ±¸ÇöÇÑ´Ù.

ÀûÀç°úÁ¤À» Á¦¾îÇÏ´Â ´Ù¸¥ Á¾·ùÀÇ È¯°æº¯¼öµéÀÌ ÀÖ´Ù; À̸§ÀÌ LD_ ¶Ç´Â RTLD_·Î ½ÃÀÛÇÑ´Ù. ÀÌ·¯ÇÑ º¯¼öµéÀÇ ´ëºÎºÐÀº ÀûÀç°úÁ¤ÀÇ Àú¼öÁØ µð¹ö±ëÀ̳ª Ư¼ö±â´ÉÀÇ ±¸ÇöÀ» À§Çؼ­ »ç¿ëµÇ¾î Áø´Ù. ÀÌµé ´ëºÎºÐÀÌ Àß ¹®¼­È­µÇÁö ¾Ê¾Ò ±â ¶§¹®¿¡ ÀÚ¼¼È÷ ¾Ë·Á¸é ¼Ò½ºÄڵ带 Àо°¡´Â °ÍÀÌ ÃÖ¼±ÀÇ ¹æµµÀÏ °ÍÀÌ´Ù. ÀÌ·¸°Ô µ¿Àû¸µÅ© ¶óÀ̺귯¸®¿¡ ´ëÇÑ Á¦¾î±ÇÀ» »ç¿ëÀÚ¿¡°Ô Çã¶ôÇÏ´Â °ÍÀº Ư º°ÇÑ Á¶Ä¡°¡ ÃëÇØÁöÁö ¾Ê´Â´Ù¸é setuid/setgid µîÀÇ ÇÁ·Î±×·¥¿¡ À־´Â ´ë´Ü È÷ À§ÇèÇÑ °ÍÀÌ´Ù. ±×·¡¼­ GNU·Î´õÀÇ °æ¿ì ¸¸¾à¿¡ ÇÁ·Î±×·¥ÀÌ setuid ¶Ç´Â setgidÀÏ °æ¿ì¿¡´Â ÀÌ·¯ÇÑ È¯°æº¯¼öµé(¶Ç´Â ÀÌ¿Í À¯»çÇÑ ´Ù¸¥ º¯¼öµé)Àº ¹«½Ã µÇ°Å³ª ¾Æ´Ï¸é ÇÒ¼öÀÖ´Â ±â´ÉÀÌ ´ë´ÜÈ÷ Á¦ÇѵȴÙ. ·Î´õ´Â ÇÁ·Î±×·¥ÀÌ setuid ¶Ç´Â setgidÀÎÁö Á¡°ËÇϱâÀ§ÇØ ÇÁ·Î±×·¥ÀÇ credential¸¦ üũÇÑ´Ù; uid¿Í euid(effective user ID)°¡ ´Ù¸£°Å³ª gid¿Í egid(effective group ID)°¡ ´Ù¸¥°æ ¿ì¿¡ ·Î´õ´Â ÀÌ ÇÁ·Î±×·¥À» setuid/setgid(¶Ç´Â »ó¼Ó¹ÞÀº°Í)ÀÌ¶ó °¡Á¤ÇÏ°í ¸µ Å©°úÁ¤ÀÇ Á¦¾î±â´ÉÀ» ´ë´ÜÈ÷ Á¦ÇÑÇÏ°Ô µÈ´Ù. GNUÀÇ glibc¶óÀ̺귯¸®ÀÇ ¼Ò½ºÄÚ µå¸¦ Àо¸é ÀÌ·¯ÇÑ ³»¿ëÀ» Àß º¼¼ö ÀÖÀ»°ÍÀ̸ç ƯÈ÷ elf/rtld.c, sysdeps/ generic/dl-sysdep.c¸¦ º¸±æ ¹Ù¶õ´Ù. ÀÌ°ÍÀÌ ¶æÇÏ´Â ¹Ù´Â ¸¸¾à¿¡ ´ç½ÅÀÌ uid, gid¸¦ euid, egid¿Í °°°ÔÇÏ°í ÇÁ·Î±×·¥À» È£ÃâÇϸé ÀÌ·¯ÇÑ È¯°æº¯¼öµéÀº ¿ÏÀü ÇÑ ¿µÇâ·ÂÀ» ¹ÌÄ¥¼ö ÀÖ´Ù´Â ¶æÀÌ´Ù. ´Ù¸¥ À¯´Ð½º À¯»ç ½Ã½ºÅ۵鿡¼­´Â ÀÌ·¯ÇÑ »óȲÀ» ´Ù¸£°Ô ´Ù·ç±âµµ ÇÏÁö¸¸ °°Àº ÀÌÀ¯·Î ÀÎÇؼ­ setuid/setgid ÇÁ·Î±×·¥ Àº ȯ°æº¯¼ö¿¡ ÀÇÇؼ­ À߸øµÈ ¿µÇâÀ» ¹Þ¾Æ¼­´Â ¾ÊµÇ´Â °ÍÀÌ´Ù.

°øÀ¯ ¶óÀ̺귯¸®ÀÇ »ý¼º

°øÀ¯ ¶óÀ̺귯¸®ÀÇ »ý¼ºÀº ½±´Ù. ¸ÕÀú gccÀÇ fPICÇ÷¡±×("position inde- pendent code" °øÀ¯¶óÀ̺귯¸®·Î »ç¿ëÇÒ ¶§ Çʼö)¸¦ »ç¿ëÇÏ¿© ¿ÀºêÁ§Æ® ÆÄÀÏ À» »ý¼ºÇÑ´Ù. ±× ´ÙÀ½¿£ ´ÙÀ½°ú °°Àº ¸í·ÉÇüÅ·Π°øÀ¯ ¶óÀ̺귯¸®¸¦ »ý¼ºÇÑ´Ù.

gcc -shared  -WI, -soname,   your_soname\
 -o   library_name file_list library_list
µÎ °³ÀÇ ¿ÀºêÁ§ÇÁ ÆÄÀÏ(a.o, b.o)À» Æ÷ÇÔÇÏ´Â ÇϳªÀÇ °øÀ¯ ¶óÀ̺귯¸®¸¦ »ý¼º ÇÏ´Â ¿¹¸¦ µé¸é ¾Æ·¡¿Í °°´Ù. ÄÄÆÄÀϽÿ¡ °øÀ¯ ¶óÀ̺귯¸®¿¡ ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï Áö¸¸ ±Ç°íµÇ´Â »çÇ×ÀÎ µð¹ö±ë Á¤º¸(-g¿É¼Ç)¿Í °æ°í(- wall¿É¼Ç)ÀÇ »ý¼º¿¡ À¯ÀÇ Ç϶ó, ±×¸®°í -c¿É¼ÇÀ¸·Î ¿ÀºêÁ§Æ® ÆÄÀÏÀÌ »ý¼ºµÇ¸ç ºÐ¸íÈ÷ -fPIC ¿É¼ÇÀÌ »ç ¿ëµÇ°í ÀÖ´Ù.
gcc -fPIC -g -c -Wall a.c
gcc -fPIC -g -c -Wall b.c
gcc -shared -Wl, -soname, libmystuff.so.1 \ 
 -o libmystuff.so.1.0.1 a.o b.o -lc
À̶§ ÁÖÀÇ»çÇ× ¸î°¡Áö¸¦ Àû¾îº¸¸ç ¾Æ·¡¿Í °°´Ù.

* ÄÄÆÄÀÏ °á°ú »ý¼ºµÉ ¶óÀ̺귯¸®¸¦ ¸í±âÇÏ´Â °ÍÀ» ÀØÁö ¸»°ÍÀ̸ç -fomit, -frame, -pointer µîÀÇ ÄÄÆÄÀÏ·¯ ¿É¼ÇÀº ÁøÂ¥ ÇÊ¿äÇÒ °æ¿ì¿Ü¿£ ¾²Áö ¸» °Í. °á°úÀûÀ¸·Î »ý¼ºµÈ ¶óÀ̺귯¸®´Â µ¿ÀÛÇÏÁö¸¸ ÀÌ·¸°Ô ÇÏ¸é µð¹ö°Å´Â ¹«¿ëÁö¹° ÀÌ µÈ´Ù.

* -fpic°¡ ¾Æ´Ñ -fPIC¸¦ »ç¿ëÇÏ¿© ÄÚµå·Ñ »ý¼º½ÃÄÑ¾ß ÇÑ´Ù.(-fpic¸¦ ¾µ °æ¿ì ºÐ ±âÁ¡¿¡¼­ Å« À§Ä¡º¯È­°¡ ÇÊ¿äÇÒ°æ¿ì ¿ÏÀüÇÑ À§Ä¡ µ¶¸³Çü Äڵ带 ¾òÀ»¼ö ¾ø´Ù.)

°øÀ¯ ¶óÀ̺귯¸®ÀÇ ¼³Ä¡ ¹× »ç¿ë

ÀÌÁ¦ ¸¸¾à¿¡ ´ç½ÅÀÌ ÇϳªÀÇ °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µé¾ú´Ù¸é ±× ´ÙÀ½À¸·Î ¼³Ä¡ ¸¦ ¿øÇÒ °ÍÀÌ´Ù. °¡Àå °£´ÜÇÑ ¹æ¹ýÀº ¸¸µé¾îÁø °øÀ¯ ¶óÀ̺귯¸®¸¦ Ç¥ÁØ µð·ºÅä ¸®µéÁßÀÇ Çϳª(¿¹¸¦ µé¸é /usr/lib)¿¡ º¹»çÇÏ°í ldconfig(8)¸¦ ½ÇÇà½ÃÅ°´Â °ÍÀÌ ´Ù.

¸¸¾à¿¡ (/usr/lib µð·ºÅ丮ÀÇ º¯°æ±ÇÀ» °¡ÁöÁö ¸øÇϰųª Çؼ­) À§Ã³·³ ÇÒ¼ö ¾ø ´Â °æ¿ì°¡ ÀÖ´Ù¸é ȯ°æº¯¼ö¸¦ »ç¿ëÇÏ¿© Á¶Á¤ÇÒ¼ö ÀÖ´Ù. ¸ÕÀú ¾îµò°¡¿¡ °øÀ¯ ¶óÀ̺귯¸®¸¦ »ý¼ºÇؾßÇÑ´Ù. ±× ´ÙÀ½¿¡ ÇÊ¿äÇÑ °ÍÀº real name¿¡ °üÇÑ ½Éº¼¸¯ ¸µÅ©·Î½á sonameÀ» »ý¼º(¶Ç´Â ¹öÀü¸íÀ» ÀüÇô ¸í½ÃÇÏÁö ¾Ê´Â »ç¿ëÀÚÀ» À§ÇÑ ¹öÀü¸íÀÌ Æ÷ÇÔµÇÁö ¾ÊÀº sonameÀ» ½Éº¼¸¯ ¸µÅ©·Î »ý¼º)ÇÏ´Â °ÍÀε¥ À̸¦ À§ ÇÑ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº ´ÙÀ½°ú °°ÀÌ ldconfig¸¦ ½ÇÇàÇÏ´Â °ÍÀÌ´Ù.

ldconfig -n directory_with_shared_library

±× ´ÙÀ½À¸·Î Ç¥ÁØ ¶óÀ̺귯¸® º¸´Ù ¾Õ¼­¼­ Ž»öµÉ ¶óÀ̺귯¸® µð·ºÅ丮 ¸ñ·Ï ÀÎ LD_LIBRARY_PATH º¯¼ö¸¦ ¼³Á¤ÇÑ´Ù. ¸¸¾à¿¡ bash¶ó¸é ´ÙÀ½°ú °°ÀÌ ÇÏ ¿© my_programÀ» Æ÷ÇÔµÇ°Ô ÇÒ¼ö ÀÖ´Ù.

LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH my_program

¸¸¾à ƯÁ¤ÇÑ ÇÔ¼ö¸¸À» ¿À¹ö¶óÀ̵å ÇÏ·Á¸é ¿À¹ö¶óÀ̵ù ¿ÀºêÁ§Æ® ÆÄÀÏÀ» »ý¼º ÇÑ µÚ¿¡ LD_PRELOAD¸¦ ¼³Á¤Çؼ­ ÇÒ¼ö ÀÖ´Ù. Áï, ÀÌ ÆÄÀÏ¿¡ ÀÖ´Â ÇÔ¼öµéÀÌ ±âÁ¸ ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵åÇÑ´Ù.

ÀϹÝÀûÀ¸·Î ¶óÀ̺귯¸®¸¦ °»½ÅÇϴµ¥ ÀÖ¾î Ưº°ÇÑ °í·Á»çÇ×Àº ¾ø´Ù. ¸¸¾à API°¡ º¯È­ÇÑ´Ù¸é ¶óÀ̺귯¸®ÀÇ Á¦ÀÛÀÚ´Â sonameÀ» º¯°æÇÒ °ÍÀÌ´Ù. °°Àº sonameÀ» °¡Áö¸é¼­ ³»¿ëÀº °»½ÅµÈ ½Å¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ ¹«½ÃÇÏ°í ±¸¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ·Á¸é, ±¸¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ ¾îµò°¡¿¡ º¹»çÇÏ°í ±×°ÍÀÇ À̸§À» º¯°æ(À̸¦Å×¸é ¿¾³¯À̸§.origµî)ÇÑ µÚ ÀÌ À̸§ º¯°æµÈ ¶óÀ̺귯¸®¸¦ ½Ç Á¦·Î È£ÃâÇÏ¿© »ç¿ëÇϵµ·Ï Àç¼³Á¤ÇÏ´Â ÀÛÀº wrap½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÏ¿© °­Á¦Àû À¸·Î ±¸¹öÀüÀ» »ç¿ëÇÏ°Ô ÇÒ¼öÀÖ´Ù. °ü·Ê»ó ¿©·¯¹öÀüÀÇ ¶óÀ̺귯¸®µéÀÌ °°Àº µð ·ºÅ丮¿¡ ÀÖÀ»¼ö ÀÖÁö¸¸ ÀÌ ±¸¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ µû·Î ƯÁ¤ÇÑ µð·ºÅ丮¿¡ À§Ä¡½Ãų¼öµµ ÀÖ´Ù. wrap ½ºÅ©¤©Æ®´Â ¾Æ¸¶ ¾Æ·¡¿Í °°À» °ÍÀÌ´Ù.

#!/bin/sh
  export LD_LIBRARY_PATH=/usr/local/my_lib:$LD_LIBRARY_PATH
  exec /usr/bin/my_program.orig $*
ÇÑ ÇÁ·Î±×·¥ÀÌ »ç¿ëÇÏ´Â °øÀ¯ ¶óÀ̺귯¸®ÀÇ ¸ñ·ÏÀº ldd(1)¸¦ ½á¼­ ¾Ë ¼ö ÀÖ ´Ù. ±×·¡¼­, ¿¹¸¦ µé¸é ls¸í·ÉÀÌ »ç¿ëÇÏ´Â °øÀ¯ ¶óÀ̺귯¸®ÀÇ ¸ñ·ÏÀº ´ÙÀ½ÀÇ ¿¹ ¿Í °°ÀÌ ¾Ë¼öÀÖ´Ù

ldd /bin/ls

º¸Åë ÇÁ·Î±×·¥¿¡¼­ ÀÇÁ¸ÇÏ°í ÀÖ´Â ¶óÀ̺귯¸®ÀÇ sonameÀÇ ¸ñ·Ï°ú Æ÷ÇÔµÈ µð ·ºÅ丮°¡ º¸ÀÏ°ÍÀÌ´Ù. ½ÇÁúÀûÀ¸·Î ´ÙÀ½ÀÇ µÎ ¸ðµâÀÇÁ¸¼ºÀº Ç×»ó º¸ÀÏ°ÍÀε¥ ±× °ÍÀº ¾Æ·¡¿Í °°´Ù.

* /lib/ld-linux.so.N(NÀº 1ÀÌ»ó Àû¾îµµ 2). ÀÌ ¶óÀ̺귯¸®´Â ´Ù¸¥ ¸ðµç ¶óÀ̺귯¸®¸¦ ÀûÀçÇÑ´Ù.

* libc.so.N(NÀº 6¶Ç´Â ±×ÀÌ»ó). ÀÌ°ÍÀº C ¶óÀ̺귯¸®ÀÌ´Ù. ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾îµé¿¡¼­µµ(Àû¾îµµ ±× ¾ð¾îÀÇ ¶óÀ̺귯¸®¸¦ ±¸ÇöÇϱâÀ§Çؼ­) C ¶óÀ̺귯¸® ¸¦ ¾²´Â °æÇâÀÌ ÀÖ´Ù. ±×·¡¼­ ¸ðµç ÇÁ·Î±×·¥¿¡¼­ Àû¾îµµ ÀÌ ¶óÀ̺귯¸®´Â Æ÷ Ç﵃ °ÍÀÌ´Ù.

°æ°í: ldd¸¦ ½Å·ÚÇÒ¼ö ¾ø´Â ÇÁ·Î±×·¥¿¡ »ç¿ëÇÏ¿©¼­´Â ¾ÊµÈ´Ù. ÀÌ´Â lddÀÇ ¸Å´º ¾ó¿¡µµ ¸í¹éÈ÷ ¾ð±ÞµÈ ¾ê±âÀÌ´Ù. ldd´Â Á÷Á¢ ±× ÇÁ·Î±×·¥À» È£ÃâÇÔÀ¸·Î½á ¼öÇà µÇ±â ¶§¹®¿¡ ¿¹±âÄ¡ ¸øÇÑ ÄÚµåÀÇ ½ÇÇàÀ» °¡Á®¿Ã¼ö Àֱ⠶§¹®ÀÌ´Ù.

ºñȣȯ ¶óÀ̺귯¸®

»õ·Î¿î ¹öÀüÀÇ ¶óÀ̺귯¸®°¡ ±¸¹öÀüÀÇ ¶óÀ̺귯¸®¿Í ÀÌÁøÄÚµå Â÷¿ø¿¡¼­ ȣȯ µÇÁö ¾Ê´Â´Ù¸é sonameÀº º¯°æµÉ ÇÊ¿ä°¡ ÀÖ´Ù. ÀÌÁøÄڵ忡¼­ ºñȣȯµÇ´Â °æ ¿ì¿¡´Â ´ÙÀ½ÀÇ ³×°¡Áö ÀÌÀ¯°¡ °¡Àå ±âº»ÀûÀÌ´Ù.

  1. ÇÔ¼öÀÇ ÇൿÀÌ º¯°æµÇ¾î ¿ø·¡ÀÇ ÇÔ¼ö½ºÆå(±Ô°Ý)À» ´õ ÀÌ»ó ¸¸Á·ÇÏÁö ¸øÇÒ ¶§.
  2. ¿Ü·¡ µ¥ÀÌÅÍ ¾ÆÀÌÅÛÀÌ º¯ÇßÀ»¶§(¿¹¿Ü:¿É¼Ç ¾ÆÀÌÅÛÀ» ¶óÀ̺귯¸®ÀÇ ±¸Á¶ ¸¶ Áö¸· ºÎºÐ¿¡ ÷°¡ÇÏ´Â °ÍÀº ÀÌ·¯ÇÑ ¾ÆÀÌÅÛ±¸Á¶°¡ ¶óÀ̺귯¸®ÀÇ ³»ºÎ¿¡ ÇÒ´çµÇ ¾î ÀÖ´ÂÇÑ ±¦ÂúÀ½)
  3. ¿Ü·¡ÇÔ¼ö°¡ Á¦°ÅµÇ¾úÀ» ¶§.
  4. ¿Ü·¡ÇÔ¼öÀÇ ÀÎÅÍÆäÀ̽º°¡ º¯°æµÇ¾úÀ» ¶§.

¸¸¾à ÀÌ·¯ÇÑ ¿øÀεéÀ» ´ç½ÅÀÌ ÇÇÇØ°£´Ù¸é ´ç½ÅÀÇ ¶óÀ̺귯¸®´Â ÀÌÁø¸ðµå¿¡ ¼­ ȣȯ°¡´ÉÇÒ °ÍÀÌ´Ù. ´Ù¸¥ ½ÄÀ¸·Î ¾ê±âÇÏÀÚ¸é ´ç½Å ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ÀÌÁø ÀÎÅÍÆäÀ̽º(ABI) ȣȯ¼ºÀº ÀÌ·¯ÇÑ º¯°æÀ» ÇÏÁö¾Ê´Â´Ù¸é ÁöÄÑÁú °ÍÀÌ´Ù. ¿¹ ¸¦µé¸é ´ç½ÅÀº »õ·Î¿î ÇÔ¼ö¸¦ Ãß°¡Ç쵂 ±âÁ¸ÇÔ¼öµéÀ» »èÁ¦ÇÏÁö¾Ê±æ ¿øÇÒ¼ö ÀÖ À» °ÍÀÌ´Ù. ´ç½ÅÀº ±¸¹öÀüÀÇ ÇÁ·Î±×·¥ÀÌ ¶óÀ̺귯¸® ±¸Á¶ÀÇ ³¡ºÎºÐ¿¡ ¾ÆÀÌÅÛ À» Ãß°¡Çϰųª, ¶Ç´Â (ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ¾Æ´Ñ)¶óÀ̺귯¸®¿¡¼­¸¸ ÀÌ·¯ÇÑ ±¸Á¶¸¦ ÇÒ´çÇϰųª, ¶Ç´Â ¾î¶² ƯÁ¤ÇÑ ¾ÆÀÌÅÛÀ» ¿É¼ÇÈ­ÇÏ´Â(¶Ç´Â ¶óÀ̺귯¸®¿¡¼­ ±× ¾ÆÀÌÅÛÀ» ä¿ö³Ö´Â)µîµîÀÇ ÀÌ·¯ÇÑ º¯°æ¿¡ ¿µÇâÀ» ¹ÞÁö¾ÊÀ½ÀÌ È®½ÇÇÒ¶§¸¸ ±× ¶óÀ̺귯¸® ±¸Á¶¿¡ ÀÌ·¯ÇÑ ¾ÆÀÌÅÛÃß°¡¸¦ ÇÒ¼öÀÖ´Â °ÍÀÌ´Ù. »ç¿ëÀÚµéÀÌ ¹è¿­À» »ç¿ëÇÏ°í ÀÖÀ»½Ã¿¡´Â ±×·¯ÇÑ ±¸Á¶È®ÀåÀ» ¾Æ¸¶ ÇÒ¼ö ¾øÀ» °ÍÀÓ¿¡ À¯ÀÇÇ϶ó.

4. µ¿Àû(DL) ¶óÀ̺귯¸®

µ¿Àû ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÇ ½ÃÀ۽ð¡ ¾Æ´Ñ ´Ù¸¥¶§¿¡ ÀûÀçµÇ´Â ¶óÀ̺귯¸® ¸¦ ¸»ÇÑ´Ù. Ç÷¯±×ÀεîÀÇ ¸ðµâÀº ±×°ÍÀÇ ÇÊ¿ä½Ã±îÁö ÀûÀ縦 ±â´Ù¸®´Â °ÍÀÌ Çã ¿ëµÇ¹Ç·Î À̵éÀÇ ±¸Çö¿¡ ƯÈ÷ À¯¿ëÇÏ´Ù. ¿¹¸¦µé¸é PAM(Pluggable Authenti- cation Module:ÀûÀç°¡´É ÀÎÁõ¸ðµâ)µîÀÇ ½Ã½ºÅÛ¿¡¼­´Â °ü¸®ÀÚ°¡ ÀÎÁõÀ» ±¸¼º¶Ç ´Â À籸¼ºÇϴµ¥ µ¿Àû ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ´Ù. ¶ÇÇÑ µ¿Àû ¶óÀ̺귯¸®´Â ¼ö½Ã·Î ¾ð¾îÄڵ带 ±â°è¾î·Î ÄÄÆÄÀÏÇÏ°í, ÄÄÆÄÀÏµÈ ¸ðµâµéÀ» È¿À²ÀûÀ¸·Î ¸ØÃã¾øÀÌ »ç ¿ëÄÚÀúÇÏ´Â ÀÎÅÍÇÁ¸®Å͸¦ ±¸ÇöÇϴµ¥µµ À¯¿ëÇÏ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀº Àú½ºÆ® ÀΟ ÀÓ ÄÄÆÄÀÏ·¯(JIT)³ª ¸ÖƼ À¯Àú´øÀü(MUD:multi user dungeon)ÀÇ °³¹ß¿¡µµ À¯ ¿ëÇÏ´Ù.

¸®´ª½º¿¡¼­´Â µ¿Àû ¶óÀ̺귯¸®´Â Æ÷¸Ë¸¸ÀÇ °üÁ¡¿¡¼­ º»´Ù¸é Ưº°ÇÑ °ÍÀÌ ¾Æ ´Ï´Ù. Áï, ±×°ÍÀº À§¿¡¼­ ³íÀÇÇÑ Ç¥ÁØÀûÀÎ ¿ÀºêÁ§Æ® ÆÄÀÏÀ̳ª Ç¥ÁØÀûÀÎ °øÀ¯ ¶óÀ̺귯¸®·Î½á ¸¸µé¾îÁø´Ù. °¡Àå Áß¿äÇÑ Â÷ÀÌÁ¡Àº ±×°ÍÀÌ ÇÁ·Î±×·¥ÀÇ ¸µÅ©½Ã ³ª ½ÃÀ۽ÿ¡ ÀÚµ¿À¸·Î ÀûÀçµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó´Â °ÍÀÌ´Ù. ±× ´ë½ÅÀ¸·Î ¶óÀ̺귯¸®¸¦ ¿­°í ½Éº¼À» »ìÇÇ¸ç ¿¡·¯¸¦ Á¦¾îÇÏ°í ´Ý´ÂµîÀÇ API°¡ Á¦°øµÈ´Ù. CÀÇ »ç ¿ëÀÚ´Â ÀÌ·¯ÇÑ API¸¦ »ç¿ëÇϱâ À§Çؼ­ <dlfcn.h>¸¦ includeÇÏ¿©¾ß ÇÑ´Ù. ¸®´ª½º¿¡¼­ »ç¿ëµÇ´Â ÀÎÅÍÆäÀ̽º¸¦ ³ª´Â "dlopen() API"¶ó°í ºÎ¸£¸ç ¼Ö¶ó¸® ½ºÀÇ ±×°Í°ú Çٽɿ¡ À־´Â µ¿ÀÏÇÏ´Ù. ±×·¯³ª ÀÌ·¯ÇÑ µ¿ÀÏÇÑ ¹æ½ÄÀÇ ÀÎÅÍÆä À̽º°¡ ¸ðµç Ç÷§Æû¿¡¼­ °°Àº °ÍÀº ¾Æ´Ï´Ù. HP-UX´Â shl_load()¶ó´Â ´Ù¸¥ ¸Þ Ä¿´ÏÁòÀ» »ç¿ëÇϸç À©µµ¿ìÁî¿¡¼­´Â DLLÀ» ¿ÏÀüÈ÷ ´Ù¸¥ ÀÎÅÍÆäÀ̽º·Î ´Ù·é ´Ù. À̽ļº¿¡ ¸ñÇ¥¸¦ µÐ´Ù¸é Ç÷§Æû°£ÀÇ ÀÌÁú¼ºÀ» ¼û±â°ÔÇØÁÖ´Â ¸î°³ÀÇ wrapping ¶óÀ̺귯¸®ÀÇ »ç¿ëÀ» °í·ÁÇؾßÇÑ´Ù. ÇÑ°¡Áö ¹æ¹ýÀ¸·Î glib ¶óÀ̺귯¸®ÀÇ µ¿Àû ¸ðµâÀûÀç±â´ÉÀÌ ÀÖ´Ù. ÀÌ°ÍÀº ÀÌ·¯ÇÑ ÇÔ¼öµéÀÇ À̽ļº ±¸ÇöÀ» À§ÇØ Ç÷§ÆûÀÇ ÇϺο¡ ÀÖ´Â µ¿ÀûÀûÀç·çƾÀ» »ç¿ëÇÑ´Ù. ÀÌ¿¡°üÇÑ ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº [15] developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html ¿¡¼­ ¹è¿ï¼ö ÀÖ´Ù. ¿©±â ¹®¼­¿¡¼­ Àß ¼³¸íµÇ¾î ÀÖÀ¸¹Ç·Î ´õ ÀÌ»ó ÀÇ ¼³¸íÀº ÇÏÁö ¾Ê°Ú´Ù. ´Ù¸¥ ¹æ¹ýÀº [16]GNU libtoolÁß¿¡ ÇϳªÀÎ libltdlÀ» ¾²´Â °ÍÀÌ´Ù. ÀÌ°ÍÀÇ ´Ù¾çÇÑ ±â´ÉÀ» ¾²±âÀ§Çؼ­´Â ¾Æ¸¶µµ COBRA Object Broker(ORB)¸¦ º¸±æ ¹Ù¶õ´Ù. ¸®´ª½º¿Í ¼Ö¶ó¸®½º¿¡¼­ Á¦°øÇÏ´Â ±â´É¿¡ ¿©ÀüÈ÷ °ü½ÉÀÌ ÀÖ´Ù¸é °è¼Ó ÀоîÁÖ±æ ¹Ù¶õ´Ù.

dlopen()

dlopen(3) ÇÔ¼ö´Â ¶óÀ̺귯¸®¸¦ ¿­¾î¼­ »ç¿ëÁغñ¸¦ ÇÑ´Ù. C¿¡¼­ ÇÔ¼öÀÇ ¿ø ÇüÀº ¾Æ·¡¿Í °°´Ù.

void *dlopen(const char *filename, int flag);

¸¸¾à¿¡ ÆÄÀÏÀÇ À̸§ÀÌ /(Áï, Àý´ë°æ·Î)·Î ½ÃÀÛÇÑ´Ù¸é dlopen()Àº ¶óÀ̺귯¸®¸¦ Ž»öÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù. ±×·¸Áö ¾Ê´Ù¸é dlopen()Àº ´ÙÀ½°ú °°Àº ¼ø¼­·Î ¶óÀ̺귯¸®¸¦ Ž»öÇÑ´Ù.

  1. ÄÝ·ÐÀ¸·Î ºÐ¸®µÈ »ç¿ëÀÚÀÇ LD_LIBRARY ȯ°æº¯¼öÀÇ °¢ µð·ºÅ丮 ¸ñ·Ï.
  2. /etc/ld.so.cache¿¡ ¸í¼¼µÈ ¶óÀ̺귯¸®µé
  3. /lib, ±×´ÙÀ½Àº /usr/lib
dlopen()¿¡¼­ Ç÷¡±×ÀÇ °ªÀº µ¿Àû ¶óÀ̺귯¸®·Î ºÎÅÍÀÇ ÄÚµå ¼öÇà½Ã¿¡ ¹ÌÁ¤ÀÇ µÈ ½Éº¼°ªÀ» ÇØ°áÇÔÀ» ¶æÇÏ´Â RTLD_LAZY, dlopen()ÀÌ ¸®ÅϵDZâÀü ¸ðµç ¹Ì Á¤ÀÇµÈ ½Éº¼ÀÇ °ªÀÌ ÇØ°áµÇ´Â, ±×·¸Áö ¾ÊÀ¸¸é ½ÇÆи¦ ¶æÇÏ´Â RTLD_NOW ÁßÀÇ Çϳª°¡ µÇ¾î¾ß ÇÑ´Ù. ¶óÀ̺귯¸®³»¿¡¼­ Á¤ÀÇµÈ ¿Ü·¡½Éº¼ÀÌ ¼øÂ÷ÀûÀ¸·Î È£ÃâµÇ´Â ¶óÀ̺귯¸®µé¿¡ ÀÇÇؼ­ À¯È¿ÇØÁüÀ» ¶æÇÏ´Â RTLD_ GLOBAL¶ÇÇÑ »ç¿ëµÇ°Å³ª ¿É¼ÇÀÌ µÉ ¼ö ÀÖ´Ù. µð¹ö±ë ÁßÀ̶ó¸é RTLD_LAZY´Â ¹ÌÇØ°áµÈ ½Éº¼ÂüÁ¶¿¡ ÀÇÇÑ ¿¹Ãø ºÒ°¡´ÉÀÇ ¿¡·¯¸¦ ÀÏÀ¸Å³¼ö ÀÖÀ¸¹Ç·Î RTLD_NOW¸¦ »ç¿ëÇÏ±æ ¿øÇÒ °ÍÀÌ´Ù. RTLD_NOW´Â ¶óÀ̺귯¸®¸¦ ¿©´Âµ¥ ¾à°£ ´À¸®´Ù. ÀÌ°ÍÀÌ ¹®Á¦°¡ µÈ´Ù¸é RTLD_LAZY·Î ³ªÁß¿¡ ÀüȯÇϸéµÈ´Ù.

¸¸¾à ¶óÀ̺귯¸®µéÀÌ ¼­·Î ÀÇÁ¸ÇÒ °æ¿ì(¿¹¸¦ µé¸é X°¡ Y¸¦ ÀÇÁ¸ÇÑ´Ù¸é), ÀÇ Á¸ÀÌ µÇ¾îÁÖ´Â ¶óÀ̺귯¸®(ÀÌ ¿¹¿¡¼­´Â Y)¸¦ ¸ÕÀú ·ÎµåÇÏ¿©¾ß ÇÑ´Ù. dlopen()ÀÇ ¸®ÅÏ°ªÀº (ÀûÀçµÇ´Â µ¿Àû ¶óÀ̺귯¸®ÀÇ ÀÏÁ¾ÀÇ ÆÄÀÏ) ÇÚµé(handle) ÀÌ´Ù. ±×°ÍÀº ´Ù¸¥ µ¿Àû ¶óÀ̺귯¸® ·çƾ¿¡¼­ »ç¿ëµÇ¾îÁú ¾î¶°ÇÑ °ªÀ̶ó °í·Á µÉ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀûÀç½Ãµµ°¡ ½ÇÆÐÇϸé dlopen()Àº NULLÀ» ¸®ÅÏÇÒ °ÍÀ̸ç Á¡°ËÇØ º¸±æ ¹Ù¶õ´Ù. °°Àº ¶óÀ̺귯¸®°¡ µÎ¹ø ÀÌ»ó dlopen()¿¡ ÀÇÇؼ­ ·ÎµåµÈ ´Ù¸é °°Àº ÆÄÀÏ ÇÚµéÀÌ ¸®ÅϵȴÙ.

¸¸¾à ¶óÀ̺귯¸®¿¡¼­ _init·Î ¸í¸íµÈ ·çƾÀ» ¿ÜºÎ È£Ãâ ÇÑ´Ù¸é ±× Äڵ尡 dlopen()ÀÇ ¸®ÅÏÀü¿¡ ¼öÇàµÈ´Ù. ÀÌ·¯ÇÑ »ç½ÇÀ» ÀÌ¿ëÇØ ´ç½ÅÀÇ ¶óÀ̺귯¸®¿¡¼­ ÃʱâÈ­ ·çƾÀ» ±¸ÇöÇÏ¸é µÉ °ÍÀÌ´Ù.

dlerror()

¿¡·¯´Â dlerror()À» È£ÃâÇÔÀ¸·Î½á º¸°íµÇ´Âµ¥, ÀÌ ÇÔ¼ö´Â °¡Àå ÃÖ±ÙÀÇ dlopen(), dlsym(), ¶Ç´Â dlclose()·Î ÀÎÇØ ¹ß»ýÇÑ ¿¡·¯¸¦ ±â¼úÇÏ´Â ½ºÆ®¸µ À» ¸®ÅÏÇÑ´Ù. ÇÑ°¡Áö Ưº°ÇÑ Á¡Àº dlerror()¸¦ È£ÃâÇÏ°í ³­µÚ¿¡´Â ±× ´ÙÀ½ºÎ ÅÍ´Â ¶Ç´Ù¸¥ ¿¡·¯°¡ ¹ß»ýÇϱâ Àü±îÁö dlerror()´Â NULLÀ» ¸®ÅÏÇÑ´Ù´Â °ÍÀÌ ´Ù.

dlsym()

µ¿Àû ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ°í »ç¿ëÇÏÁö ¸øÇÑ´Ù¸é ¾Æ¹«·± Àǹ̵µ ¾øÀ» °ÍÀÌ´Ù. dlsym(3)Àº ¶óÀ̺귯¸® »ç¿ëÀÇ °¡Àå ÁÖµÈ ·çƾÀ̸ç ÀÌ ÇÔ¼ö´Â ¿ÀÇÂµÈ ¶óÀ̺귯¸®¿¡¼­ ½Éº¼°ªÀ» Á¶»çÇÑ´Ù. ÀÌÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾîÀÖ´Ù.

void *dlsym(void *handle, char *symbol);

handleÀº dlopen()¿¡ ÀÇÇØ ¸®ÅϵǴ °ªÀ̸ç symbolÀº NIL-·Î ³¡³ª´Â ¹®ÀÚ¿­ ÀÌ´Ù. dlsym()ÀÇ °á°ú°ªÀ» void * ŸÀÙÀÇ Æ÷ÀÎÅÍ¿¡ ÀúÀåÇÏ¸é ¸Å¹ø »ç¿ë½Ã¸¶´Ù ij½ºÆ® ¿¬»êÀ» ¼öÇàÇØ¾ß ÇϹǷÎ(±×¸®°í, ÇÁ·Î±×·¥À» À¯ÁöÇÏ·Á´Â ¸¹Àº ´Ù¸¥ »ç ¶÷µé¿¡°Ô ÀûÀº Á¤º¸¹Û¿¡ ÁÖÁö¸øÇÒ °ÍÀ̹ǷÎ) ÇÇÇÒ¼ö ÀÖ´Ù¸é ÀÌ·¸°Ô ÇÏÁö¸»±æ ¹Ù¶õ´Ù.

dlsym()Àº ½Éº¼ÀÌ ¹ß°ßµÇÁö ¾ÊÀº°æ¿ì¿¡ NULL°ªÀ» ¸®ÅÏÇϰԵȴÙ. ¸¸¾à¿¡ ¾î ¶² ½Éº¼ÀÌ °áÄÚ Á¦·Î³ª NULL°ªÀ» °¡ÁöÁö ¾ÊÀ» °ÍÀ» ´ç½ÅÀÌ ¾Ë°í ÀÖ´Ù¸é ¾Æ ¹«·± ¹®Á¦µµ ¾øÀ¸³ª ¸¸¾à ±×·¸Áö ¾Ê´Ù¸é ÀáÀçÀûÀÎ ¸ðÈ£¼ºÀÌ Á¸ÀçÇÏ°Ô µÈ´Ù, Áï ¸¸¾à¿¡ NULL°ªÀ» °¡Áö°Ô µÈ °æ¿ì ±×°ÍÀÌ ±×·± ½Éº¼ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù´Â °Í ÀÎÁö ¾Æ´Ï¸é ½ÇÁ¦·Î ±× ½Éº¼ÀÇ °ªÀÌ NULLÀÎÁö ÇÏ´Â °ÍÀÌ´Ù. Ç¥ÁØÀûÀÎ ÇØ°á Ã¥Àº dlerror()À» È£Ãâ(Á¸ÀçÇÒ¼ö ÀÖ´Â ¸ðµç ¿¡·¯ÀÇ °¡´É¼ºÀ» ÇؼÒÇϴ°ÍÀÓ) ÇÏ°í ±×´ÙÀ½À¸·Î ½Éº¼°ªÀ» ¾Ë±âÀ§ÇØ dlsym()À» È£ÃâÇÑ µÚ dlerror()À» Çѹø ´õ È£ÃâÇÏ¿© ¿¡·¯°¡ ¹ß»ýÇß´ÂÁö¸¦ Á¡°ËÇÏ´Â °ÍÀÌ´Ù. ÀÌ ºÎºÐÀÇ Äڵ带 ¹ßÃéÇÑ ´Ù¸é ¾Æ·¡¿Í °°À» °ÍÀÌ´Ù.

dlerror();
 /* ¿¡·¯ÄÚµåÀÇ ÃʱâÈ­ */
s = (actual_type) dlsym(handle, symbol_being_searched_for); 
 if ((err = dlerror()) != NULL) 
  /* ½Éº¼°ªÀ» ãÁö ¸øÇÒ¶§ */
  else 
  /* ½Éº¼°ªÀ» ã¾ÒÀ» ¶§ ±× °ªÀÌ s¿¡ ÀÖÀ½ */

dlclose()

dlclose()´Â dlopen()ÀÇ ¿ªÀ¸·Î½á µ¿Àû ¶óÀ̺귯¸®¸¦ ´Ý´Âµ¥ »ç¿ëµÈ´Ù. µ¿Àû ¶óÀ̺귯¸®´Â µ¿Àû ÆÄÀÏÇڵ鿡 °üÇÑ ¸µÅ©¼öÈ¿¸¦ °è¼Ó À¯ÁöÇÏ°í ÀÖÀ¸¹Ç·Î Àû¾î µµ dlopen()ÀÌ È£ÃâµÈ Ƚ¼ö¸¸Å­ÀÇ dlclose()ÀÇ ¼öÇàÀÌ ¾ø±â Àü¿¡´Â ½ÇÁ¦ÀûÀ¸·Î ¸Þ¸ð¸®¿¡¼­ »èÁ¦µÇÁö ¾Ê´Â´Ù. ±×·¡¼­ °°Àº ÇÁ·Î±×·¥ÀÌ °°Àº ¶óÀ̺귯¸®¸¦ ¿© ·¯¹ø È£ÃâÇÏ´Â °ÍÀº ¾Æ¹«·± ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù.

µ¿Àû ¶óÀ̺귯¸®ÀÇ ¿¹ dlopen()ÀÇ ¸Å´º¾ó ÆäÀÌÁö¿¡ ³ª¿À´Â µ¿Àû¶óÀ̺귯¸®ÀÇ ¿¹°¡ ¾Æ·¡¿¡ ÀÖ´Ù. ¿¹ ¿¡¼­´Â ¼öÇжóÀ̺귯¸®°¡ ·ÎµåµÇ°í 2.0ÀÇ cosine°ªÀÌ Ãâ·ÂµÇ¸ç ¸Å¼ø°£¸¶´Ù ¿¡ ·¯¸¦ °Ë»ç(±Ç°íµÊ)ÇÑ´Ù.


    #include <stdio.h>
    #include <dlfcn.h>
    int main(int argc, char **argv) 
        void *handle;
        double (*cosine)(double);
        char *error;
        handle = dlopen ("/lib/libm.so", RTLD_LAZY);
        if (!handle) 
            fputs (dlerror(), stderr);
            exit(1);
        

        cosine = dlsym(handle, "cos");
        if ((error = dlerror()) != NULL)  
            fputs(error, stderr);
            exit(1);
        

        printf ("%f", (*cosine)(2.0));
        dlclose(handle);
    

¸¸¾à À§ÀÇ ÇÁ·Î±×·¥ÀÇ À̸§ÀÌ foo.c ¶ó¸é ´ÙÀ½ÀÇ ¸í·ÉÀ» ½á¼­ ½ÇÇàÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ´Ù.

gcc -Wl,export-dynamic -o foo foo.c -ldl -WI, export-dynamic ¿É¼ÇÀº ½ÇÁúÀûÀ¸·Î ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï³ª ¶§¶§·Î À¯¿ëÇÔ À» ¾Ë°ÔµÉ °ÍÀÌ´Ù. ±×°ÍÀº ld¿¡ Á¤ÀǵǾî Àִµ¥ ELFÆÄÀÏÀÇ »ý¼º½Ã¿¡ ÀÌ¿É¼Ç Àº ¸ðµç ½Éº¼À» ´ÙÀ̳ª¹Í ½Éº¼Å×ÀÌºí¿¡ ºÎ°¡ÇÑ´Ù. Åë»óÀûÀ¸·Î ´ÙÀ̳ª¹Í ½Éº¼Å× À̺íÀº µ¿Àû ¿ÀºêÁ§Æ®¿¡¼­ »ç¿ëµÇ´Â ½Éº¼¸¸À» °¡Áö°í ÀÖ´Ù. ÀÌ ¿É¼ÇÀº dlopen()ÀÇ ¾î¶² ¿ëµµ¿¡¼­ ÇÊ¿äÇÏ´Ù. -WI, export-dynamic º¸´Ù -rdynamicÀ» ¾²¶ó°í ¸»ÇÒ¼öµµ ÀÖ°ÚÁö¸¸ ELF¹®¼­¿¡ ÀÇÇϸé -rdynamicÀº ºñ ¸®´ª½º ½Ã½º ÅÛÀÇ gcc¿¡¼­´Â Ç×»ó Á¦´ë·Î µ¿ÀÛÇÏ´Â °ÍÀº ¾Æ´Ï¶ó°í ÇÑ´Ù.

5. ºÎ°¡Àû ³»¿ëµé

nm ¸í·É

nm¸í·ÉÀº ÁÖ¾îÁø ¶óÀ̺귯¸®ÀÇ ½Éº¼¸ñ·ÏÀ» º¸°íÇÑ´Ù. ±×°ÍÀº °øÀ¯ ¹× Á¤Àû ¶óÀ̺귯¸® ¸ðµÎ¿¡¼­ µ¿ÀÛÇÑ´Ù. ÁÖ¾îÁø ¶óÀ̺귯¸®ÀÇ Á¤ÀÇµÈ ½Éº¼¸í°ú °ª ±×¸®°í ŸÀÙÀ» ¾Ë·ÁÁØ´Ù. ÀÌ ¸í·ÉÀº ¶ÇÇÑ ¶óÀ̺귯¸®¿¡¼­ ÀÌ Á¤º¸°¡ À¯È¿ÇÏ°Ô µÇ¾îÀÖ ´Ù¸é(-ls¿É¼ÇÀ» º¸¶ó) ¼Ò½ºÄÚµå»óÀÇ ¾îµð¿¡¼­ ½Éº¼ÀÌ Á¤ÀǵǾú´Â°¡(ÆÄÀÏÀ̸§°ú ¶óÀγѹö·Î)µµ ¾Ë·ÁÁØ´Ù.

½Éº¼Å¸ÀÙ¿¡ ´ëÇؼ­´Â Á»´õ ¼³¸íÀÌ ÇÊ¿äÇÏ´Ù. ŸÀÙÀÌ º¸°íµÉ ¶§ ¼Ò¹®ÀÚ´Â Áö¿ª º¯¼öÀÓÀ» ³ªÅ¸³»¸ç ´ë¹®ÀÚ´Â Àü¿ª(¿ÜºÎ)º¯¼öÀÓÀ» ³ªÅ¸³½´Ù. ÀüÇüÀûÀÎ ½Éº¼Å¸ÀÙ ¿¡´Â T(ÄÚµåºÎºÐ¿¡¼­ º¸ÅëÀÇ Á¤ÀÇ), D(ÃʱâÈ­µÈ µ¥ÀÌŸ ºÎºÐ), B(ÃʱâÈ­ ¾ÊµÈ µ¥ÀÌÅÍ ¼½¼Ç), U(¹ÌÁ¤ÀÇ:½Éº¼ÀÌ ¶óÀ̺귯¸®¿¡¼­ »ç¿ëµÇ³ª ±× ¶óÀ̺귯¸®¿¡ ÀÇ Çؼ­ Á¤ÀǵÇÁö ¾ÊÀ½), W(´Ù¸¥ ¶óÀ̺귯¸®°¡ ÀÌ ½Éº¼À» Á¤ÀÇÇÏ¸é ±× ³»¿ëÀÌ ÀÌ ¸¦ ´ëÄ¡(override)ÇÔ)µîÀÌ ÀÖ´Ù.

ÇÔ¼öÀÇ À̸§Àº ¾Ë°í ÀÖÁö¸¸ Á¤È®È÷ ¾î´À ¶óÀ̺귯¸®¿¡¼­ Á¤ÀǵǾîÀÖ´ÂÁö ¸ð ¸¥´Ù¸é nm ¸í·ÉÀÇ -o¿É¼Ç(°¢ ¶óÀθ¶´Ù ÆÄÀϸíÀ» ¾Õ¿¡ º¸¿©ÁÜ)À» »ç¿ëÇÏ°í µ¿ ½Ã¿¡ grep¸í·ÉÀ» ½á¼­ ¶óÀ̺귯¸®ÀÇ À̸§À» ã¾Æº¸±æ ¹Ù¶õ´Ù. Bourne shell¿¡¼­ /lib, /usr/libÀÇ ¸ðµç ¶óÀ̺귯¸®¿Í /usr/lib, /usr/local/libÀÇ Á÷°è ¼­ ºêµð·ºÅ丮¿¡¼­ "cos"¸¦ ã´Â °ÍÀº ¾Æ·¡¿Í °°À» °ÍÀÌ´Ù.


nm -o /lib/* /usr/lib/* /usr/lib/*/* 
   /usr/local/lib/* 2> /dev/null | grep 'cos$'

´õ ÀÌ»óÀÇ ÀÚ¼¼ÇÑ ³»¿ëÀº [17]info:binutils#nmÀ» ÂüÁ¶Ç϶ó °øÀ¯ ¶óÀ̺귯¸®´Â ½ºÅ©~PlÆ®Àϼö ÀÖ´Ù.

GNU ·Î´õ´Â °øÀ¯ ¶óÀ̺귯¸®°¡ ¹ÙÀ̳ʸ® ÀÌ¿Ü¿¡µµ ƯÁ¤ÇÑ ½ºÅ©¸³Æ®¾ð¾î·Î ÀÛ¼ºµÈ ÅؽºÆ®ÆÄÀϷεµ °¡´ÉÇϵµ·Ï Çã¿ëÇÏ°í ÀÖÀ½À» ¾ËÇÊ¿ä°¡ ÀÖ´Ù. ÀÌ°ÍÀº °£ Á¢ÀûÀ¸·Î ´Ù¸¥ ¶óÀ̺귯¸®µéÀ» Á¶ÇÕÇϴµ¥ À¯¿ëÇÏ´Ù. ¿¹¸¦ µé¾î ³ªÀÇ ½Ã½ºÅÛÁß ÀÇ Çϳª¿¡ »ç¿ëµÈ /usr/lib/libc.soÀÇ ¸ñ·ÏÀÌ ¾Æ·¡¿¡ ³ª¿ÍÀÖ´Ù.

/* °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸ÕÀú »ç¿ëÇÏ¸ç ´Ü ¾î¶² ÇÔ¼öµéÀº Á¤Àû ¶óÀ̺귯¸®ÀÌ¹Ç ·Î ±×°ÍÀ» ´ÙÀ½Â÷·Ê·Î »ç¿ëÇÏ´Â GNU ld scriptÀÓ. */ GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a ) ´õ ¸¹Àº ³»¿ëÀº ld ¸µÄ¿¿¡ °üÇÑ texinfo ¹®¼­¸¦ º¸¶ó. ÀϹÝÀûÀÎ Á¤º¸´Â info:ld#Options, info:ld#Commands, ±×¸®°í ºñ½ÁÇÑ info:ld#Option Commands µî¿¡¼­ ã¾Æº¸¶ó

GNU Libtool

´Ù¾çÇÑ ½Ã½ºÅÛ¿¡ À̽İ¡´ÉÇÑ ÀÀ¿ëÇÁ·Î±×·¥À» Á¦ÀÛÁßÀ̶ó¸é GNU LibtoolÀ» »ç¿ëÇÏ¿© ¶óÀ̺귯¸®¸¦ ¸¸µé°í ¼³Ä¡ÇÒ °ÍÀ» °í·ÁÇØ º¸¶ó. GNU LibtoolÀº Àü ÇüÀûÀÎ ¶óÀ̺귯¸® Áö¿ø ½ºÅ©¸³Æ®ÀÌ´Ù. LibtoolÀº ¶óÀ̺귯¸® »ç¿ëÀÇ º¹À⼺ À» ÀÏ°üµÇ°í À̽İ¡´ÉÇÑ ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ­ Á¦°ÅÇØÁÙ °ÍÀÌ´Ù. LibtoolÀº ¿À ºêÁ§Æ® ÆÄÀÏÀÇ »ý¼º, Á¤Àû ¹× °øÀ¯¶óÀ̺귯¸®ÀÇ ¸µÅ©, ½ÇÇà ¹ÙÀ̳ʸ®ÀÇ ¸µÅ© ¹× µð¹ö±×, ¶óÀ̺귯¸®ÀÇ ¼³Ä¡, ½ÇÇà ¹ÙÀ̳ʸ®ÀÇ ¼³Ä¡¸¦ À§ÇÑ À̽ÄÀû ÀÎÅÍÆäÀÌ ½º¸¦ Á¦°øÇÑ´Ù. ±×¾È¿¡´Â libltdlÀ̶ó´Â µ¿ÀûÀûÀç ÇÁ·Î±×·¥À» À§ÇÑ À̽ļº wrapper°¡ ¶ÇÇÑ Æ÷ÇԵȴÙ. ´õ ¸¹Àº Á¤º¸´Â [19] www.gnu.org/software/libtool/manual.html ¿¡¼­ ã¾Æº¸±æ ¹Ù¶õ´Ù.

6. »ç¿ë¹ýÀÇ ¿¹½Ã

¾Æ·¡ ºÎÅÍ´Â (Á¤Àû, °øÀ¯ ¹× µ¿Àû ¶óÀ̺귯¸®ÀÇ)¼¼°¡Áö ÇüÅÂÀÇ ¸ðµç ¶óÀ̺귯¸®ÀÇ ¿¹ÀÌ´Ù. libhello.c´Â libhello.h¸¦ Çì´õ·Î ÇÏ´Â º¸ÅëÀÇ ¶óÀ̺귯¸®À̸ç, demo_use.c´Â libhello.c¸¦ È£ÃâÇÏ´Â Æò¹üÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. ±× ´ÙÀ½¿¡´Â ÀÌ°ÍÀÌ ¾î¶»°Ô Á¤Àû ¹× °øÀ¯¶óÀ̺귯¸®·Î »ç¿ëµÇ´Â°¡ÀÇ ¿¹¸¦ º¸¿©ÁÖ´Â ½ºÅ©¸³Æ® (script_static, script_shared)°¡ ÁÖ¼®°ú ÇÔ²² ÀÖÀ¸¸ç, ±× ´ÙÀ½¿¡´Â °øÀ¯ ¶óÀ̺귯¸®°¡ ¾î¶»°Ô µ¿Àû ¶óÀ̺귯¸®·Î »ç¿ëµÇ´ÂÁö¸¦ º¸¿©ÁÖ´Â demo_ dyanmic.c¿Í script_dynamicÀÌ ÀÖ´Ù.

File libhello.c /* libhello.c - ¶óÀ̺귯¸®·Î »ç¿ëµÇ´Â ÆÄÀÏ */ #include <stdio.h> void hello(void) printf("Hello, library world.");


File libhello.h
/* libhello.h - Çì´õ ÆÄÀÏ */

void hello(void);

File demo_use.c /* demo_use.c -- ¹Ù·Î hello·çƾÀ» »ç¿ëÇÏ´Â ¿¹ */ #include "libhello.h" int main(void) { hello(); return 0; }


File script_static
#!/bin/sh
# Á¤Àû ¶óÀ̺귯¸® µ¥¸ð
# Á¤Àû ¶óÀ̺귯¸®ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏÀÎ libhello-static.o»ý¼º.
# libhello-staticÀ̶ó´Â À̸§À» »ç¿ëÇÏ´Â °ÍÀº Á¤Àû ¶óÀ̺귯¸®
# ¿Í µ¿Àû ¶óÀ̺귯¸® »ç¿ëÀ» ¾ö¿¬È÷ ±¸º°Çϱâ À§ÇÑ°ÍÀÏ »ÓÀ̹Ç
# ·Î -staticÀ̶ó´Â À̸§À» ¿ÀºêÁ§Æ® ÆÄÀÏÀ̳ª Á¤Àû ¶óÀ̺귯¸®¿¡
# ¾µ ÇÊ¿ä´Â ¾ø´Ù.
gcc -Wall -g -c -o libhello-static.o libhello.c
# Á¤Àû ¶óÀ̺귯¸®ÀÇ »ý¼º.
ar rcs libhello-static.a libhello-static.o
# ¿©±â¼­ libhello-static.a¸¦ ³ªÁß¿¡ »ç¿ëÇϱâ
# À§ÇØ ¾îµò°¡¿¡ º¹»çÇØ ³õÀ»¼ö ÀÖÀ» °ÍÀÌ´Ù.
# µ¥¸ð ¸ñÀûÀ¸·Î »ç¿ëÇϱâ À§Çؼ­ ¿ì¸®´Â
# ÇöÀçÀÇ µð·ºÅ丮¿¡ ¶óÀ̺귯¸®¸¦ µÎ±â·Î ÇÑ´Ù.
# demo_use ÇÁ·Î±×·¥ÀÇ ÄÄÆÄÀÏ 
gcc -Wall -g -c demo_use.c -o demo_use.o
# demo_use ÇÁ·Î±×·¥ÀÇ »ý¼º; -L. ¿É¼ÇÀº "." °¡ ÇÁ·Î±×·¥
# ÀÇ »ý¼º½Ã¿¡ °Ë»öµÇ°Ô ÇÑ´Ù.  ÀÌ ¸í·ÉÀ¸·Î libhello-static.a¿¡ 
# ÀÖ´Â °ü·ÃµÈ ¿ÀºêÁ§Æ®°¡ ÆÄÀÏ demo_use_static¿¡ »ðÀԵȴÙ.
gcc -g -o demo_use_static demo_use.o -L. -lhello-static
# ÇÁ·Î±×·¥ÀÇ ½ÇÇà
./demo_use_static
  


File script_shared
#!/bin/sh
# °øÀ¯ ¶óÀ̺귯¸®ÀÇ µ¥¸ð
# °øÀ¯ ¶óÀ̺귯¸®ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏ libhello.oÀÇ »ý¼º.
gcc -fPIC -Wall -g -c libhello.c
# °øÀ¯ ¶óÀ̺귯¸®ÀÇ »ý¼º.
# -lc¸¦ »ç¿ëÇÏ¿© C ¶óÀ̺귯¸®¿Í ¸µÅ©ÇÑ´Ù. ¿Ö³ÄÇϸé
# libhello°¡ C ¶óÀ̺귯¸®¿¡ ÀÇÁ¸µÇ±â ¶§¹®ÀÌ´Ù.
gcc -g -shared -Wl,-soname,libhello.so.0 \
   -o libhello.so.0.0 libhello.o -lc
# ¿©±â¼­ libhello.so.0.0¸¦ ¾î¶² µð·ºÅ丮 À̸¦Å׸é 
# /usr/local/lib¿¡ º¹»çÇÏ¿©µµ µÈ´Ù.
# ÀÌÁ¦ ldconfig¸¦ ÀÌ¿ë ½Éº¼¸¯ ¸µÅ©¸¦ ¸¸µç´Ù.
# sonameÀ» ¼Â¾÷ÇÔ.  ¾Æ·¡¿Í °°ÀÌ Çصµ ¹«¹æÇÏ´Ù.
# ln -sf libhello.so.0.0 libhello.so.0
# ¿©±â¼­´Â ±×³É ldconfig·Î Çϵµ·Ï ÇÑ´Ù.
/sbin/ldconfig -n .
# linker nameÀ» ¼ÂÆÃÇÑ´Ù.
# Á»´õ ¸é¹ÐÇÏ°Ô ÇÏ·Á¸é ÀÌ¹Ì Á¸ÀçÇÏ´Â linker nameÀÌ
# ÀÖ´ÂÁö È®ÀÎÇغ¸°í ¸¸¾à ±×·¸´Ù¸é ±×³É ³öµÖ¾ß ÇÒÁö
# ¾Æ´ÑÁö¸¦ Àß Ã¼Å©ÇؾßÇÑ´Ù.
ln -sf libhello.so.0 libhello.so
# demo_use ÇÁ·Î±×·¥ ÆÄÀÏÀ» ÄÄÆÄÀÏÇÑ´Ù.
gcc -Wall -g -c demo_use.c -o demo_use.o
# demo_use ÇÁ·Î±×·¥ÀÇ »ý¼º.
# -L. Àº "." ÀÌ ÇÁ·Î±×·¥ÀÇ »ý¼º½Ã¿¡ °Ë»öµÇµµ·Ï
# ÇÑ´Ù. "." °¡ ÇÁ·Î±×·¥ ½ÇÇà½Ã¿¡ °Ë»öµÇ´Â °ÍÀÌ
# ¾Æ´Ô¿¡ À¯ÀÇÇ϶ó.
gcc -g -o demo_use demo_use.o -L. -lhello
# ÇÁ·Î±×·¥ ½ÇÇà. LD_LIBRARY_PATH¸¦ »ç¿ë
# ÇÏ¿© °øÀ¯ ¶óÀ̺귯¸®°¡ ¾îµð¿¡ Àִ°¡¸¦
# ÇÁ·Î±×·¥¿¡ ¾Ë·Á ÁÖ¾î¾ßÇÑ´Ù.
LD_LIBRARY_PATH="." ./demo_use

File demo_dynamic.c /* demo_dynamic.c -- "hello" routineÀÇ µ¿ÀûÀûÀç¿Í »ç¿ëÀÇ ¿¹ */

/* dlfcn.h ÆÄÀÏÀÌ µ¿ÀûÀûÀç ¶óÀ̺귯¸® ·çƾ¿¡ ÇÊ¿äÇÔ */ #include <dlfcn.h> #include <stdio.h> /* "libhello.h"¸¦ includeÇÒ ÇÊ¿ä°¡ ¾øÀ½¿¡ À¯ÀÇÇ϶ó. ±×·¸Áö¸¸ ±×¿Í °ü·ÃÇÏ¿© ¾î¶² °ÍÀº ¹Ýµå½Ã ¸í½ÃÇؾßÇÑ´Ù; Áï, dlsym()À¸·Î ¾òÀº °ªÀ» °¡Áö°í ÀÖÀ» µ¥ÀÌÅÍÀÇ Å¸ÀÙ Àº ºÐ¸íÈ÷ Á¤ÇØÁ®¾ß ÇÑ´Ù. */ /* "simple_demo_function" ŸÀÙÀº ¸Å°³º¯¼ö¿Í ¸®ÅÏ°ªÀÌ ¾ø´Â ÇÔ¼öÀÇ Å¸ÀÙÀ» ¸»ÇÑ´Ù. */ typedef void (*simple_demo_function)(void);

int main(void) const char *error; void *module; simple_demo_function demo_function; /* µ¿Àû ¶óÀ̺귯¸®¸¦ ÀûÀçÇÔ */ module = dlopen("libhello.so", RTLD_LAZY); if (!module) fprintf(stderr, "Couldn't open libhello.so: %s", dlerror()); exit(1);

/* ½Éº¼À» °¡Á®¿È */ dlerror(); demo_function = dlsym(module, "hello"); if ((error = dlerror())) fprintf(stderr, "Couldn't find hello: %s", error); exit(1);

/* DL ¶óÀ̺귯¸®ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. */ (*demo_function)(); /* ¸ðµç °ÍÀ» ¸¶Ä£ µÚ È®½ÇÈ÷ Ŭ·Î¡ÇÑ´Ù. */ dlclose(module); return 0;


   
File script_dynamic
#!/bin/sh
# µ¿Àû ¶óÀ̺귯¸® µ¥¸ð
# libhello.so¿Í friends°¡ À̹Ì
# »ý¼ºµÇ¾úÀ½À» °¡Á¤ÇÑ´Ù. ( dynamicÀÇ ¿¹¸¦ º¸¶ó).
# demo_dynamic ÇÁ·Î±×·¥À» ¿ÀºêÁ§Æ® ÆÄÀÏ·Î ÄÄÆÄÀÏ.
gcc -Wall -g -c demo_dynamic.c
# demo_use ÇÁ·Î±×·¥ÀÇ »ý¼º.
# ÀÌ ÇÁ·Î±×·¥ÀÌ »ç¿ëÇϴ ƯÁ¤ÀÇ ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÌ
# ½ÃÀÛµÇ°í ³­µÚ°¡ µÇ±â Àü±îÁö´Â ÀûÀçµÇÁö ¾Ê±â ¶§¹®¿¡ µ¿Àû
# ¶óÀ̺귯¸®¸¦ ã±âÀ§ÇØ ¾îµð¸¦ °Ë»öÇØ¾ß ÇÏ´ÂÁö ¾Ë¸± ÇÊ¿ä°¡
# ¾øÀ½¿¡ À¯ÀÇÇ϶ó.
# ±×·¸Áö¸¸ µ¿Àû ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ´Â ¶óÀ̺귯¸®¸¦ 
# Æ÷ÇÔÇϱâ À§Çؼ­ -ldl¿É¼ÇÀº ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù.
gcc -g -o demo_dynamic demo_dynamic.o -ldl
# ÇÁ·Î±×·¥ÀÇ ½ÇÇà. LD_LIBRARY_PATH ¸¦ ÀÌ¿ëÇÏ¿©
# ÇÁ·Î±×·¥ÀÌ ¾îµð¼­ µ¿Àû ¶óÀ̺귯¸®¸¦ ¾òÀ»¼ö 
# ÀÖ´ÂÁö ¾Ë·Á ÁÖ¾î¾ß ÇÑ´Ù.
.
LD_LIBRARY_PATH="." ./demo_dynamic

7. ´Ù¸¥ Âü°í ¹®Çå ¹× ¼Ò½º

¶óÀ̺귯¸®¿¡ °üÇÑ Æ¯È÷ À¯¿ëÇÑ ¼Ò½º¿Í Á¤º¸°¡ ´ÙÀ½ÀÇ ¹®¼­¿¡ ÀÖ´Ù;

  • ``The GCC HOWTO'' -Daniel BarlowÀú. ƯÈ÷ ÀÌ HOWTO ¹®¼­´Â ¶óÀ̺귯¸®ÀÇ »ý¼º¿¡ ÇÊ¿äÇÑ ÄÄÆÄÀÏ·¯ ¿É¼Ç°ú ¶óÀ̺귯¸®¿¡ ¾î¶»°Ô ÁúÀÇÇϴ°¡¿¡ °üÇؼ­ Àß³íÀÇ µÇ°í ÀÖ´Ù. ÀÌ ¹®¼­´Â ¿©±â¼­ ´Ù·çÁö ¸øÇÑ ³»¿ëÀ» ´Ù·ç¾îÁÙ °Í ÀÌ¸ç ¿ªÀ¸·Î ±× ¹®¼­°¡ ´Ù·çÁö ¸øÇÑ ³»¿ëÀÌ ¿ª½Ã ¿©±â¿¡¼­ ¼Ò°³µÇ°í ÀÖ´Â °Í ÀÌ´Ù. ÀÌ HOWTO ¹®¼­´Â Linux Documentation ProjectÀÇ 20] www.linuxdoc.org ¿¡¼­ ã¾Æº¼ ¼ö ÀÖ´Ù.
  • Tool Interface Standards (TIS) committee(ÀÌ´Â µ¿ÀÏÇÑ À§¿øȸ¿¡ ÀÇÇÑ Portable Formats Specification Version 1.1ÀÇ ÇÑ Chapter(Àå)ÀÌ´Ù.)¿¡ ÀÇÇÑ ``Executable and Linkable Format (ELF)''. ÀÌ°ÍÀº ELF Æ÷¸Ë¿¡ °üÇÑ (GNU ³ª ¸®´ª½º¿¡¸¸ ÇÑÁ¤µÇÁö ¾ÊÀº)ÀÚ¼¼ÇÑ Á¤º¸µéÀ» Á¦°øÇÑ´Ù. [21] tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz À» º¸¸é µÈ´Ù. ÆÄÀÏÀ» MIT¿¡ ¼­ ´Ù¿î¹ÞÀ¸¸é ºñÁ¤»óÀûÀÎ Æ÷¸ËÀÏ °ÍÀÌ´Ù. gunzip, tar·Î ǬµÚ¿¡ ``hps''¶ó´Â ÆÄÀÏÀ» ¾ò°Ô µÉ°ÍÀε¥ ù°ÁÙ°ú ¸Ç¸¶Áö¸·ÁÙÀ» ¾ø¾Ö°í ³ª¸é ÀμⰡ´ÉÇÑ Æ÷½ºÆ® ½ºÅ©¸³Æ® ÆÄÀÏÀ» ¾òÀ»¼ö ÀÖÀ»°ÍÀÌ´Ù.
  • ``ELF: From the Programmer's Perspective'' - Hongjui LuÁöÀ½. ÀÌ ¹®¼­ ´Â ¸®´ª½º¿Í GNU gcc-specificÀÇ ELF¿¡ °üÇÑ Á¤º¸¸¦ Á¦°øÇÏ¸ç ¾òÀ»¼ö ÀÖ´Â °÷Àº [22] tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gzÀÌ´Ù.

8. ÀúÀ۱ǰú ¶óÀ̼¾½º

ÀúÀÛ±ÇÀº(C) David A. Wheeler¿¡°Ô ÀÖÀ¸¸ç GNU General Public License (GPL)¸¦ Æ÷ÇÔÇÑ´Ù. ¾Æ¹«·± ´ë°¡¾øÀÌ Àç¹èÆ÷ ÇÒ¼ö ÀÖÀ¸¸ç ´ÙÀ½°ú °°Àº Ç׿¡ ÀÇ °ÅÇÏ¿© Æ÷ÇÔµÈ ÅؽºÆ®¿Í ÇÁ·Î±×·¥À» ¹ø¿ª ¹× ÀÌ¿ëÇÒ¼ö ÀÖ´Ù.

ÀÌ ÇÁ·Î±×·¥Àº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îÀÌ´Ù; Free Software Foundation¿¡ ÀÇÇؼ­ Ãâ ÆǵǴ GNU General Public License¿¡ ÀÇ°ÅÇÏ¿© Àç¹èÆ÷ ¶Ç´Â º¯°æÇÒ¼ö ÀÖ´Ù. ¹öÀü 2¶Ç´Â ±×ÀÌ»óµµ ¸¶Âù°¡ÁöÀÌ´Ù. ÀÌ ¹®¼­´Â ±×°ÍÀÌ À¯¿ëÇÏ±æ ¹Ù¶ó¸ç ¹èÆ÷µÇ´Â °ÍÀÌÁö¸¸ ¾î¶°ÇÑ º¸ÁõÀº ¾ø´Ù´Â °Í¿¡ À¯ÀÇÇ϶ó. ƯÁ¤¸ñÀûÀ̳ª »ó¾÷ÀûÀÎ »ç¿ëÀ» À§ÇÑ ¾î¶² ¾Ï½ÃÀûÀÎ º¸Áõµµ ¾ø ´Ù´Â °Í¿¡ À¯ÀÇÇÏ±æ ¹Ù¶ó¸ç ÀÌ¿¡ °üÇؼ­´Â GNU General Public License¿¡¼­ ´õ ÀÚ¼¼È÷ º¸±æ ¹Ù¶õ´Ù.

GNU General Public License¿Í ÀÌ ÇÁ·Î±×·¥À» ÀÌ¹Ì °¡Áö°í ÀÖÀ»ÅÙµ¥ ¸¸¾à ±×·¸Áö ¸øÇÏ´Ù¸é Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA¿¡ ÆíÁöÇ϶ó.

À§ ³»¿ëµéÀº ´Ù¸¥ À¥»çÀÌÆ®¿¡¼­ ¹Ì·¯¸µ ÇÒ¼ö ÀÖÀ¸¸ç ´Ù¸¸,

  • ¹Ì·¯ »çÀÌÆ®´Â ÁÖ »çÀÌÆ®°¡ °»½ÅµÇ¸é ÀÚµ¿À¸·Î °»½ÅµÉ¼ö ÀÖ¾î¾ß Çϸç,
  • ÁÖ »çÀÌÆ®ÀÇ ÁÖ¼Ò( 23] www.dwheeler.com/program-library)¸¦ ºÐ¸í È÷ ¸í½ÃÇØ¾ß Çϸç ÀÌ¿¡ ÇÏÀÌÆÛ ÅؽºÆ® ¸µÅ© µÇ¾î¾ß Çϸç,
  • ³»°Ô(David A. Wheeler) ÀúÀÚ·Î½á °¡Á®¾ßÇÒ Á¢±Ù±ÇÀ» ÁÖ¾î¾ß ÇÑ´Ù.
»óÀ§ÀÇ µÎ Ç׸ñÀº ³»°¡ ¾µ¸ð¾ø´Â ¹ö±×¸®Æ÷Æ®¸¦ °è¼ÓÇؼ­ ¹ÞÁö ¾Ê°Ô ÇØÁØ´Ù. ³ª´Â ´ç½ÅÀÇ À߸øµÈ ¹Ì·¯¸µÀ¸·Î ÀÎÇØ 1³âÀü¿¡ °íÄ£ ¹ö±×ÀÇ º¸°í¸¦ ¹ÞÁö¾Ê±æ ¿øÇÑ´Ù. ÁÖ »çÀÌÆ®·Î ¸µÅ©ÇÔÀ¸·Î½á »ç¿ëÀÚ´Â ¹Ì·¯³»¿ëÀÌ ÃÖ½ÅÀÇ °ÍÀÎÁö ¾Ë ¼ö ÀÖ´Ù. ³ª´Â ¸Å¿ì °­ÇÑ º¸¾ÈÀ» ÇÊ¿ä·Î Çؼ­ ÀϹÝÀûÀÎ ÀÎÅͳݿ¬°á Á¶Â÷ À§ÇèºÎ´ã ÇÏÁö ¾Ê´Â »çÀÌÆ®µé¿¡¼­ ¹ß»ýµÇ´Â ¹®Á¦µé¿¡ ¸Å¿ì ¹Î°¨ÇÏ´Ù. ¸¸¾à ´ç½ÅÀÌ ÀÌ·± Á¶°ÇÀ̶ó¸é Àû¾îµµ ´Ù¸¥ Æ÷ÀÎÆ®¸¦ ã¾Æ¼­ ÀÚÁÖ ½º´ÏÄ¿³Ý ¾÷µ¥ÀÌÆ®(sneaknet update)Ç϶ó.

ÀÌ ¶óÀ̼¾½º¿¡ ÀÇÇؼ­ ´ç½ÅÀº ¹®¼­¸¦ º¯°æÇÒ¼ö ÀÖÁö¸¸ ´ç½ÅÀÌ ¾²Áö ¾ÊÀº ³» ¿ëÀ» ´ç½Å°ÍÀ̶ó´ø°¡ º¯°æµÈ ³»¿ëÀÌ ¿ø¹®°ú °°´Ù°í ¸»ÇÒ ¼ö´Â ¾ø´Ù. ¹®¼­¿¡ ´ë ÇÑ º¯°æÀÌ Àüü ¹®¼­¿¡ ´ëÇÑ ÀúÀÛ±ÇÀ» ÁÖ´Â °ÍÀÌ ¾Æ´Ï´Ù. ÀÌÀÏÀº ÀúÀÛ¹ý¿¡¼­ ¸»ÇÏ´Â, ÀúÀÛ±Ç ¼Ò½Ç·Î ÀÎÇÏ¿© ÀÚÀ¯·ÎÀÌ »ç¿ëÇÒ¼ö ÀÖ´Â ±×·± ¼º°ÝÀÇ ÀÛ¾÷ÀÌ ¾Æ ´Ï´Ù. ¹®¼­°¡ º¯°æµÇ¾úÀ» ¶§ ±× ³»¿ë°ú ³¯Â¥¸¦ ºÐ¸íÈ÷ ¾Ë·Á¾ß ÇÑ´Ù´Â ÀÚ¼¼ÇÑ ÀúÀ۱ǹýÀÇ ±ÔÄ¢À» »ìÆ캸±æ ¹Ù¶õ´Ù. º¸ÅëÀÇ °æ¿ì º¯°æµÈ ³»¿ëÀ» ¹®¼­ÀÇ ÅëÇÕ ±ÇÀÚ(David A. Wheeler)¿¡°Ô ¾Ë·Á ÅëÇÕ½ÃÅ°´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù.

9. ÁÖ¼®

  1. file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO. html#AEN12
  2. file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO. html#AEN25
  3. file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO. html#AEN33
  4. file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO. html#AEN126
  5. file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO. html#AEN168
  6. file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO. html#AEN189
  7. file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO. html#AEN220
  8. file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO. html#AEN233
  9. http://www.gnu.org/software/libtool/libtool.html
  10. developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.ht ml
  11. www.dwheeler.com/program-library
  12. www.linuxdoc.org/
  13. info:standards#Directory_Variables
  14. www.pathname.com/fhs
  15. http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.ht ml
  16. www.gnu.org/software/libtool/libtool.html
  17. info:binutils#nm
  18. www.gnu.org/software/libtool/libtool.html
  19. www.gnu.org/software/libtool/manual.html
  20. www.linuxdoc.org/
  21. tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz
  22. tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz
  23. www.dwheeler.com/program-library


ID
Password
Join
Nile Is Like Emacs


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2005-07-07 17:40:33
Processing time 0.0019 sec