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

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

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

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
You have an ability to sense and know higher truth.


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