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

You are not allowed to 'fullsearch'


Program Library HOWTO

Program Library HOWTO

WheelerDavid A.

           
        

¹Ú»ó¹Î

           
        

고친 과정
고침 1.0022 March 2002

ÀÌ HOWTO¹®¼­´Â ÇÁ·Î±×·¡¸ÓµéÀÌ ¸®´ª½º »ó¿¡¼­ ¾î¶»°Ô ¶óÀ̺귯¸®¸¦ ¸¸µé°í »ç¿ëÇÏ´ÂÁö¿¡ ´ëÇÑ ¹æ¹ýÀ» ³íÀÇÇÑ´Ù. ÀÌ ¹®¼­´Â Á¤Àû ¶óÀ̺귯¸®, °øÀ¯ ¶óÀ̺귯¸®, µ¿Àû ÀûÀç ¶óÀ̺귯¸®¸¦ ´Ù·é´Ù.


1. ¼Ò°³

ÀÌ HOWTO¹®¼­´Â ÇÁ·Î±×·¡¸ÓµéÀÌ ¸®´ª½º »ó¿¡¼­ GNU ÇÁ·Î±×·¥À» »ç¿ëÇؼ­ ¾î¶»°Ô ¶óÀ̺귯¸®¸¦ ¸¸µé°í »ç¿ëÇÏ´ÂÁö¿¡ ´ëÇÑ ¹æ¹ýÀ» ³íÀÇÇÑ´Ù. ''ÇÁ·Î±×·¥ ¶óÀ̺귯¸®''´Â ³ªÁß¿¡ º» ÇÁ·Î±×·¥¿¡ ÅëÇÕµÉ ÄÄÆÄÀÏµÈ ÄÚµå(ÀÚ·á)¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â ÆÄÀÏÀÌ´Ù. ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÌ ´õ ¸ðµâÈ­µÇ°í, ÄÄÆÄÀÏÇϱ⠺ü¸£°Ô ÇÏ°í, ¾÷µ¥ÀÌÆ® Çϱ⠽±°Ô ¸¸µé¾îÁØ´Ù. ÇÁ·Î±×·¥ ¶óÀ̺귯¸®´Â 3°¡Áö ŸÀÔÀ¸·Î ³ª´­¼ö ÀÖ´Ù: Á¤Àû ¶óÀ̺귯¸®(static library), °øÀ¯ ¶óÀ̺귯¸®(shared library), µ¿Àû ÀûÀç(DL)¶óÀ̺귯¸®(dynamically loaded library)

ÀÌ ¹®¼­´Â óÀ½À¸·Î ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±â Àü¿¡ ½ÇÇà°¡´ÉÇÑ ÇÁ·Î±×·¥À¸·Î ¼³Ä¡µÇ´Â Á¤Àû ¶óÀ̺귯¸®¿¡ ´ëÇؼ­ ³íÀÇÇÏ°Ú´Ù. ±×¸®°í ³ª¼­, ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ¶§ ÀûÀçµÇ°í, ÇÁ·Î±×·¥»çÀÌ¿¡ °øÀ¯°¡ °¡´ÉÇÑ °øÀ¯ ¶óÀ̺귯¸®¿¡ ´ëÇؼ­ ³íÀÇÇÑ´Ù. ¸¶Áö¸·À¸·Î, ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ¶§ ¾ðÁ¦µçÁö ÀûÀçµÇ°í »ç¿ëµÉ ¼ö ÀÖ´Â µ¿Àû ÀûÀç ¶óÀ̺귯¸®¿¡ ´ëÇؼ­ ³íÀÇÇÑ´Ù. µ¿ÀûÀûÀç(DL) ¶óÀ̺귯¸®´Â ´Ù¸¥ ¹æ½ÄÀÇ ¶óÀ̺귯¸® Çü½Ä(format)°ú ´Ù¸£Áö ¾Ê´Ù. (Á¤Àû, °øÀ¯ ¶óÀ̺귯¸®µµ DL ¶óÀ̺귯¸®·Î »ç¿ëµÉ ¼ö ÀÖ´Ù); ±× ´ë½Å¿¡, DL ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô »ç¿ëµÇ´Â ¹æ¹ý¿¡ ÀÇÇØ Â÷ÀÌ°¡ ÀÖ´Ù. ÀÌ HOWTO ¹®¼­´Â ´õ ¸¹Àº ¿¹Á¦°¡ ÀÖ´Â ´Ü¶ô, ´õ ¸¹Àº ¼Ò½ºÀÇ Âü°íÀÚ·á°¡ ÀÖ´Â ´Ü¶ôÀ» Æ÷ÇÔÇÑ´Ù.

¶óÀ̺귯¸®¸¦ °³¹ßÇÏ°í ÀÖ´Â °³¹ßÀÚµéÀº °øÀ¯ ¶óÀ̺귯¸®·Î ¸¸µé¾î¾ß ÇÑ´Ù. ¿Ö³ÄÇϸé, °øÀ¯¶óÀ̺귯¸®´Â ±× ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ°í ÀÖ´Â ÀÀ¿ë ÇÁ·Î±×·¥À¸·ÎºÎÅÍ ¶óÀ̺귯¸®¸¦ °³º°ÀûÀ¸·Î ¾÷µ¥ÀÌÆ® ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. µ¿Àû ÀûÀç(DL) ¶óÀ̺귯¸®´Â À¯¿ëÇÏ´Ù. ÇÏÁö¸¸, »ç¿ëÇϱâ À§ÇØ ´õ ¸¹Àº ·®ÀÇ ÀÛ¾÷À» ÇÊ¿äÇÏ°í ¸¹Àº ÇÁ·Î±×·¥µéÀÌ ÀÌ ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â À¯¿¬¼ºÀ» ÇÊ¿ä·Î ÇÏÁö ¾Ê´Â´Ù. ¹Ý´ë·Î, Á¤Àû ¶óÀ̺귯¸®´Â ¶óÀ̺귯¸®¸¦ ¾÷µ¥ÀÌÆ® Çϴ°ÍÀÌ ´õ ¾î·Æ±â ¶§¹®¿¡ ÀϹÝÀûÀÎ ¸ñÀûÀ¸·Î »ç¿ëµÇ´Â ÇÁ·Î±×·¥¿¡´Â ÃßõÇϱâ Èûµé´Ù. ±×·¡µµ, °¢°¢Àº ±×µéÀÇ ÀåÁ¡À» °¡Áö°í ÀÖ°í, °¢°¢ÀÇ Å¸ÀÔ¿¡ ´ëÇÑ ÀåÁ¡Àº ±× ŸÀÔÀ» ¼³¸íÇÏ´Â ¼½¼Çµé¿¡¼­ ³íÀÇµÉ °ÍÀÌ´Ù.

°øÀ¯ ¶óÀ̺귯¸®¸¦ DLL(Dynamic Linked Library)¶ó°í Çϰųª, DL¶óÀ̺귯¸®·Î »ç¿ëµÇ´Â ¶óÀ̺귯¸®¿¡ ´ëÇØ DLLÀ̶ó°í Çϰųª, À§ÀÇ µÎ°¡Áö »óȲ¿¡ ¸Â´Â ¶óÀ̺귯¸®¸¦ DLLÀ̶ó°í ÇÏ´Â °ÍÀº ÀÇ¹Ì ¾ø´Â ÀÏÀÌ´Ù. ´ç½ÅÀÌ À§ÀÇ °ÍµéÁß ¾î´À Àǹ̸¦ °í¸£´õ¶ó°í, ÀÌ HOWTO ¹®¼­´Â ¸®´ª½º »ó¿¡¼­ µ¹¾Æ°¡´Â DLLs¸¦ ´Ù·ê °ÍÀÌ´Ù.

ÀÌ HOWTO¹®¼­´Â ¿À´Ã³¯ ´ëºÎºÐÀÇ ¸®´ª½º ¹èÆ÷ÆÇ¿¡¼­ »ç¿ëµÇ´Â Çü½ÄÀÎ ½ÇÇà, ¿¬°á Çü½Ä(ELF : Executable and Linking Format)¿¡ ´ëÇؼ­ ´Ù·ê°ÍÀÌ´Ù. GNU gcc´Â »ç½Ç ELFÀÌ¿Ü¿¡ ´õ ¸¹Àº ¶óÀ̺귯¸®¸¦ ´Ù·é´Ù; Ưº°È÷, ´ëºÎºÐÀÇ ¸®´ª½º ¹èÆ÷ÆÇÀº ¾ÆÁ÷±îÁöµµ Åð»öÇÑ a.outÇü½ÄÀ» »ç¿ëÇÑ´Ù. ±×·¯³ª, ±× Çü½ÄÀº ÀÌ ¹®¼­ÀÇ ¹üÀ§¸¦ ¹þ¾î³­´Ù.

¸¸¾à ´ç½ÅÀÌ ÇÁ·Î±×·¥À» ¸¹Àº ½Ã½ºÅÛ¿¡ Æ÷ÆÃÇÒ°ÍÀ̶ó¸é, ¶óÀ̺귯¸®¸¦ ¼³Ä¡ÇÏ°í ¸¸µé±â À§Çؼ­ ¸®´ª½º ÅøÀ» Á÷Á¢ »ç¿ëÇϱ⺸´Ù GNU libtoolÀ» »ç¿ëÇÏ´Â °ÍÀ» °í·ÁÇ϶ó. GNU libtoolÀº ÀÏ°üµÇ°í, Æ÷Æð¡´ÉÇÑ ÀÎÅÍÆäÀ̽º¼Ó¿¡ °øÀ¯¶óÀ̺귯¸®ÀÇ º¹À⼺À» ¼û±â´Â ¿ªÇÒ(¿¹¸¦µé¾î, ¶óÀ̺귯¸®¸¦ ¸¸µé°í ¼³Ä¡ÇÏ´Â °Í)À» Áö¿øÇÏ´Â ÀϹÝÀûÀÎ ¶óÀ̺귯¸® Áö¿ø ½ºÅ©¸³Æ®ÀÌ´Ù. µ¿Àû ÀûÀç ¶óÀ̺귯¸®¸¦ À§ÇÑ Æ÷Æà ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇϱâÀ§ÇØ, ´ç½ÅÀº ¸¹Àº Æ÷Æà ÅøÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. GNU libtoolÀº ``libltdl''À̶ó´Â ÅøÀ» Æ÷ÇÔÇÑ´Ù. ±×¿Ü¿¡µµ, ´ç½ÅÀº ¸ðµâÀÇ µ¿Àû ÀûÀ縦 Áö¿øÇÏ´Â glib¶óÀ̺귯¸®(glibc¿Í È¥µ¿ÇÏÁö¸¶¶ó)¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. glib¿¡ ´ëÇؼ­´Â http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html¿¡¼­ ´õ ¸¹ÀÌ Ã£¾Æ º¼ ¼ö ÀÖ´Ù. ´Ù½ÃÇѹø ¸»ÇÏÁö¸¸, ¸®´ª½º¿¡¼­´Â ÀÌ·± ±â´ÉÀº ÀÌ HOWTO¿¡ ±â¼úµÈ ±¸¼º°³³äÀ¸·Î ±¸Çö µÉ ¼ö ÀÖ´Ù. ¸¸¾à ´ç½ÅÀÌ ¸®´ª½º¿¡¼­ Äڵ带 °³¹ßÇϰųª µð¹ö±ë ÇÏ°í ÀÖ´Ù¸é, ´ç½ÅÀº ÀÌ HOWTOÀÇ Á¤º¸¸¦ ¿øÇÏ°í ÀÖÀ» °ÍÀÌ´Ù.

ÀÌ HOWTOÀÇ º»·¡ÀÇ À§Ä¡´Â http://www.dwheeler.com/program-libraryÀÌ°í, Linux Documentation Project (http://www.linuxdoc.org)¿¡ ¿Ã¶ó°¡ ÀÖ´Ù. ÀúÀÛ±Ç(Copyright)´Â Copyright (C) 2000 David A. WheelerÀÌ°í, GPL ¶óÀ̼¾½º¸¦ µû¸¥´Ù; ´õ ¸¹Àº Á¤º¸¸¦ À§Çؼ­ ¸¶Áö¸· ¼½¼ÇÀ» Âü°íÇ϶ó.


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

Á¤Àû ¶óÀ̺귯¸®´Â ´Ü¼øÈ÷ º¸ÅëÀÇ ¸ñÀûÆÄÀÏ(object file)ÀÇ ¸ðÀ½ÀÌ´Ù. °ü·ÊÀûÀ¸·Î, Á¤Àû ¶óÀ̺귯¸®´Â ``.a''ÀÇ È®ÀåÀÚ·Î ³¡³­´Ù. ÀÌ°ÍÀº ar(archiver)ÇÁ·Î±×·¥¿¡ ÀÇÇؼ­ ¸¸µé¾îÁø´Ù. Á¤Àû ¶óÀ̺귯¸®´Â ³ªÁß¿¡ ¼³¸íµÉ °øÀ¯ ¶óÀ̺귯¸®ÀÇ ÀÌÁ¡µé ¶§¹®¿¡ ¿¹Àü¸¸Å­ ¸¹ÀÌ ¾²ÀÌÁö´Â ¾Ê´Â´Ù. ÇÏÁö¸¸, ¾ÆÁ÷µµ À̰͵éÀº ¸¸µé¾îÁö°í, ¿ª»çÀûÀ¸·Î óÀ½À¸·Î »ý°å°í, ¼³¸íÇϱ⿡ ½±´Ù.

Á¤Àû ¶óÀ̺귯¸®´Â »ç¿ëÀÚµéÀÌ ÇÁ·Î±×·¥À» ´Ù½Ã ÄÄÆÄÀÏÇÏÁö ¾Ê¾Æµµ ¸µÅ©½Ãų¼ö ÀÖµµ·Ï ÇØÁֱ⠶§¹®¿¡, ÄÄÆÄÀÏ ½Ã°£À» ÁÙ¿©ÁØ´Ù. ¿À´Ã³¯ÀÇ ºü¸¥ ÄÄÆÄÀÏ·¯¸¦ º¸¸é Àç ÄÄÆÄÀÏ ½Ã°£Àº ±×´ÙÁö Áß¿äÇÑ ¿ä¼Ò°¡ ¾Æ´Ï±â ¶§¹®¿¡, ÀÌ°ÍÀº ¿¹Àü¸¸Å­ ÀÌÁ¡ÀÌ µÇÁö ¸øÇÑ´Ù. Á¤Àû ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¡¸ÓµéÀÌ ¶óÀ̺귯¸®¸¦ ¸µÅ©ÇÏ°Ô´Â Çã¶ôÇÏ°í ½ÍÀºµ¥, ¼Ò½ºÄڵ带 °ø°³ÇÏ°í ½ÍÁö ¾ÊÀ» ¶§¿¡ À¯¿ëÇÏ´Ù(ÀÌ°ÍÀº ¶óÀ̺귯¸® ÆǸÅÀÚ¿¡°Ô À¯¿ëÇÒ ¼ö ÀÖ°ÚÁö¸¸, ÀÌ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ·Á´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô´Â ÀÌÁ¡ÀÌ ¾Æ´Ï´Ù). ÀÌ·ÐÀûÀ¸·Î, ½ÇÇàÈ­ÀÏ¿¡ ¸µÅ©µÇ´Â Á¤Àû ELF¶óÀ̺귯¸® ÄÚµå´Â °øÀ¯ ¶óÀ̺귯¸®³ª µ¿Àû ÀûÀç ¶óÀ̺귯¸®º¸´Ù 1-5%Á¤µµ ºü¸£°Ô µ¿ÀÛÇØ¾ß ÇÑ´Ù. ÇÏÁö¸¸, ½ÇÀçÀûÀ¸·Î ´Ù¸¥ ¸î¸î ¿ä¼Òµé ¶§¹®¿¡ ÀÌ·± Çö»óÀº °ÅÀÇ ³ªÅ¸³ªÁö ¾Ê°Ô µÈ´Ù.

Á¤Àû ¶óÀ̺귯¸®¸¦ ¸¸µé°Å³ª, Á¸ÀçÇÏ´Â µ¿Àû ¶óÀ̺귯¸®¿¡ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» Ãß°¡Çϱâ À§Çؼ­ ´ÙÀ½°ú °°Àº ¸í·ÉÀ» »ç¿ëÇ϶ó:

ar rcs my_library.a file1.o file2.o

ÀÌ ¿¹Á¦ ¸í·ÉÀº ¿ÀºêÁ§Æ® ÆÄÀÏ file1.o, file2.o¸¦ Á¤Àû ¶óÀ̺귯¸® my_library.a¿¡ Ãß°¡ÇÏ°í, ¸¸¾à my_library.a°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù¸é ¸¸µå´Â °ÍÀÌ´Ù. Á¤Àû ¶óÀ̺귯¸®¸¦ ¸¸µå´Â °Í¿¡ ´ëÇØ ´õ ¸¹Àº Á¤º¸¸¦ º¸·Á¸é ar(1)À» ÂüÁ¶Ç϶ó.

´ç½ÅÀÌ Á¤Àû ¶óÀ̺귯¸®¸¦ ¸¸µé¾ú´Ù¸é, ±×°ÍÀ» »ç¿ëÇÏ°í ½Í¾î ÇÒ °ÍÀÌ´Ù. ´ç½ÅÀº ½ÇÇàÈ­ÀÏÀ» ¸¸µé¶§, ÄÄÆÄÀÏ, ¸µÅ© °úÁ¤¿¡¼­ Á¤Àû ¶óÀ̺귯¸®¸¦ ºÎ¸¦ ¼ö ÀÖ´Ù. ¸¸¾à ½ÇÇàÈ­ÀÏÀ» ¸¸µé±â À§ÇØ gcc(1)À» »ç¿ëÇÑ´Ù¸é, ¶óÀ̺귯¸®¸¦ Ç¥½ÃÇϱâ À§ÇØ -l ¿É¼ÇÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù; ´õ ¸¹Àº Á¤º¸¸¦ À§ÇØ gcc¸¦ ã¾Æº¸¶ó. ¶ÇÇÑ, -l, -LµîÀÇ ¿É¼ÇÀ» Áö¿øÇÏ´Â ld(1) ¸µÄ¿¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù; ±×·¯³ª, ´ëºÎºÐÀÇ °æ¿ì ld(1)À» »ç¿ëÇÏ´Â °Íº¸´Ù gcc(1)À» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ld(1)ÀÌ ´õ ¸¹ÀÌ ¹Ù²î±â ¶§¹®ÀÌ´Ù.


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

°øÀ¯ ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ¶§ ÀûÀçµÇ´Â ¶óÀ̺귯¸®ÀÌ´Ù. °øÀ¯ ¶óÀ̺귯¸®°¡ Á¦´ë·Î ¼³Ä¡µÈ´Ù¸é, ±×´ÙÀ½¿¡ ½ÃÀÛÇÏ´Â ¸ðµç ÇÁ·Î±×·¥Àº ÀÚµ¿ÀûÀ¸·Î »õ °øÀ¯ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ´Ù. ÀÌ°ÍÀº ÈξÀ ´õ À¯¿¬¼º ÀÖ°í, ¹ßÀüµÈ°ÍÀÌ´Ù. ¿Ö³ÄÇϸé, ¸®´ª½º¿¡¼­ »ç¿ëÇÏ´Â ¹æ¹ýÀº ´ç½Å¿¡°Ô ´ÙÀ½°ú °°Àº °ÍµéÀ» Çã¿ëÇϱ⠶§¹®ÀÌ´Ù:

  • ¶óÀ̺귯¸®¸¦ ¾÷µ¥ÀÌÆ®Çصµ ÇÁ·Î±×·¥ÀÌ ¿¹Àü ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ¼ö ÀÖµµ·Ï Áö¿øÇÑ´Ù.

  • ¾î¶² ƯÁ¤ÇÑ ÇÁ·Î±×·¥À» ½ÇÇà½Ãų¶§, ¶óÀ̺귯¸® ³»ÀÇ Æ¯Á¤ÇÑ ¶óÀ̺귯¸®³ª ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵å ÇÒ ¼ö ÀÖ´Ù.

  • ÀÌ ¸ðµç°ÍµéÀ» Á¸ÀçÇÏ°íÀÖ´Â ¶óÀ̺귯¸®¿¡¼­ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â µ¿¾È¿¡ °¡´ÉÇÏ´Ù.


3.1. °ü·Êµé(Conventions)

ÀÌ ¿øÇÏ´Â ¸ðµç ±â´ÉÀ» Áö¿øÇÏ´Â °øÀ¯ ¶óÀ̺귯¸®¿¡ ´ëÇØ, ¸¹Àº °ü·Ê¿Í ÁöħÀÌ µû¶óÁÖ¾î¾ß ÇÑ´Ù. ´ç½ÅÀº ¶óÀ̺귯¸®ÀÇ À̸§ÀÇ Â÷À̸¦ ¾Ë¾Æ¾ß ÇÑ´Ù. Ưº°È÷, ºÒ¸®´Â À̸§``soname''°ú ½ÇÁ¦À̸§``real name''¿¡ ´ëÇؼ­ ¾Ë¾Æ¾ß ÇÑ´Ù(±×¸®°í À̰͵éÀÌ ¾î¶»°Ô »óÈ£ÀÛ¿ëÇÏ´ÂÁö¸¦). ´ç½ÅÀº ¶ÇÇÑ À̰͵éÀÌ ÆÄÀϽýºÅÛÀÇ ¾î´ÀºÎºÐ¿¡ À§Ä¡ÇÏ´ÂÁö ¾Ë¾Æ¾ß ÇÑ´Ù.


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

¸ðµç °øÀ¯ ¶óÀ̺귯¸®µéÀº ``ºÒ¸®´Â À̸§''À̶ó ºÒ¸®´Â Ưº°ÇÑ À̸§À» °¡Áö°í ÀÖ´Ù. ±× ºÒ¸®´Â À̸§Àº Á¢µÎ»ç ``lib'', ±× ¶óÀ̺귯¸® À̸§, ``.so''¿Í ÀÎÅÍÆäÀ̽º°¡ ¹Ù²ñ¿¡ µû¶ó Áõ°¡µÇ´Â ±â°£°ú ¹öÀü³Ñ¹ö·Î ÀÌ·ç¾îÁø´Ù(Ưº° ÄÉÀ̽º·Î, Àú ¼öÁØÀÇ C¶óÀ̺귯¸®´Â ``lib''À¸·Î À̸§ÀÌ ½ÃÀÛÇÏÁö ¾Ê´Â´Ù). ÃæºÐÈ÷ °ËÁõ¹ÞÀº(fully-qualified) ºÒ¸®´Â À̸§Àº ±× ¶óÀ̺귯¸®°¡ ¼ÓÇØÀÖ´Â µð·ºÅ丮¸¦ Á¢µÎ»ç·Î ÇÑ´Ù; ½ÇÁ¦ ½Ã½ºÅÛ¿¡¼­ ÃæºÐÈ÷ °ËÁõ¹ÞÀº ºÒ¸®´Â À̸§Àº ``½ÇÁ¦À̸§''ÀÇ ½Éº¼¸¯ ¸µÅ©°¡ µÈ´Ù.

¸ðµç °øÀ¯ ¶óÀ̺귯¸®µéÀº ``½ÇÁ¦À̸§(realname)''À̶ó ºÒ¸®´Â ½ÇÁ¦ ¶óÀ̺귯¸® Äڵ带 Æ÷ÇÔÇÏ´Â ÆÄÀÏÀ̸§À» °¡Áö°í ÀÖ´Ù. ½ÇÁ¦ À̸§Àº ºÒ¸®´Â À̸§(soname)¿¡´Ù°¡ ±â°£, ¸¶ÀÌ³Ê ¼ýÀÚ, ¶Ç´Ù¸¥ ±â°£, Ãâ½Ã ¼ýÀÚ¸¦ Æ÷ÇÔÇÑ´Ù. ¸¶Áö¸·ÀÇ ±â°£°ú Ãâ½Ã ¼ýÀÚ´Â ¿É¼ÇÀÌ´Ù. ¸¶ÀÌ³Ê ¼ýÀÚ¿Í Ãâ½Ã ¼ýÀÚ´Â ´ç½ÅÀÌ ¶óÀ̺귯¸®ÀÇ ¾î¶² ¹öÀüÀ» ¾²°í ÀÖ´ÂÁö Á¤È®ÇÏ°Ô ¾Ë°Ô ÇÔÀ¸·Î¼­ Çü»ó°ü¸®¸¦ ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù. ÀÌ ¼ýÀÚµéÀÌ »ç¿ëÀ» ½±°Ô ÇÑ´Ù ÇÏ´õ¶óµµ, ¶óÀ̺귯¸® ¹®¼­¿¡ ¾²ÀΰͰú °°Àº ¼ýÀÚ°¡ ¾Æ´Ò ¼ö ÀÖ´Ù´Â Á¡¿¡ À¯ÀÇÇ϶ó.

°Ô´Ù°¡, ÄÄÆÄÀÏ·¯°¡ ¶óÀ̺귯¸®¸¦ ¿ä±¸ÇÒ ¶§ »ç¿ëÇÏ´Â ´Ù¸¥ À̸§ÀÌ ÀÖ´Ù(³ª´Â ±×°ÍÀ» ``¸µÅ© À̸§(linker name)''À̶ó ¸íĪÇÒ °ÍÀÌ´Ù). ±×°ÍÀº ´ÜÁö ºÒ¸®´Â À̸§¿¡¼­ ¼ýÀÚ¸¦ ¾ø¾Ø À̸§ÀÌ´Ù.

°øÀ¯ ¶óÀ̺귯¸®¸¦ ´Ù·ç´Â ¹æ¹ýÀº ÀÌ À̸§µéÀÇ ±¸ºÐÀ» ÇÏ´Â °ÍÀÌ´Ù. ÇÁ·Î±×·¥ÀÌ ±×µéÀÌ ¿øÇÏ´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ ³»ºÎÀûÀ¸·Î ³ª¿­ÇÑ´Ù¸é ±×°ÍµéÀº ±× ¶óÀ̺귯¸®µéÀÇ ºÒ¸®´Â À̸§¸¸ ³ª¿­ÇØ¾ß ÇÑ´Ù. ¹Ý´ë·Î, ´ç½ÅÀÌ °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µç´Ù¸é, ´ç½ÅÀº ±× ¶óÀ̺귯¸®¸¦ ƯÁ¤ÇÑ ÆÄÀÏÀ̸§À¸·Î ¸¸µé¾î¾ß ÇÑ´Ù(´õ ÀÚ¼¼ÇÑ ¹öÀü Á¤º¸µé°ú ÇÔ²²). ´ç½ÅÀÌ »õ·Î¿î ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ ¼³Ä¡ÇÑ´Ù¸é, ´ç½ÅÀº ±×°ÍÀ» »õ·Î¿î Ưº°ÇÑ µð·ºÅ丮¿¡´Ù ¼³Ä¡ÇÏ°í ldconfig(8)À» »ç¿ëÇؼ­ ÇÁ·Î±×·¥À» µ¹¸°´Ù. ldconfigÀº Á¸ÀçÇÏ´Â ÆÄÀÏÀ» Á¶»çÇÏ°í, /etc/ld.so.cacheÀÇ Ä³½Ã ÆÄÀÏÀ» ¼³Á¤Çϸ鼭(Àá½ÃÈÄ¿¡ ¾ð±Þ µÉ °ÍÀÌ´Ù) ½ÇÁ¦ À̸§¿¡´Ù°¡ ºÒ¸®´Â À̸§À¸·Î ½Éº¼¸¯ ¸µÅ©¸¦ ¸¸µé¾îÁØ´Ù.

ldconfig´Â ¸µÄ¿ À̸§À» ¸¸µéÁö´Â ¾Ê´Â´Ù; º¸Åë ÀÌ°ÍÀº ¶óÀ̺귯¸® ¼³Ä¡ÇÒ¶§ ¸¸µé¾îÁö°í, ¸µÄ¿ À̸§Àº ``°¡ÀåÃÖ±ÙÀÇ'' ºÒ¸®´Â À̸§(soname)À̳ª ½ÇÁ¦ À̸§(real name)À¸·Î ¸¸µé¾îÁø´Ù. ³ª´Â ¸µÄ¿ À̸§(linker name)À» ºÒ¸®´Â À̸§(soname)ÀÇ ½Éº¼¸¯ ¸µÅ©·Î »ç¿ëÇÒ °ÍÀ» ÃßõÇÑ´Ù. ¿Ö³ÄÇϸé, ´ëºÎºÐÀÇ °æ¿ì ´ç½ÅÀÌ ¶óÀ̺귯¸®¸¦ ¾÷µ¥ÀÌÆ® ÇÑ´Ù¸é, ´ç½ÅÀº ¸µÅ© ½Ãų¶§¿¡ ÀÚµ¿ÀûÀ¸·Î »ç¿ëÇÏ°í ½Í¾îÇÒ °ÍÀ̱⠶§¹®ÀÌ´Ù. ³ª´Â H. J. Lu¿¡°Ô ¿Ö ldconfig°¡ ÀÚµ¿ÀûÀ¸·Î ¸µÄ¿À̸§À» ¸¸µé¾îÁÖÁö ¾Ê³Ä°í ¹°¾îº¸¾Ò´Ù. ±×ÀÇ ¼³¸íÀº ÀÌ·¸´Ù. ¾Æ¸¶ ´ç½ÅÀ» ÃֽŹöÀüÀÇ ¶óÀ̺귯¸® Äڵ带 µ¹¸®°í ½Í¾îÇÒÁö ¸ð¸¥´Ù. ÇÏÁö¸¸, ±× ´ë½Å¿¡ ¿¹ÀüÀÇ(¾Æ¸¶µµ ȣȯµÇÁö ¾Ê´Â) ¹öÀüÀÇ ¶óÀ̺귯¸®·Î °³¹ßÇÏ°í ½Í¾îÇÒ ¼ö µµ ÀÖ´Ù. µû¶ó¼­, ldconfig´Â ÇÁ·Î±×·¥ÀÌ ¾î¶² ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ °ÍÀÎÁö ¾î¶°ÇÑ °¡Á¤µµ ÇÏ°í ÀÖÁö ¾Ê´Ù. µû¶ó¼­, ¼³Ä¡ÀÚ´Â ¸µÄ¿°¡ ¾î¶² ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ°ÍÀÌÁö¿¡ ´ëÇÑ ½Éº¼¸¯ ¸µÅ©¸¦ Ưº°È÷ ¼öÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù.

µû¶ó¼­, /usr/lib/libreadline.so.3´Â /usr/lib/libreadline.so.3.0°ú °°Àº ½ÇÁ¦ À̸§¿¡ ldconfig¿¡ ÀÇÇØ ½Éº¼¸¯ ¸µÅ©°¡ µÈ ÃæºÐÈ÷ °ËÁõ¹ÞÀº ºÒ¸®´Â À̸§(soname)ÀÌ´Ù. /usr/lib/libreadline.so.3À» ½Éº¼¸¯ ¸µÅ©ÇÏ´Â /usr/lib/libreadline.so °°Àº ¸µÄ¿ À̸§(linker name)ÀÌ ÀÖÀ» ¼ö ÀÖ´Ù.


3.1.2. ÆÄÀÏ ½Ã½ºÅÛ ¹èÄ¡

°øÀ¯ ¶óÀ̺귯¸®´Â ÆÄÀϽýºÅÛÀÇ ¾îµò°¡¿¡ À§Ä¡Çؾ߸¸ ÇÑ´Ù. ´ëºÎºÐÀÇ ¿ÀǼҽº ¼ÒÇÁÆ®¿þ¾î´Â GNUÇ¥ÁØÀ» µû¸¥´Ù; ´õ ¸¹Àº Á¤º¸¸¦ À§Çؼ­´Â info:standards#Directory_Variables¸¦ ã¾Æº¸¾Æ¶ó. GNUÇ¥ÁØÀº ¼Ò½ºÄڵ带 ¹èÆ÷ÇÒ¶§ Ç¥ÁØÀ¸·Î ¸ðµç ¶óÀ̺귯¸®¸¦ /usr/local/lib¿¡ ¿Ã¸®±â¸¦ ÃßõÇÑ´Ù(±×¸®°í ¸ðµç ¸í·É¾î´Â /usr/local/bin¿¡ À§Ä¡Çϱ⸦ ÃßõÇÑ´Ù). ±×µéÀº ¶ÇÇÑ ÀÌ Ç¥ÁØÀ» ¿À¹ö¶óÀ̵åÇÏ°í, ÀνºÅç ¼ø¼­¸¦ Á¤ÇØÁÖ±âÀ§ÇÑ °ü·Ê¸¦ Á¤ÀÇÇÑ´Ù.

ÆÄÀϽýºÅÛ °èÃþ Ç¥ÁØ(FHS = Filesystem Hierarchy Standard)´Â ¹èÆ÷ÆÇÀÇ ¾îµð¿¡¼­ ¹«¾ùÀ» ÇؾßÇÏ´ÂÁö ³íÀÇÇÑ´Ù(http://www.pathname.com/fhsÀ» ÂüÁ¶Ç϶ó). FHS¿¡ µû¸£¸é, ´ëºÎºÐÀÇ ¶óÀ̺귯¸®´Â /usr/lib¿¡ ÀνºÅç µÇ¾îÀÖ¾î¾ß¸¸ ÇÑ´Ù. ÇÏÁö¸¸, ½ÃÀ۽ÿ¡ ¿ä±¸µÇ´Â ¶óÀ̺귯¸®´Â /lib¿¡ ÀÖ¾î¾ß ÇÏ°í, ½Ã½ºÅÛÀÇ ÀϺΰ¡ ¾Æ´Ñ ¶óÀ̺귯¸®´Â /usr/local/lib¿¡ ÀÖ¾î¾ß ÇÑ´Ù.

À§ÀÇ µÎ ¹®¼­»çÀÌ¿¡ Á¤¸» Ãæµ¹ÀÌ ÀÖÁö´Â ¾Ê´Ù; GNUÇ¥ÁØÀº ¼Ò½ºÄÚµåÀÇ °³¹ßÀÚ¿¡°Ô ±âº»Àû°ÍµéÀ» ÃßõÇÑ´Ù. ¹Ý¸é¿¡, FHS´Â ¹èÆ÷ÀÚ(½Ã½ºÅÛ ÆÐÅ°Áö °ü¸® ½Ã½ºÅÛÀ» ÅëÇØ ¼Ò½ºÄÚµåÀÇ ±âº»ÀûÀÎ °ÍÀ» ¿À¹ö¶óÀ̵åÇÏ´Â »ç¶÷)¿¡°Ô ±âº»ÀûÀΰÍÀ» ÃßõÇÑ´Ù. ÀϹÝÀûÀ¸·Î ÀÌ°ÍÀº Àß µ¹¾Æ°£´Ù: ``ÃÖ±ÙÀÇ''(¾Æ¸¶µµ ¹ö±×°¡ ÀÖÀ»Áöµµ ¸ð¸£´Â!) ¼Ò½ºÄÚµå´Â ´ç½ÅÀÌ ´Ù¿î·ÎµåÇؼ­ ¼³Ä¡¸¦ Çϸé ``local''µð·ºÅ丮(/usr/local)¿¡ ¼³Ä¡µÉ °ÍÀÌ°í, ±× Äڵ尡 ÆÐÅ°Áö¸¦ ¹ßÀü½ÃÅ°¸é, °ü¸®ÀÚ´Â ¹èÆ÷ÆÇÀÇ Ç¥ÁØ À§Ä¡·Î ±× Äڵ带 Ç¥ÁØÀ¸·Î À§Ä¡½Ãų ¼ö ÀÖ´Ù. ¸¸¾à ´ç½ÅÀÇ ¶óÀ̺귯¸®°¡ ¶óÀ̺귯¸®¸¦ ÅëÇØ È£ÃâµÇ´Â ÇÁ·Î±×·¥À» È£ÃâÇÑ´Ù¸é, ´ç½ÅÀ» ±×·± ÇÁ·Î±×·¥À» /usr/local/libexec¿¡ ³õ¾Æ¾ß ÇÑ´Ù(¹èÆ÷ÆÇ¿¡¼­´Â /usr/libexec°¡ µÈ´Ù). ÇϳªÀÇ º¹ÀâÇÑ Á¡Àº, Red HatÁ¾·ùÀÇ ½Ã½ºÅÛÀº ¶óÀ̺귯¸®ÀÇ Å½»ö½Ã¿¡ /usr/local/libÀ» ±âº»À¸·Î Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù´Â °ÍÀÌ´Ù; ¾Æ·¡ÀÇ /etc/ld.so.conf¿¡ ´ëÇÑ ³íÀǸ¦ º¸¶ó. ´Ù¸¥ Ç¥ÁØ ¶óÀ̺귯¸® À§Ä¡´Â X-windows¸¦ À§ÇÑ /usr/X11R6/libÀ» Æ÷ÇÔÇÑ´Ù. /lib/security´Â PAM ¸ðµâÀ» À§ÇÑ°ÍÀÌÁö¸¸, À̰͵éÀº DL¶óÀ̺귯¸®·Î ÀûÀçµÈ´Ù´Â °ÍÀ» ¸í½ÉÇ϶ó(À̰͵µ ¾Æ·¡¿¡¼­ ³íÀǵȴÙ).


3.2. ¶óÀ̺귯¸® »ç¿ë ¹æ¹ýµé

¸ðµç ¸®´ª½º ½Ã½ºÅÛÀ» Æ÷ÇÔÇÑ GNU glibc±â¹Ý ½Ã½ºÅÛ¿¡¼­´Â, ELF ÀÌÁø ½ÇÇàÆÄÀÏÀÇ ½ÃÀÛÀº ÇÁ·Î±×·¥·Î´õ°¡ ÀûÀçµÇ°í ½ÇÇàµÈ ÈÄ¿¡ ÇÑ´Ù. ¸®´ª½º ½Ã½ºÅÛ¿¡¼­´Â, ÀÌ ·Î´õ´Â /lib/ld-linux.so.X(¿©±â¼­ X´Â ¹öÀü ¼ýÀÚ)¶ó´Â À̸§ÀÌ ºÙ´Â´Ù. ÀÌ ·Î´õ´Â ÇÁ·Î±×·¥¿¡¼­ ¾²ÀÌ´Â ´Ù¸¥ ¸ðµç °øÀ¯ ¶óÀ̺귯¸®¸¦ ã¾ÆÁÖ°í ÀûÀç½ÃÄÑÁØ´Ù.

Ž»öµÇ¾îÁø µð·ºÅ丮ÀÇ ¸®½ºÆ®´Â /etc/ld.so.conf¿¡ ÀúÀåµÈ´Ù. ¸¹Àº Red Hat±â¹Ý ¹èÆ÷ÆÇÀº ±âº»ÀûÀ¸·Î /usr/local/libÀ» /etc/ld.so.conf¿¡ ÀúÀåÇÏÁö ¾Ê´Â´Ù. ³ª´Â ÀÌ°ÍÀÌ ¹ö±×¶ó°í »ý°¢ÇÑ´Ù. ±×¸®°í, /etc/ld.so.conf¿¡ /usr/local/libÀ» Ãß°¡Çϴ°ÍÀº Red Hat±â¹Ý ½Ã½ºÅÛ¿¡¼­ ¸¹Àº ÇÁ·Î±×·¥À» µ¹¸®±âÀ§ÇØ ¿ä±¸µÇ¾îÁø ÀϹÝÀûÀÎ ¼öÁ¤ÀÛ¾÷ÀÌ´Ù.

¶óÀ̺귯¸®¿¡ ¸î°³ÀÇ ÇÔ¼ö¸¦ Ãß°¡ÇÏ°í ½ÍÀºµ¥, ¶óÀ̺귯¸®ÀÇ ³ª¸ÓÁö ºÎºÐÀ» À¯ÁöÇÏ°í ½Í´Ù¸é, ¿À¹ö¶óÀ̵åÇÏ´Â ¶óÀ̺귯¸®ÀÇ À̸§(.oÆÄÀÏ)À» /etc/ld.so.preload¿¡ ³Ö¾î¶ó; ÀÌ ``¹Ì¸® ÀûÀçµÇ´Â'' ¶óÀ̺귯¸®´Â ±âº» ¼Â¿¡ ´ëÇØ ¿ì¼±¼øÀ§¸¦ °¡Áú°ÍÀÌ´Ù. ÀÌ ¹Ì¸® ÀûÀçµÇ´Â ÆÄÀÏÀº ÀϹÝÀûÀ¸·Î ±ä±ÞÆÐÄ¡¿¡ »ç¿ëµÈ´Ù; ¹èÆ÷ÆÇÀº ÀϹÝÀûÀ¸·Î Ãâ½ÃµÉ¶§ ±×·±ÆÄÀϵéÀ» Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù.

ÇÁ·Î±×·¥ ½ÃÀ۽ÿ¡ ÀÌ·± µð·ºÅ丮¸¦ ´Ù ã´Â°ÍÀº ¸Å¿ì ºñÈ¿À²ÀûÀÎ ÀÏÀÌ´Ù. µû¶ó¼­, º¸Åë ij½Ì Á¤·ÄÀÌ »ç¿ëµÈ´Ù. ldconfig(8)Àº ±âº»À¸·Î /etc/ld.so.conf¸¦ ÀÐ°í µ¿Àû ¸µÅ© µð·ºÅ丮µé(Ç¥ÁØ °ü·Ê¸¦µû¸£´Â)¿¡¼­ ÀûÀýÇÑ ½Éº¼¸¯ ¸µÅ©¸¦ ¸¸µé°í, /etc/ld.so.cache¿¡ ij½Ã¸¦ ½á ³ÖÀ¸¸é, ´Ù¸¥ ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÈ´Ù. ÀÌ°ÍÀº ¶óÀ̺귯¸® Á¢±ÙÀÇ ¼Óµµ¸¦ ³ô¿©ÁØ´Ù. °ü·ÃµÈ°ÍÀº DLLÀÌ Ãß°¡µÇ°Å³ª »èÁ¦µÇ°Å³ª DLLµð·ºÅ丮°¡ º¯ÇÒ¶§µµ ldconfigÀÌ ÀÛµ¿ÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù; ldconfig¸¦ µ¿ÀÛ½ÃÅ°´Â °ÍÀº ¶óÀ̺귯¸®¸¦ ¼³Ä¡ÇÒ¶§ ÆÐÅ°Áö °ü¸®ÀÚ°¡ ¼öÇàÇؾßÇÒ ÀÛ¾÷ Áß ÇϳªÀÌ´Ù. ±×¸®°í³ª¼­, ½ÃÀ۽ÿ¡ µ¿Àû ·Î´õ°¡ /etc/ld.so.cache¸¦ »ç¿ëÇÏ°í ÇÊ¿äÇÑ ¶óÀ̺귯¸®¸¦ ·ÎµåÇÑ´Ù.

±×·±µ¥, FreeBSD´Â ÀÌ Ä³½Ã¸¦ À§ÇØ ´Ù¸¥ ÆÄÀÏÀ̸§À» »ç¿ëÇÑ´Ù. FreeBSD¿¡¼­´Â, ELF ij½Ã´Â /var/run/ld-elf.so.hintsÀÌ°í a.out ij½Ã´Â /var/run/ld.so.hintsÀÌ´Ù. À̰͵éÀº ldconfig(8)¿¡ ÀÇÇؼ­ ¾÷µ¥ÀÌÆ®µÈ´Ù. µû¶ó¼­, ¸î¸î ´Ù¸¥ »óȲµé¿¡¼­¸¸ ÀÌ Àå¼ÒÀÇ Â÷ÀÌ°¡ ¹®Á¦°¡ µÈ´Ù.


3.3. ȯ°æ º¯¼öµé

¿©·¯°¡Áö ȯ°æº¯¼ö´Â ÀÌ °úÁ¤À» Á¦¾îÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ÀÌ °úÁ¤À» ¿À¹ö¶óÀ̵åÇϴ ȯ°æº¯¼öµéÀÌ Á¸ÀçÇÑ´Ù.


3.3.1. LD_LIBRARY_PATH

ÀÌ Æ¯º°ÇÑ ½ÇÇàÀ» À§ÇØ ´ç½ÅÀº ÀϽÃÀûÀ¸·Î ´Ù¸¥ ¶óÀ̺귯¸®¸¦ ´ëüÇÒ ¼ö ÀÖ´Ù. ¸®´ª½º¿¡¼­, ȯ°æº¯¼ö LD_LIBRARY_PATH´Â Ç¥ÁØÀÇ µð·ºÅ丮µéÀ» ã±âÀü¿¡ ã¾Æº¸°ÔµÇ´Â ¶óÀ̺귯¸®ÀÇ µð·ºÅ丮µéÀÇ ÄÝ·ÐÀ¸·Î ±¸ºÐµÇ´Â ¼ÂÀÌ´Ù; ÀÌ°ÍÀº »õ ¶óÀ̺귯¸®³ª Ưº°È÷ Á¦ÀÛÇÑ Ç¥ÁØÀÌ ¾Æ´Ñ ¶óÀ̺귯¸®¸¦ µð¹ö±ëÇÒ¶§ À¯¿ëÇÏ´Ù. ȯ°æº¯¼ö LD_PRELOAD´Â /etc/ld.so.preload°¡ ÇÏ´Â °Íó·³ Ç¥ÁØ ¼ÂÀ» ¿À¹ö¶óÀ̵åÇÏ´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ ÇÔ¼ö¿Í ÇÔ²² ³ª¿­ÇÑ´Ù. À̰͵éÀº /lib/ld-linux.so¶ó´Â ·Î´õ¿¡ ÀÇÇØ ±¸ÇöµÈ´Ù. LD_LIBRARY_PATH°¡ ¸¹Àº À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ ÀÛµ¿ÇÏ´Â ¹Ý¸é ¸ðµç ½Ã½ºÅÛ¿¡¼­ ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» ¸»ÇÏ°í ½Í´Ù; ¿¹¸¦µé¾î, HU-UX¿¡¼­´Â ÀÌ ±â´ÉÀÌ È¯°æº¯¼ö SHLIB_PATH¿¡ ÀÇÇؼ­ °¡´ÉÇÏ°í, AIX¿¡¼­´Â LIBPATH¿¡ ÀÇÇØ °¡´ÉÇÏ´Ù(°°Àº ¹®¹ý°ú, ÄÝ·ÐÀ¸·Î ±¸ºÐµÇ´Â ¸®½ºÆ®·Î °¡´ÉÇÏ´Ù).

LD_LIBRARY_PATH´Â °³¹ß°ú °Ë»ç¸¦ À§ÇØ Æí¸®ÇÏ´Ù. ±×·¯³ª º¸ÅëÀÇ À¯ÀúÀÇ º¸ÅëÀÇ »ç¿ëÀ» À§Çؼ­ ¼³Ä¡ °úÁ¤¿¡¼­ º¯°æµÇ¸é ¾ÈµÈ´Ù; ¿Ö ±×·±Áö´Â http://www.visi.com/~barr/ldpath.htmlÀÇ ``Why LD_LIBRARY_PATH is Bad''¿¡¼­ ã¾Æº¸¶ó. ÇÏÁö¸¸, ÀÌ ±â´ÉÀº ¿©ÀüÈ÷ °³¹ß°ú °Ë»ç¸¦ À§ÇØ À¯¿ëÇÏ°í, ´Ù¸¥¹æ½ÄÀ¸·Î ÇØ°áÇÏÁö ¸øÇÏ´Â °ÍÀ» ÇØ°áÇϴµ¥ À¯¿ëÇÏ´Ù. ¸¸¾à ´ç½ÅÀÌ È¯°æº¯¼ö LD_LIBRARY_PATH¸¦ ¼³Á¤ÇÏ°í ½ÍÁö ¾Ê´Ù¸é, ¸®´ª½º¿¡¼­ ´ç½ÅÀº ÇÁ·Î±×·¥ ·Î´õ¸¦ Á÷Á¢ ºÒ·¯¼­ ÀÎÀÚ¸¦ ³Ñ°ÜÁÙ¼öµµ ÀÖ´Ù. ¿¹¸¦µé¾î, ´ÙÀ½Àº ȯ°æº¯¼ö LD_LIBRARY_PATHÀÇ °æ·Î ÀÌ¿ÜÀÇ ÁÖ¾îÁø PATH¸¦ »ç¿ëÇÒ °ÍÀÌ°í, ½ÇÇà°¡´É ÇÁ·Î±×·¥À» µ¹¸± °ÍÀÌ´Ù.

  /lib/ld-linux.so.2 --library-path PATH EXECUTABLE
ÀÎÀÚ¾øÀÌ ld-linux.so¸¦ µ¹¸®´Â °ÍÀº ´ç½ÅÀÌ ÀÌ·¸°Ô »ç¿ëÇϴµ¥¿¡ µµ¿òÀ» ÁÙ °ÍÀÌ´Ù. ÇÏÁö¸¸, ÀÌ°ÍÀ» º¸ÅëÀÇ ¿ëµµ·Î »ç¿ëÇÏÁö ¸¶¶ó. À̰͵éÀº µð¹ö±ë¿ëÀÌ´Ù.


3.3.2. LD_DEBUG

GNU C¿¡¼­ ¶Ç´Ù¸¥ À¯¿ëÇÑ È¯°æº¯¼ö´Â LD_DEBUGÀÌ´Ù. ÀÌ°ÍÀº dl* ÇÔ¼ö¸¦ À§ÇØ ¸¸µé¾îÁ³´Ù. µû¶ó¼­ ±×µéÀÌ ÇÏ°í ÀÖ´Â °Íµé¿¡ ´ëÇÑ ¸Å¿ì ÀåȲÇÑ Á¤º¸¸¦ ÁØ´Ù. ¿¹¸¦ º¸ÀÚ:

  export LD_DEBUG=files
  command_to_run
¶óÀ̺귯¸®¸¦ ´Ù·ê¶§ ÆÄÀÏ°ú ¶óÀ̺귯¸®ÀÇ µ¿ÀÛÀ» º¸¿©ÁÖ°í, ¾î¶² ÀÇÁ¸¼ºÀÌ ¹ß°ßµÇ¾ú°í, ¾î¶² SOs(sonames)°¡ ¾î¶² ¼ø¼­·Î ·ÎµåµÇ¾ú´ÂÁö ¸»ÇØÁØ´Ù. LD_DEBUG¸¦ ``bindings''·Î ¼³Á¤ÇÏ´Â °ÍÀº ½Éº¼Á¦ÇÑ¿¡ ´ëÇÑ Á¤º¸¸¦ º¸¿©ÁÖ°í, ``libs''¿¡ ¼³Á¤ÇÏ´ÂÀº °ÍÀº ¶óÀ̺귯¸® Ž»ö°æ·Î¿¡ ´ëÇؼ­ º¸¿©ÁÖ°í, ``version''À¸·Î ¼³Á¤ÇÏ´Â °ÍÀº ¹öÀü ÀÇÁ¸¼ºÀ» º¸¿©ÁØ´Ù.

LD_DEBUG¸¦ ``help''·Î ¼³Á¤ÇÏ°í ÇÁ·Î±×·¥À» µ¹¸®¸é ¿©·¯°¡Áö ¿É¼ÇÀ» Ç¥½ÃÇÒ °ÍÀÌ´Ù. ´Ù½Ã, LD_DEBUG´Â º¸ÅëÀÇ »ç¿ëÀ» À§ÇØ ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó, µð¹ö±ë°ú °Ë»ç¸¦ À§ÇØ Æí¸®ÇÑ °ÍÀÌ´Ù.


3.3.3. ´Ù¸¥ ȯ°æ º¯¼öµé

·Îµù°úÁ¤À» Á¦¾îÇÒ ¼ö ÀÖ´Â ¸¹Àº ȯ°æº¯¼öµéÀÌ ÀÖ´Ù; ±×°ÍµéÀÇ À̸§Àº LD_³ª RTLD_·Î ½ÃÀÛÇÑ´Ù. ´ëºÎºÐÀÇ ´Ù¸¥ ȯ°æº¯¼öµéÀº ·Î´õ ÇÁ·Î¼¼½ºÀÇ Àú ¼öÁØÀÇ µð¹ö±ëÀ̳ª Ưº°ÇÑ ¿ëµµÀÇ ±¸ÇöÀ» À§ÇØ Á¸ÀçÇÑ´Ù. ±×°Íµé ´ëºÎºÐÀº ¹®¼­È­°¡ Àß µÇ¾îÀÖÁö ¾Ê´Ù; ´ç½ÅÀÌ ±×°Íµé¿¡ ´ëÇØ ¾Ë°í ½Í¾îÇÑ´Ù¸é ÃÖ»óÀÇ ¹æ¹ýÀº ·Î´õÀÇ ¼Ò½ºÄڵ带 Àд °ÍÀÌ´Ù(gccÀÇ ÀϺÎ).

Ưº°ÇÑ Á¶Ä¡°¡ ÃëÇØÁöÁö ¾Ê´Â´Ù¸é, µ¿Àû ¿¬°á ¶óÀ̺귯¸®¿¡ »ç¿ëÀÚÀÇ ±ÇÇÑÀ» Çã¶ôÇÏ´Â °ÍÀº setuid/setgid°¡ °É¸° ÇÁ·Î±×·¥¿¡°Ô ¸Å¿ì À§ÇèÇÏ´Ù. µû¶ó¼­, GNU ·Î´õ(ÇÁ·Î±×·¥ÀÌ ½ÃÀ۽ÿ¡ ÇÁ·Î±×·¥ÀÇ ³ª¸ÓÁö¸¦ ·ÎµåÇÏ´Â ·Î´õ)¿¡¼­ setuid/setgidÇÁ·Î±×·¥À̶ó¸é ÀÌ º¯¼öµé(´Ù¸¥ ºñ½ÁÇÑ º¯¼öµé)Àº ¹«½ÃµÇ°Å³ª ±×µéÀÌ ÇÒ ¼ö ÀÖ´Â ¿ªÇÒÀÌ ¸Å¿ì Á¦ÇѵȴÙ. ·Î´õ´Â ÇÁ·Î±×·¥ÀÇ Æ۹̼ÇÀ» üũÇؼ­ setuid/setgidÀÎÁö È®ÀÎÇÑ´Ù; uid/euid°¡ Ʋ¸®°Å³ª, gid/egid°¡ Ʋ¸®¸é ·Î´õ´Â ÇÁ·Î±×·¥ÀÌ setuid/setgid¶ó°í °¡Á¤(¶Ç´Â ±×·³ ÇÁ·Î±×·¥¿¡¼­ ÆÄ»ýµÈ°Í)ÇÏ°í µû¶ó¼­, ¸µÅ©¸¦ ¿¬°áÇÏ´Â µ¿ÀÛ¿¡ ¸Å¿ì Á¦ÇÑÀ» °¡ÇÏ°Ô µÈ´Ù. ´ç½ÅÀÌ ¸¸¾à GNU glibc¶óÀ̺귯¸® ¼Ò½ºÄڵ带 Àоú´Ù¸é, ´ç½ÅÀº ´ÙÀ½°ú °°Àº °ÍÀ» º¸¾ÒÀ» °ÍÀÌ´Ù; elf/rtld.c¿Í sysdeps/generic/dl-sysdep.c¸¦ º¸¾Æ¶ó. ÀÌ°ÍÀº ´ç½ÅÀÌ uid/gid°¡ euid/egid°¡ °°À¸¸é ÇÁ·Î±×·¥À» ºÒ·¯¼­ ȯ°æº¯¼öµéÀÌ ÃÖ´ëÀÇ È¿°ú¸¦ ³ªÅ¸³¾ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ´Ù¸¥ À¯´Ð½º°°Àº ½Ã½ºÅÛ¿¡¼­´Â ´Ù¸¥ ¹æ½ÄÀ¸·Î ó¸®ÇÏÁö¸¸ °°Àº ÀÌÀ¯·Î ó¸®ÇÑ´Ù: setuid/setgidÇÁ·Î±×·¥ÀÌ È¯°æº¯¼öµé¿¡ ÀÇÇØ ³ª»Ú°Ô ó¸®µÇ¸é ¾ÈµÈ´Â ÀÌÀ¯ÀÌ´Ù.


3.4. °øÀ¯ ¶óÀ̺귯¸® ¸¸µé±â

°øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µå´Â °ÍÀº ½±´Ù. óÀ½À¸·Î, gcc-fPIC³ª fpicÇ÷¡±×¸¦ »ç¿ëÇؼ­ °øÀ¯ ¶óÀ̺귯¸®·Î »ç¿ëµÉ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ¸¸µé¾î¶ó. -fPIC³ª -fpic¿É¼ÇÀº ``À§Ä¡¿¡ µ¶¸³ÀûÀÎ ÄÚµå''¸¦ ¸¸µé¾îÁÖ°í, °øÀ¯ ¶óÀ̺귯¸®ÀÇ Á¶°ÇÀ» ¸¸Á·½ÃŲ´Ù; ¾Æ·¡ÀÇ Â÷ÀÌÁ¡À» º¸¶ó. ±×¸®°í ÀÌ Çü½ÄÀ» µû¶ó¼­ °øÀ¯¶óÀ̺귯¸®¸¦ ¸¸µé¾î¶ó:

gcc -shared -Wl,-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À̳ª -fpicÀ» »ç¿ëÇÏ´Â °ÍÀº Ÿ°Ù¿¡ µû¶ó¼­ ´Ù¸£´Ù. -fPICÀ» »ç¿ëÇϴ°ÍÀº ¾ðÁ¦³ª µ¿ÀÛÇÑ´Ù. ÇÏÁö¸¸, -fpicÀ» »ç¿ëÇÏ´Â °Íº¸´Ù Å« Äڵ带 »ý¼ºÇÒ °ÍÀÌ´Ù(PICÀº ´õ Å«Äڵ带 À§ÇÑ°ÍÀÌ¶ó¼­ ´õ ¸¹Àº ¾çÀÇÄڵ带 ¸¸µç´Ù´Â °ÍÀ» ±â¾ïÇ϶ó). -fpic¿É¼ÇÀº ÀÛ°í ºü¸¥ Äڵ带 ¸¸µç´Ù. ÇÏÁö¸¸, Àü¿ª½Éº¼À̳ª ÄÚµåÀÇ Å©±â °°Àº °Í¿¡¼­ Ç÷§Æû¿¡ µ¶¸³ÀûÀÌ´Ù. ¸µÄ¿´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µé¶§ ÀÌ ¿É¼ÇÀÌ ¸Â´ÂÁö ¸»ÇØÁÙ °ÍÀÌ´Ù. ¾î´À°ÍÀ» ½á¾ß ÇÒÁö¸¦ ¸ð¸¦¶§, ³ª´Â ¾ðÁ¦³ª µ¿ÀÛÇÏ´Â -fPICÀ» ¼±ÅÃÇÑ´Ù.

  • ¸î¸îÀÇ °æ¿ì¿¡¼­, ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ¸¸µé±âÀ§ÇØ gcc¸¦ È£ÃâÇÏ´Â °ÍÀº ``-Wl,-export-dynamic'' ¿É¼ÇÀ» Æ÷ÇÔÇÒ °ÍÀÌ´Ù. º¸Åë µ¿Àû ½Éº¼Å×À̺íÀº µ¿Àû ¿ÀºêÁ§Æ®¿¡ ÀÇÇØ »ç¿ëµÇ´Â ½Éº¼¸¸ Æ÷ÇÔÇÑ´Ù. ÀÌ ¿É¼ÇÀº(ELFÆÄÀÏÀ» ¸¸µé¶§) µ¿Àû ½Éº¼Å×ÀÌºí¿¡ ¸ðµç ½Éº¼À» Ãß°¡ÇÑ´Ù(´õ ¸¹Àº Á¤º¸¸¦ À§ÇØ ld(1)¸¦ Âü°íÇ϶ó). '¿ª ÀÇÁ¸¼º'ÀÌ ÀÖÀ»¶§ ÀÌ ¿É¼ÇÀ» ÇÊ¿ä·Î ÇÒ °ÍÀÌ´Ù. Áï, DL¶óÀ̺귯¸®°¡ ¶óÀ̺귯¸®¸¦ ·ÎµåÇϴµ¥ ÇÁ·Î±×·¥¿¡¼­ ÇÊ¿äÇÑ ½Éº¼ÀÌÁö¸¸, °ü·Ê¿¡ ÀÇÇØ Á¤ÀǵÇÁö ¾ÊÀº ½Éº¼À» ÇÊ¿äÇÒ °æ¿ì »ç¿ëµÈ´Ù. ``¿ª ÀÇÁ¸¼º''ÀÌ ÀÛµ¿Çϱâ À§Çؼ­, ÁÖ ÇÁ·Î±×·¥Àº ½Éº¼ÀÌ µ¿ÀûÀ¸·Î µ¿ÀÛÇÏ°Ô ÇØ¾ß ÇÑ´Ù. ¸®´ª½º ½Ã½ºÅÛ¿¡¼­¸¸ »ç¿ëÇÑ´Ù¸é, ``-Wl,export-dynamic''´ë½Å¿¡ ``-rdynamic''À» »ç¿ëÇÒ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸, ELF¹®¼­¿¡ µû¸£¸é ``-rdynamic''Ç÷¡±×´Â ¸®´ª½º°¡ ¾Æ´Ñ ½Ã½ºÅÛÀÇ gcc¿¡¼­ Ç×»ó ÀÛµ¿ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù.

°³¹ß°úÁ¤µ¿¾È, ´Ù¸¥ ¸¹Àº ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÇ´Â ¶óÀ̺귯¸®¸¦ ¼öÁ¤ÇÏ°í ½ÍÀ»¶§°¡ ÀÖÀ» °ÍÀÌ´Ù -- ±×¸®°í ´ç½ÅÀº ÇÁ·Î±×·¥µéÀÌ ``°³¹ß»óÀÇ''¶óÀ̺귯¸®¸¦ »ç¿ëÇϴ°ÍÀ» ¿øÄ¡ ¾ÊÀ» °ÍÀÌ°í, ¾î¶² ƯÁ¤ ÀÀ¿ëÇÁ·Î±×·¥¸¸ÀÌ ±×°ÍÀ» »ç¿ëÇϱ⸦ ¿øÇÒ°ÍÀÌ´Ù. ldÀÇ ``rpath''¿É¼ÇÀº ¾î¶² ƯÁ¤ÇÑ ÇÁ·Î±×·¥ÀÌ ÄÄÆÄÀÏ µÉ ¶§ ½Ç½Ã°£À¸·Î ¶óÀ̺귯¸®ÀÇ Æнº¸¦ Á¤ÇØÁÖ´Â ¿ªÇÒÀ» ÇÑ´Ù. gcc¿¡¼­ ´ç½ÅÀº ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î rpath¸¦ ÁöÁ¤ÇØ ÁÙ ¼ö ÀÖ´Ù:

 -Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
´ç½ÅÀÌ ¶óÀ̺귯¸® Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥À» ¼³Ä¡ÇÒ¶§ ÀÌ ¿É¼ÇÀ» »ç¿ëÇÑ´Ù¸é, ±×°ÍÀÌ Ãæµ¹À» ÀÏÀ¸Å°Áö ¾Ê°Å³ª, ¶óÀ̺귯¸®¸¦ ¼û±â´Â ´Ù¸¥ ±â¼úÀ» »ç¿ëÇϵµ·Ï ÇϱâÀ§ÇØ LD_LIBRARY_PATH¸¦ »ç¿ëÇÏ´Â °ÍÀ» °ÆÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.


3.5. °øÀ¯ ¶óÀ̺귯¸®¸¦ ¼³Ä¡ÇÏ°í »ç¿ëÇϱâ

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

ù°·Î, ´ç½ÅÀº °øÀ¯¶óÀ̺귯¸®¸¦ ¾îµò°¡¿¡ ¼³Ä¡ÇÏ°í ½Í¾îÇÒ °ÍÀÌ´Ù. ±×¸®°í³ª¼­, ´ç½ÅÀº ½ÇÁ¦À̸§À» ºÒ¸®´ÂÀ̸§À¸·Î ½Éº¼¸¯¸µÅ©¸¦ °É¾î¾ß¸¸ ÇÒ°ÍÀÌ´Ù(¹öÀü ¼ýÀÚ°¡ ¾ø´Â ºÒ¸®´Â À̸§ÀÌ´Ù. Áï, ``.so''·Î ³¡³ª¼­ »ç¿ëÀÚµéÀÌ ¹öÀü¿¡ »ó°ü¾øÀÌ »ç¿ëÇÏ°Ô ÇÏ´Â °ÍÀÌ´Ù). °£´ÜÇÑ Á¢±Ù¹ýÀº ´ÙÀ½À» ½ÇÇà½ÃÅ°´Â °ÍÀÌ´Ù:

 ldconfig -n directory_with_shared_libraries

¸¶Áö¸·À¸·Î, ³ÊÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÒ¶§ ´ç½ÅÀÌ ¾²·ÁÇÏ´Â Á¤Àû, °øÀ¯ ¶óÀ̺귯¸®¿¡ ´ëÇØ ¸µÄ¿¿¡°Ô ¸»ÇØÁà¾ß ÇÑ´Ù. -lÀ̳ª -L¿É¼ÇÀ» ¾²¸é µÈ´Ù.

´ç½ÅÀÌ ¶óÀ̺귯¸®¸¦ Ç¥ÁØ °ø°£(¿¹¸¦µé¾î, ´ç½ÅÀº /usr/libÀ» ¼öÁ¤ÇؾßÇÏ´Â °ÍÀº ¾Æ´Ï´Ù)¿¡ ¼³Ä¡ÇÏ°í ½ÍÁö ¾ÊÀ» °æ¿ì, ´Ù¸¥ Á¢±Ù¹ýÀÌ ÀÖ´Ù. ÀÌ °æ¿ì¿¡, ´ç½ÅÀº ´Ù¸¥ ¾îµò°¡¿¡ ¼³Ä¡ÇÏ°í ÇÁ·Î±×·¥ÀÌ ¶óÀ̺귯¸®¸¦ ãµµ·Ï ÃæºÐÇÑ Á¤º¸¸¦ ÁÖ¸éµÈ´Ù. ÀÌ ¹æ¹ý¿¡´Â ¿©·¯°¡Áö°¡ ÀÖ´Ù. °£´ÜÇÑ°æ¿ì·Î gccÀÇ -L Ç÷¡±×¸¦ ÁÙ ¼ö ÀÖ´Ù. ``Ç¥ÁØÀÌ ¾Æ´Ñ''°ø°£¿¡ Àִ ƯÁ¤ÇÑ ÇÁ·Î±×·¥À» °¡Áö°í ÀÖ´Ù¸é ``rpath''¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ȯ°æº¯¼ö¸¦ »ç¿ëÇؼ­ ÇØ°áÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù. Ưº°È÷, ´ç½ÅÀº ÄÝ·ÐÀ¸·Î ±¸ºÐµÇ¾îÁö´Â Ç¥ÁØ°ø°£¿¡¼­ °Ë»ö Àü¿¡ ã¾ÆÁö´Â °øÀ¯¶óÀ̺귯¸®µéÀÇ µð·ºÅ丮µéÀÇ ¸ðÀÓÀÎ LD_LIBRARY_PATH¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ´ç½ÅÀÌ bash¸¦ »ç¿ëÇÑ´Ù¸é, my_programÀº ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î µÉ ¼ö ÀÖ´Ù:

LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH  my_program

¸î °³ÀÇ ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵å Çϱ¸ ½Í´Ù¸é, ¿À¹ö¶óÀ̵å ÇÒ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ¸¸µé°í LD_PRELOAD¸¦ ¼³Á¤Ç϶ó;ÀÌ ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ ÇÔ¼ö´Â ±× ÇÔ¼öµéÀ» ¿À¹ö¶óÀ̵å ÇÒ °ÍÀÌ´Ù(´Ù¸¥ ÇÔ¼öµéÀº ¿ø·¡ ÀÖ´ø´ë·Î ÀÖÀ» °ÍÀÌ´Ù).

º¸ÅëÀº ´ç½ÅÀÌ ¶óÀ̺귯¸®¸¦ °ÆÁ¤¾øÀÌ ¾÷µ¥ÀÌÆ® ÇÒ ¼ö ÀÖ´Ù; ¸¸¾à API°¡ ¹Ù²î¸é ¶óÀ̺귯¸® Á¦ÀÛÀÚ´Â ºÒ¸®´Â À̸§À» ¹Ù²Ù¾î¾ß ÇÑ´Ù. ÀÌ·±¹æ½ÄÀ¸·Î, ÇÑ ½Ã½ºÅÛ¿¡ ¸¹Àº ¶óÀ̺귯¸®°¡ ÀÖÀ»°ÍÀÌ°í, Á¤È®ÇÑ°ÍÀÌ °¢°¢ÀÇ ÇÁ·Î±×·¥¿¡¼­ ¼±ÅõǾ »ç¿ëµÇ¾îÁø´Ù. ±×·¯³ª, ¾î¶² ÇÁ·Î±×·¥ÀÌ °°Àº ºÒ¸®´Â À̸§À» °¡Áö´Â ¶óÀ̺귯¸®¿¡ ´ëÇؼ­ ¾÷µ¥ÀÌÆ® ÇÑ°ÍÀÌ Àß µ¿ÀÛÇÏÁö ¾Ê´Â´Ù¸é, ³Ê´Â ¿¹Àü ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ ´Ù¸¥°÷¿¡ ¿Å°ÜµÎ°í ±× ÇÁ·Î±×·¥ÀÇ À̸§À» ¹Ù²Ù°í(¿¹ÀüÀ̸§¿¡´Ù°¡ ``.orig''¸¦ ºÙÀδÙ), ¶óÀ̺귯¸® »ç¿ëÀ» ¸®¼ÂÇÏ°í ½ÇÁ¦ÀÇ »õ·Î À̸§ÀÌ ºÙÀº ÇÁ·Î±×·¥À» ºÎ¸£´Â ÀÛÀº ``°¨½Î´Â(wrapper)'' ½ºÅ©¸³Æ®¸¦ ¸¸µé¼ö ÀÖ´Ù. ´ç½ÅÀÌ ¿øÇÑ´Ù¸é, ¼ýÀÚ °ü·Ê°¡ Çã¿ëÇÏ´Â ÇÑ °°Àº µð·ºÅ丮¿¡´Ù°¡ ¿¹ÀüÀÇ ¶óÀ̺귯¸®¸¦ ´Ù¸¥°÷¿¡ ¿Å°Ü µÑ ¼ö ÀÖ´Ù. °¨½Î´Â ½ºÅ©¸³Æ®´Â ´ÙÀ½°ú °°´Ù:

  #!/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
ÀϹÝÀûÀ¸·Î ´ç½ÅÀº ±× À̸§ÀÌ ¼ÓÇØÀÖ´Â µð·ºÅ丮¿¡ µû¶ó °ü°èµÇ´Â ºÒ¸®´Â À̸§ÀÇ ¸ñ·ÏÀ» º¼ °ÍÀÌ´Ù. Ưº°È÷ ¸ðµç °æ¿ì¿¡¼­ ´ÙÀ½ÀÇ µÎ°¡ÁöÀÇ ÀÇÁ¸¼ºÀ» °¡Áú°ÍÀÌ´Ù:

  • /lib/ld-linux.so.N (NÀº 1ÀÌ»óÀε¥ º¸Åë 2ÀÌ´Ù). ÀÌ°ÍÀº ´Ù¸¥ ¶óÀ̺귯¸®¸¦ ·ÎµåÇÏ´Â ¶óÀ̺귯¸®ÀÌ´Ù.

  • libc.so.N (NÀº 6ÀÌ»óÀÌ´Ù). ÀÌ°ÍÀº C¶óÀ̺귯¸®ÀÌ´Ù. ´Ù¸¥ ¾ð¾î¿¡¼­ C¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ°íÀÚ Çϸé(Àû¾îµµ ±×µéÀÇ ¶óÀ̺귯¸®¿¡¼­ ±¸ÇöÇÏ·ÁÇÒ¶§), ´Ù¸¥ ´ëºÎºÐÀÇ ÇÁ·Î±×·¥µéÀÌ ÀÌ°ÍÀ» Æ÷ÇÔÇÒ °ÍÀÌ´Ù.

ÁÖÀÇ : ´ç½ÅÀÌ ½Å·ÚÇÏÁö ¾Ê´Â ÇÁ·Î±×·¥¿¡ ldd¸¦ ½ÇÇà½ÃÅ°Áö ¸»¾Æ¶ó. ldd(1) ¸Å´º¾óÀ» º¸¸é È®½ÇÇÏ°ÚÁö¸¸, ldd´Â (¾î¶² °æ¿ìµé¿¡ À־) ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÏ°í(ELF ¿ÀºêÁ§Æ®³ª, LD_TRACE_LOADED_OBJECTS) ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ´À¸·Î¼­ µ¿ÀÛÇÑ´Ù. ÀÌ°ÍÀº ½Å·ÚÇÏÁö ¸øÇÏ´Â ÇÁ·Î±×·¥¿¡ À־ (lddÀÇ Á¤º¸¸¦ º¸¿©ÁÖ´Â°Í ´ë½Å¿¡) ÀÓÀÇÀÇ Äڵ带 ½ÇÇà½Ãų ¼ö ÀÖ´Ù. µû¶ó¼­, ¾ÈÀüÀ» À§Çؼ­ ´ç½ÅÀÌ ½Å·ÚÇÏÁö ¸øÇÏ´Â ÇÁ·Î±×·¥Àº ldd¸¦ »ç¿ëÇÏÁö ¸»¾Æ¶ó.


3.6. ȣȯµÇÁö ¾Ê´Â ¶óÀ̺귯¸®µé

»õ¹öÀüÀÇ ¶óÀ̺귯¸®°¡ ¿¹Àü¹öÀü°ú ÀÌÁø-ȣȯÀÌ ¾ÈµÈ´Ù¸é, ºÒ·ÁÁö´Â À̸§ÀÌ ¹Ù²î¾î¾ß ÇÑ´Ù. C¿¡¼­´Â ÀÌÁø ȣȯÀÌ ¾ÈµÇ°Ô µÇ´Â 4°¡Áö ±âº» °æ¿ì°¡ ÀÖ´Ù.

  1. ÇÔ¼öÀÇ ³»¿ëÀÌ ¹Ù²î¾î¼­ º»·¡ÀÇ ½ºÆå°ú ¸Â°Ô µ¿ÀÛÇÏÁö ¾Ê´Â °æ¿ì.

  2. ¼öÃâµÈ(exported) µ¥ÀÌŸ ¾ÆÀÌÅÛÀÌ º¯ÇÑ°æ¿ì(¿¹¿Ü : µ¥ÀÌÅÍ ±¸Á¶°¡ °è¼Ó ¶óÀ̺귯¸® ³»¿¡ Á¸ÀçÇÑ´Ù¸é, µ¥ÀÌÅÍ ±¸Á¶ÀÇ ³»ºÎ¿¡ ¾ÆÀÌÅÛÀ» Ãß°¡ÇÏ´Â °ÍÀº ±¦Âú´Ù)

  3. exported ÇÔ¼ö°¡ Á¦°ÅµÉ °æ¿ì

  4. exported ÇÔ¼öÀÇ ÀÎÅÍÆäÀ̽º°¡ º¯ÇÒ °æ¿ì

ÀÌ·±°æ¿ì¸¦ ÇÇÇÏ·ÁÇÑ´Ù¸é, ÀÌÁø-ȣȯÀÌ µÇ°Ô ¶óÀ̺귯¸®¸¦ À¯ÁöÇÒ ¼ö ÀÖ´Ù. ´Ù½Ã ¸»Çؼ­ ±×·±°æ¿ì¸¦ ÇÇÇÏ°í ½Í´Ù¸é ÀÀ¿ë ÀÌÁø ÀÎÅÍÆäÀ̽º(ABI=Application Binary Interface)¸¦ ÇÒ ¼ö ÀÖ´Ù. ¿¹µéµé¾î, ¿¹Àü°ÍµéÀ» Áö¿ìÁö ¾Ê°í »õ·Î¿î ÇÔ¼ö¸¦ Ãß°¡ÇÏ°í ½ÍÀ» ¼ö ÀÖ´Ù. ´ç½ÅÀº ±¸Á¶¿¡ »õ·Î¿î ¾ÆÀÌÅÛÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸, ¿¹Àü ÇÁ·Î±×·¥ÀÌ »õ·Î¿î ¾ÆÀÌÅÛÀ» Ãß°¡ÇÑ ±¸Á¶¸¦ ÀνÄÇÏÁö ¸øÇѴٰųª (ÇÁ·Î±×·¥ÀÌ ¾Æ´Ñ)¶óÀ̺귯¸®°¡ »õ·Î¿î °ø°£À» ÇÒ´çÇÏÁö ¸øÇϰųª, Ãß°¡ÀÇ ¾ÆÀÌÅÛÀ» ¿É¼ÇÀ¸·Î ¸¸µå´Â°Í(¶Ç´Â ¶óÀ̺귯¸®°¡ ±×°ÍµéÀ» ä¿ì°Ô Çϴ°Í)µîµîÀ» È®½ÇÈ÷ ÇؾßÇÑ´Ù´Â °ÍÀ» ÁÖÀÇÇ϶ó. ÁÖÀÇÇ϶ó - À¯Àú°¡ ¹è¿­¿¡ ±¸Á¶¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é ´ç½ÅÀº ¹è¿­ÀÇ ±¸Á¶¸¦ ´Ã¸±¼ö ¾ø´Ù.

C++(±×¸®°í ÄÄÆÄÀÏµÈ ÅÛÇø´À̳ª ´Ù¸¥ µð½ºÆÐÄ¡µÈ ¸Þ¼Òµå¸¦ Áö¿øÇÏ´Â ¾ð¾î)¿¡¼­ »óȲÀº ±³¹¦ÇØÁø´Ù. À§ÀÇ ¸ðµç »óȲÀÌ ÀÌ·ç¾îÁ®¾ß ÇÏ°í, ´õ ÇØÁÖ¾î¾ß ÇÒ À̽´µéÀÌ ÀÖ´Ù. »óȲÀº ÄÄÆÄÀÏµÈ Äڵ忡¼­ ``º¸ÀÌÁö ¾Ê°Ô'' ±¸ÇöµÇ±â ¶§¹®¿¡ C++ÀÌ ¾î¶»°Ô ±¸ÇöµÇ¾ú´ÂÁö ¾ËÁö ¸øÇÏ¸é ¾Ö¸Å¸ðÈ£ÇØÁö´Â ÀÇÁ¸¼ºÀ» ³º´Â Á¤º¸µé ¶§¹®¿¡ ÀϾ´Ù. ¾ö¹ÐÇÏ°Ô ¸»Çϸé, ÀÌ°ÍÀº ``»õ·Î¿î'' À̽´´Â ¾Æ´Ï´Ù. ´ÜÁö, ÄÄÆÄÀÏµÈ C++Äڵ尡 ³Ê¿¡°Ô ³î¶ó°Ô ÇÒ ¼ö ÀÖÀ»°ÍÀÌ´Ù. ´ÙÀ½¿¡ ³ª¿À´Â °ÍµéÀº (¾Æ¸¶µµ ºÎÁ·ÇÏ°ÚÁö¸¸) Troll Tech's Technical FAQ¿¡ ³ª¿À´Â ÀÌÁø ȣȯÀ» À¯ÁöÇϱâ À§ÇØ C++¿¡¼­ »ç¿ëÇÏ¸é ¾ÈµÇ´Â °ÍµéÀÇ ¸ñ·ÏÀÌ´Ù.

  1. °¡»óÇÔ¼ö¸¦ Àç ±¸ÇöÇϴ°Í(±×·¸Áö ¾ÊÀ¸¸é ¿ø·¡ÀÇ ±¸Çö¿¡¼­´Â ¾ÈÀüÇÏ´Ù). ¿Ö³ÄÇϸé ÄÄÆÄÀÏ·¯´Â ÄÄÆÄÀϽÿ¡(¸µÅ©½Ã°¡ ¾Æ´Ï¶ó) SuperClass::virtualFunction()¸¦ ±¸Çϱ⠶§¹®ÀÌ´Ù.

  2. °¡»ó ¸â¹öÇÔ¼ö¸¦ ´õÇϰųª Á¦°ÅÇϴ°Í. ¿Ö³ÄÇϸé ÀÌ°ÍÀº ¸ðµç ¼­ºêŬ·¡½ºÀÇ vtlbÀÇ Å©±â¿Í ±¸Á¶¸¦ ¹Ù²Ù±â ¶§¹®ÀÌ´Ù.

  3. µ¥ÀÌÅÍ ¸â¹öÀÇ Å¸ÀÔÀ» ¹Ù²Ù°Å³ª ÀζóÀÎ ¸â¹öÇÔ¼ö¸¦ ÅëÇØ Á¢±ÙÇÒ ¼ö ÀÖ´Â µ¥ÀÌÅÍ ¸â¹ö¸¦ ¿Å±â´Â°Í.

  4. »õ ³ëµå¸¦ Ãß°¡ÇÏ´Â °Í ÀÌ¿Ü¿¡ Ŭ·¡½º ±¸Á¶¸¦ ¹Ù²Ù´Â°Í.

  5. privateµ¥ÀÌÅÍ ¸â¹ö¸¦ Ãß°¡Çϰųª »èÁ¦Çϴ°Í. ¿Ö³ÄÇϸé ÀÌ°ÍÀº ¸ðµç ¼­ºêŬ·¡½ºÀÇ Å©±â¿Í ±¸Á¶¸¦ ¹Ù²Ù±â ¶§¹®ÀÌ´Ù.

  6. ÀζóÀÎÀÌ ¾Æ´Ñ public, protected ¸â¹ö ÇÔ¼ö¸¦ Á¦°ÅÇϴ°Í.

  7. public, protected ¸â¹öÇÔ¼ö¸¦ inlineÀ¸·Î ¸¸µå´Â°Í.

  8. inlineÇÔ¼ö¸¦ ¹Ù²Ù¾î¼­, ¿¹Àü¹öÀüÀÌ Á¦´ë·Î ÀÛµ¿ÇÏÁö ¾Ê´Â°Í.

  9. Æ÷ÆÃÇÒ ÇÁ·Î±×·¥ÀÇ ¸â¹ö ÇÔ¼öÀÇ Á¢±Ù±ÇÇÑ(public, protected, private)À» ¹Ù²Ù´Â°Í. ¿Ö³ÄÇϸé, ¾î¶² ÄÄÆÄÀÏ·¯´Â ÇÔ¼öÀÇ À̸§¿¡ Á¢±Ù±ÇÇÑÀ» ºÙÀ̱⠶§¹®ÀÌ´Ù.

À§ÀÇ ÁÖ¾îÁø ¸ñ·Ï´ë·Î, C++¶óÀ̺귯¸® °³¹ßÀÚµéÀº ¶§¶§·Î ÀÌÁø ȣȯ¼ºÀ» ±ú´Â ¾÷µ¥ÀÌÆ®¸¦ °èȹÇؾ߸¸ÇÑ´Ù. ´ÙÇེ·´°Ôµµ, À¯´Ð½º ±â¹Ý ½Ã½ºÅÛÀº µ¿½Ã¿¡ ·ÎµåµÇ´Â ¶óÀ̺귯¸®ÀÇ ¸¹Àº ¹öÀüÀ» °¡Áö°í À־, µð½ºÅ© °ø°£À» Á¶±Ý ÇÒ´çÇÑ´Ù¸é, À¯ÀúµéÀº ¿¹ÀüÀÇ ¶óÀ̺귯¸®¸¦ ¿ä±¸ÇÏ´Â ``¿¹Àü''ÇÁ·Î±×·¥À» µ¹¸±¼ö ÀÖ´Ù.


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

µ¿Àû ÀûÀç ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ¶§°¡ ¾Æ´Ñ ´Ù¸¥ ½Ã±â¿¡ ÀûÀçµÇ´Â ¶óÀ̺귯¸®ÀÌ´Ù. À̰͵éÀº Ç÷¯±×ÀÎÀ̳ª ¸ðµâÀ» ±¸ÇöÇÒ¶§ ÀûÇÕÇÏ´Ù. ¿Ö³ÄÇÏ¸é ±×°ÍµéÀÌ ÇÊ¿äÇØÁú¶§±îÁö ÀûÀ縦 ±â´Ù¸± ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¿¹¸¦µé¾î, PAM(Pluggable Authentication Modules)½Ã½ºÅÛÀº °ü¸®ÀÚ°¡ ÀÎÁõÀ» °ü¸®ÇÏ´Â °ÍÀ» Çã¿ëÇϱâ À§ÇØ DL¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ´Ù. À̰͵éÀº ¶ÇÇÑ ¶§¶§·Î Äڵ带 ¸Ó½Å ÄÚµå·Î ¹Ù²Ù°í È¿À²À» À§ÇØ ¸ØÃßÁö ¾Ê°í ÄÄÆÄÀÏµÈ ÄÚµå·Î ¸¸µå´Â ÀÎÅÍÇÁ¸®Å͸¦ ±¸ÇöÇϴµ¥ À¯¿ëÇÏ´Ù. ÀÌ°ÍÀº ½Ç½Ã°£ÀÇ(just-in-time) ÄÄÆÄÀÏ·¯³ª MUD(multi-user dungeon)À» ±¸ÇöÇϴµ¥¿¡ À¯¿ëÇÏ´Ù.

¸®´ª½º¿¡¼­, DL ¶óÀ̺귯¸®´Â ±×µéÀÇ Æ÷¸äÀÇ °üÁ¡¿¡ À־ Ưº°ÇÏÁö ¾Ê´Ù; ±×µéÀº Ç¥ÁØÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏ·Î ¸¸µé¾îÁö°Å³ª, À§¿¡¼­ ¾ð±ÞµÈ Ç¥ÁØÀÇ °øÀ¯ ¶óÀ̺귯¸® ÆÄÀÏ·Î ¸¸µé¾îÁø´Ù. ÁÖ¿ä Â÷ÀÌÁ¡Àº ÇÁ·Î±×·¥ÀÇ ¸µÅ©½Ã³ª ½ÃÀ۽ÿ¡ ÀûÀçµÇÁö ¾Ê´Â´Ù´Â °ÍÀÌ´Ù; ´ë½Å, ¶óÀ̺귯¸®¸¦ ¿­°Å³ª, ½Éº¼À» ã°Å³ª, ¿¡·¯¸¦ Á¶Á¤Çϰųª, ¶óÀ̺귯¸®¸¦ ´Ý´Â Ưº°ÇÑ API°¡ ÀÖ´Ù. C »ç¿ëÀÚµéÀº ÀÌ·± API¸¦ »ç¿ëÇϱâÀ§ÇØ dlfcn.h¶ó´Â Çì´õÆÄÀÏÀ» Æ÷ÇÔÇØ¾ß ÇÑ´Ù.

¸®´ª½º¿¡¼­ »ç¿ëµÇ´Â ÀÎÅÍÆäÀ̽º´Â ¼Ö¶ó¸®½º¿¡¼­ »ç¿ëµÇ´Â ÀÎÅÍÆäÀ̽º¿Í °°´Ù. ÀÌ°ÍÀ» ³ª´Â ``dlopen()'' API¶ó°í ºÒ¸¦ °ÍÀÌ´Ù. ±×·¯³ª, ÀÌ °°Àº ÀÎÅÍÆäÀ̽º°¡ ¸ðµç Ç÷§Æû¿¡¼­ Áö¿øµÇ´Â °ÍÀº ¾Æ´Ï´Ù; HP-UX´Â shl_load()¹æ¹ýÀ» »ç¿ëÇÏ°í, À©µµ¿ìÁî´Â ¿ÏÀüÈ÷ ´Ù¸¥ ÀÎÅÍÆäÀ̽ºÀÇ DLLsÀ» »ç¿ëÇÑ´Ù. ¸¸¾à ´ç½ÅÀÌ Æø³ÐÀº Æ÷ÆüºÀÌ ¸ñÇ¥¶ó¸é, ´ç½ÅÀº ÀÌ·± ´Ù¸¥ Ç÷§ÆûÀ» ¼û±â´Â ¶óÀ̺귯¸®¸¦ »ý°¢ÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÇϳªÀÇ ¹æ¹ýÀº ¸ðµâÀÇ µ¿Àû ÀûÀ縦 Áö¿øÇÏ´Â glib ¶óÀ̺귯¸®ÀÌ´Ù; ±×°ÍÀº ÀÌ ÇÔ¼öµéÀÇ Æ÷Æð¡´ÉÇÑ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϱâÀ§ÇØ Ç÷§ÆûÀÇ µ¿Àû ÀûÀç ·çƾÀ» »ç¿ëÇÑ´Ù. http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.htmlÀÇ ¸µÅ©¿¡¼­ glib¿¡ ´ëÇØ ¸¹Àº °ÍÀ» ã¾Æº¼ ¼ö ÀÖ´Ù. glib ÀÎÅÍÆäÀ̽º°¡ ÀÌ ¹®¼­¿¡ Àß ¼³¸íµÇÀֱ⠶§¹®¿¡ ´õ ¾ð±ÞÇÏÁö ¾Ê°Ú´Ù. ´Ù¸¥ ¹æ¹ýÀº GNU libtoolÀÇ ÀϺÎÀÎ libltdlÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ´ç½ÅÀÌ À̰ͺ¸´Ù ´õ ±â´ÉÀûÀΰÍÀ» ¿øÇÑ´Ù¸é, CORBA ORB(Object Request Broker)¸¦ ã¾Æº¸¾Æ¶ó. ´ç½ÅÀÌ ¸®´ª½º¿Í ¼Ö¶ó¸®½º¿¡¼­ Á÷Á¢ Áö¿øµÇ´Â °ÍÀ» ¾ÆÁ÷µµ ¿øÇÏ°í ÀÖ´Ù¸é, °è¼Ó Àо°¡¶ó.


4.1. dlopen()

dlopen(3)ÇÔ¼ö´Â ¶óÀ̺귯¸®¸¦ ¿­°í ±×°ÍÀÌ »ç¿ëµÇµµ·Ï Áغñ½ÃÄÑÁØ´Ù. C¿¡¼­ ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù:

  void * dlopen(const char *filename, int flag);
ÆÄÀÏÀ̸§ÀÌ ``/''(Áï, Àý´ë°æ·Î)·Î ½ÃÀÛÇÑ´Ù¸é dlopen()Àº Áï½Ã »ç¿ëÇÏ·Á ÇÑ´Ù(¶óÀ̺귯¸®¸¦ ãÀ¸·Á ÇÏÁö ¾Ê´Â´Ù). ±×·¸Áö ¾ÊÀ¸¸é, dlopen()Àº ´ÙÀ½°ú °°Àº ¼ø¼­·Î ¶óÀ̺귯¸®¸¦ ã´Â´Ù:

  1. »ç¿ëÀÚÀÇ LD_LIBRARY_PATHÀÇ È¯°æº¯¼öÀÇ ÄÝ·ÐÀ¸·Î ±¸ºÐÁö¾îÁø µð·ºÅ丮

  2. (/etc/ld.so.conf¿¡¼­ ÆÄ»ýµÈ) /etc/ld.so.cache¿¡ ¸í½ÃµÇ¾îÀÖ´Â ¶óÀ̺귯¸®ÀÇ ¸ñ·Ï

  3. /lib, /usr/lib. ¼ø¼­¸¦ ÁÖÀÇÇ϶ó; ÀÌ°ÍÀº ¿¹ÀüÀÇ a.out·Î´õ°¡ »ç¿ëÇÑ ¼ø¼­ÀÇ ¿ªÀÌ´Ù. ¿¹ÀüÀÇ a.out·Î´õ´Â ÇÁ·Î±×·¥À» ·ÎµåÇÒ¶§ /usr/libÀ» ã°í /libÀ» ã¾Ò´Ù(ld.so(8)ÀÇ manÆäÀÌÁö¸¦ Âü°íÇ϶ó). º¸ÅëÀº ¾î¶² µð·ºÅ丮³ª ´Ù¸¥µð·ºÅ丮 Çϳª¿¡¸¸ ¶óÀ̺귯¸®°¡ Àֱ⠶§¹®¿¡(µÑ´Ù ¾øÀ»¼öµµ ÀÖ´Ù) ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. ±×¸®°í °°ÀºÀ̸§À» °¡Áø ´Ù¸¥ ¶óÀ̺귯¸®´Â ÀáÀçÀûÀÎ À§ÇèÀ» °¡Áö°í ÀÖ´Ù.

dlopen()¿¡¼­ flagÀÇ °ªÀº ``µ¿Àû ¶óÀ̺귯¸®°¡ ½ÇÇàµÇ¸é¼­ ÄÚµåÀÇ Á¤ÀǵÇÁö ¾ÊÀº ½Éº¼À» ó¸®Ç϶ó''ÀÇ Àǹ̸¦ °¡Áø RTLD_LAZYÀ̰ųª, ``dlopen()ÀÌ ¸®ÅÏÇϱâ Àü¿¡ ¸ðµç Á¤ÀǵÇÁö ¾ÊÀº ½Éº¼À» ó¸®ÇÏ°í, ±×°ÍÀÌ µÇÁö ¾ÊÀ» °æ¿ì ½ÇÆÐÇ϶ó''ÀÇ Àǹ̸¦ Áö´Ñ RTLD_NOW°¡ ÀÖ´Ù. RTLD_GLOBALÀº flagÀÇ °ª¼Ó¿¡ ¿É¼ÇÀ¸·Î ¾µ¼ö ÀÖ´Ù. Àǹ̴ ¶óÀ̺귯¸®¿¡ ÀûÀçµÇ´Â ¿ÜºÎ ½Éº¼µéÀº ±× ÈÄ¿¡ ÀûÀçµÇ´Â ¶óÀ̺귯¸®¿¡ ÀÇÇؼ­ °¡´ÉÇÏ´Ù´Â °ÍÀÌ´Ù. µð¹ö±ë½Ã¿¡, RTLD_NOW¸¦ ¾²±â¸¦ ¿øÇÒ°ÍÀÌ´Ù; RTLD_LAZY´Â Á¤ÀǵÇÁö ¾ÊÀº ½Éº¼ÀÌ ÀÖÀ¸¸é ¾Ë¾Æº¼¼ö ¾ø´Â ¿¡·¯¸¦ ³»±â ¶§¹®ÀÌ´Ù. RTLD_NOW¸¦ ¾²¸é¼­ ¶óÀ̺귯¸®¸¦ ¿©´Â °ÍÀº ¾à°£ÀÇ ½Ã°£ÀÌ ´õ °É¸°´Ù(ÇÏÁö¸¸ ³ªÁß¿¡ ã´Â ¼Óµµ´Â »¡¶óÁø´Ù); ¸¸¾à ÀÌ°ÍÀÌ À¯Àú ÀÎÅÍÆäÀ̽º ¹®Á¦¸¦ ÀÏÀ¸Å²´Ù¸é, ´ç½ÅÀº ³ªÁß¿¡ RTLD_LAZY·Î ¹Ù²Ü ¼ö ÀÖ´Ù.

¶óÀ̺귯¸®µéÀÌ ¼­·Î ÀÇÁ¸ÇÑ´Ù¸é(¿¹¸¦µé¾î X°¡ Y¿¡ ÀÇÁ¸ÇÑ´Ù¸é), ´ç½ÅÀº ÀÇÁ¸´çÇÏ´Â °ÍÀ» ¸ÕÀú ·ÎµåÇؾßÇÑ´Ù(ÀÌ ¿¹Á¦¿¡¼­ Y¸¦ ·ÎµåÇÏ°í X¸¦ ·ÎµåÇØ¾ß ÇÑ´Ù).

dlopen()ÀÇ ¸®ÅÏ °ªÀº ´Ù¸¥ DL¶óÀ̺귯¸® ·çƾÀÌ »ç¿ëÇϱ⿡ ¾Ö¸Å¸ðÈ£ÇÏ°Ô ´À²¸Áö´Â ``ÇÚµé''ÀÌ´Ù. dlopen()Àº ·Îµå°¡ ¼º°øÇÏÁö ¸øÇϰųª ´ç½ÅÀÌ Ã¼Å©ÇØ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù°í »ý°¢Çϸé NULLÀ» ¸®ÅÏÇÑ´Ù. dlopen()¿¡ ÀÇÇØ °°Àº ¶óÀ̺귯¸®°¡ ÇѹøÀÌ»ó ·ÎµåµÇ¸é °°Àº ÆÄÀÏ ÇÚµéÀÌ ¸®ÅϵȴÙ.

¶óÀ̺귯¸®°¡ _initÀ̶ó À̸§Áö¾îÁø ·çƾÀ» »ç¿ëÇÑ´Ù¸é(export), ±× ÄÚµå´Â dlopen()ÀÌ ¹ÝȯÇϱâ Àü¿¡ ½ÇÇàµÈ´Ù. ´ç½ÅÀº ÃʱâÈ­ ·çƾÀ» ±¸ÇöÇϱâÀ§ÇØ ´ç½ÅÀÇ ¶óÀ̺귯¸®¿¡¼­ ÀÌ »ç½ÇÀ» »ç¿ëÇßÀ»°ÍÀÌ´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀ» À§ÇØ 5.2절À» º¸¾Æ¶ó.


4.2. dlerror()

¿¡·¯´Â dlerror()¸¦ È£ÃâÇÔÀ¸·Î½á º¸°íµÉ¼ö ÀÖ´Ù. dlerror()´Â dlerror(), dlsym(), dlclose()Áß ¸¶Áö¸· ºÎ¸¥°ÍÀÇ ¿¡·¯ÀÇ ½ºÆ®¸µÀ» ¹ÝȯÇÑ´Ù. ÇϳªÀÇ ÀÌ»óÇÑÁ¡Àº dlerror()¸¦ ºÎ¸£°í ³ª¼­ dlerror()¸¦ ºÎ¸£´Â °ÍÀº ±× »çÀÌ¿¡ ´Ù¸¥ ¿¡·¯°¡ ¾øÀ¸¸é NULLÀ» ¹ÝȯÇÑ´Ù´Â °ÍÀÌ´Ù.


4.3. dlsym()

´ç½ÅÀÌ »ç¿ëÇÒ ¼ö ¾ø´Ù¸é DL¶óÀ̺귯¸®¸¦ ·ÎµùÇÏ´Â Àǹ̰¡ ¾ø´Ù. DL¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â Áß¿äÇÑ ·çƾÀº dlsym(3)ÀÌ´Ù. ÀÌ°ÍÀº ¿­·ÁÁø ¶óÀ̺귯¸®ÀÇ ½Éº¼ÀÇ °ªÀ» ã¾ÆÁØ´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵȴÙ:

 void * dlsym(void *handle, char *symbol);
ÇÚµéÀº dlopen¿¡ ÀÇÇØ ¹ÝȯµÈ °ªÀÌ°í, ½Éº¼Àº NIL·Î ³¡³ª´Â ½ºÆ®¸µÀÌ´Ù. ´ç½ÅÀÌ ÇÒ ¼ö ÀÖ´Ù¸é ÀÖ´Ù¸é, dlsym()ÀÇ °á°ú¸¦ void* Æ÷ÀÎÅÍ·Î ÀúÀåÇÏÁö ¸¶¶ó. ¿Ö³ÄÇϸé, ´ç½ÅÀº »ç¿ëÇÒ¶§¸¶´Ù ij½ºÆ®Çؼ­ »ç¿ëÇØ¾ß Çϱ⶧¹®ÀÌ´Ù(±×¸®°í ´Ù¸¥»ç¶÷µéÀÌ ÇÁ·Î±×·¥À» À¯ÁöÇϴµ¥¿¡ ´õ ÀûÀº Á¤º¸¸¦ ÁÙ°ÍÀÌ´Ù).

dlsym()Àº ½Éº¼ÀÌ ¾øÀ¸¸é NULLÀ» ¹ÝȯÇÒ °ÍÀÌ´Ù. ¸¸¾à ´ç½ÅÀÇ ½Éº¼¿¡ NULLÀ̳ª 0ÀÌ ¾ø´Ù´Â °ÍÀ» ¾Ë¸é ÁÁ°ÚÁö¸¸, ´ÙÀ½°ú °°Àº ÀáÀçÀûÀÎ ¹®Á¦°¡ ÀÖ´Ù: ´ç½ÅÀÌ ¹ÞÀº NULLÀÌ ¿¡·¯Àΰ¡, ¾Æ´Ï¸é ½Éº¼ÀÇ °ªÀÌ NULLÀΰ¡? Ç¥ÁØÀûÀÎ ÇØ°á¹ýÀº dlerror()¸¦ ºÎ¸£°í(Àü¿¡ ÀÖ´ø ¿¡·¯µéÀ» ¾ø¾Ø´Ù), dlsym()À» ºÒ·¯¼­ ½Éº¼ÀÇ °ªÀ» ºÎ¸£°í, dlerror()¸¦ ºÒ·¯¼­ ¿¡·¯°¡ ³µ´ÂÁö üũÇÑ´Ù. ´Ü¼øÇÑ ÄÚµå´Â ´ÙÀ½°ú °°´Ù:

 dlerror(); /* clear error code */
 s = (actual_type) dlsym(handle, symbol_being_searched_for);
 if ((err = dlerror()) != NULL) {
  /* handle error, the symbol wasn't found */
 } else {
  /* symbol found, its value is in s */
 }


4.4. dlclose()

dlopen()ÀÇ ¹Ý´ë´Â dlclose()·Î¼­, DL ¶óÀ̺귯¸®¸¦ ´Ý¾ÆÁØ´Ù. DL ¶óÀ̺귯¸®°¡ µ¿Àû ÆÄÀÏ ÇÚµéÀÇ ¸µÅ© ¼ö¸¦ °ü¸®Çϱ⠶§¹®¿¡, µ¿Àû ¶óÀ̺귯¸®´Â dlopenÀÌ ¼º°øÇÑ ¸¸Å­ ¸ðµÎ dlclose¸¦ ºÒ·¯ÁÖ±â Àü¿¡ ´Ù ÇÒ´çÀÌ ¾ø¾îÁöÁö´Â ¾Ê´Â´Ù. µû¶ó¼­, °°Àº ÇÁ·Î±×·¥ÀÌ °°Àº ¶óÀ̺귯¸®¸¦ ¿©·¯¹ø ºÒ·¯Áִ°ÍÀº ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. ¶óÀ̺귯¸®°¡ ÇÒ´çÀÌ ¾ø¾îÁø´Ù¸é, ÇÔ¼öÀÇ _fini°¡ ºÒ¸°´Ù(Á¸ÀçÇÑ´Ù¸é); ´õ ÀÚ¼¼ÇÑ Á¤º¸¸¦ À§ÇØ 5.2절¸¦ º¸¾Æ¶ó. ÁÖÀÇÇ϶ó : dlclose()´Â ¼º°øÇϸé 0À» ¸®ÅÏÇÏ°í, ¾Æ´Ï¸é 0ÀÌ ¾Æ´Ñ °ªÀ» ¸®ÅÏÇÑ´Ù; ¾î¶² ¸®´ª½º ¸Þ´º¾óÀº ÀÌ°ÍÀ» ¾ð±ÞÇÏ°í ÀÖÁö ¾Ê´Ù.


4.5. DL ¶óÀ̺귯¸® ¿¹Á¦

¿©±â¿¡ ÀÖ´Â ¿¹Á¦´Â dlopen(3)ÀÇ ¸ÇÆäÀÌÁö¿¡ ³ª¿À´Â ¿¹Á¦ÀÌ´Ù. ÀÌ ¿¹Á¦´Â math¶óÀ̺귯¸®¸¦ ·ÎµåÇؼ­, ÄÚ»çÀÎ 2.0À» Ãâ·ÂÇÑ´Ù. ¶ÇÇÑ, °¢°¢ÀÇ ´Ü°è¿¡¼­ ¿¡·¯ üũ¸¦ ÇÑ´Ù(ÀÌ·¸°Ô Çϱ⸦ ÃßõÇÑ´Ù).


    #include <stdlib.h>
    #include <stdio.h>
    #include <dlfcn.h>

    int main(int argc, char **argv) {
        void *handle;
        double (*cosine)(double);
        char *error;

        handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
        if (!handle) {
            fputs (dlerror(), stderr);
            exit(1);
        }

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

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

¸¸¾à ÀÌ ÇÁ·Î±×·¥ÀÇ ÆÄÀÏÀ̸§ÀÌ "foo.c"¶ó¸é, ´ÙÀ½°ú °°Àº ¸í·ÉÀ¸·Î ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖÀ» °ÍÀÌ´Ù:

    gcc -o foo foo.c -ldl


5. Miscellaneous

5.1. nm ¸í·É

nm(1)¸í·ÉÀº ÁÖ¾îÁø ¶óÀ̺귯¸®ÀÇ ½Éº¼ÀÇ ¸®½ºÆ®¸¦ º¸°íÇÑ´Ù. ÀÌ°ÍÀº Á¤Àû, °øÀ¯ ¶óÀ̺귯¸®¿¡¼­ ¸ðµÎ µ¿ÀÛÇÑ´Ù. ÁÖ¾îÁø ¶óÀ̺귯¸®¿¡¼­, nm(1)Àº Á¤ÀÇµÈ ½Éº¼ÀÇ À̸§, °¢°¢ÀÇ ½Éº¼ÀÇ °ª, ½Éº¼ÀÇ Å¸ÀÔÀ» ³ª¿­ÇÑ´Ù. ÀÌ°ÍÀº ¶ÇÇÑ ¶óÀ̺귯¸®¿¡¼­ °¡´ÉÇÏ´Ù¸é(-l¿É¼ÇÀ» º¸¶ó), ½Éº¼ÀÌ ¼Ò½ºÄÚµåÀÇ ¾îµð¿¡¼­ Á¤ÀǵǾú´ÂÁö ¾Ë·ÁÁØ´Ù(ÆÄÀÏÀ̸§°ú ÁÙ ¹øÈ£¸¦ Ç¥½ÃÇÔÀ¸·Î¼­).

½Éº¼Å¸ÀÔÀº ´õ ¸¹Àº ¼³¸íÀ» ¿ä±¸ÇÑ´Ù. ŸÀÔÀº ÇѱÛÀڷνá Ç¥½ÃµÈ´Ù; ¼Ò¹®Àڴ ŸÀÔÀÌ Áö¿ªÀûÀ̶ó´Â °ÍÀÌ°í, ´ë¹®Àڴ ŸÀÔÀÌ Àü¿ªÀû(¿ÜºÎÀû)À̶ó´Â °ÍÀ» ÀǹÌÇÑ´Ù. º¸ÅëÀÇ ½Éº¼Å¸ÀÔµéÀº ´ÙÀ½°ú °°´Ù. T (Äڵ弽¼Ç¿¡¼­ º¸ÅëÀÇ Á¤ÀÇ), D (ÃʱâÈ­ µ¥ÀÌÅÍ ¼½¼Ç), B (ÃʱâÈ­µÇÁö ¾ÊÀº µ¥ÀÌÅÍ ¼½¼Ç), U (Á¤ÀǵÇÁö ¾ÊÀ½; ½Éº¼ÀÌ ¶óÀ̺귯¸®¿¡ÀÇÇØ »ç¿ëµÇÁö¸¸ ¶óÀ̺귯¸®¿¡ ÀÇÇØ Á¤ÀǵÇÁö ¾Ê¾Ò´Ù), W (¾àÇÔ; ´Ù¸¥ ¶óÀ̺귯¸®°¡ ÀÌ ½Éº¼À» Á¤ÀÇÇÑ´Ù¸é, ±× Á¤ÀÇ°¡ ÀÌ Á¤ÀǸ¦ ¿À¹ö¶óÀ̵å ÇÒ ¼ö ÀÖ´Ù).

´ç½ÅÀÌ ÇÔ¼öÀÇ À̸§À» ¾ËÁö¸¸, ¾î¶² ¶óÀ̺귯¸®¿¡¼­ Á¤ÀǵÇÀÖ´ÂÁö ±â¾ïÇÏÁö ¸øÇÑ´Ù¸é, grepÀ¸·Î ¶óÀ̺귯¸®¸¦ ãÀ¸¸é¼­ nmÀÇ ``-o''¿É¼Ç(°¢°¢ÀÇ ÁÙÀÇ ÆÄÀÏ À̸§À» ¾Õ¿¡ ºÙÀδÙ)À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. bash¿¡¼­ ´ç½ÅÀº /lib, /usr/lib¿Í /usr/lib, /usr/local/libÀÇ ÇϺΠµð·ºÅ丮¿¡¼­ ``cos''¸¦ ´ÙÀ½°ú °°ÀÌ Ã£À» ¼ö ÀÖ´Ù.

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

nm¿¡ ´ëÇØ ´õ ¸¹Àº °ÍÀ» ¾Ë°í ½ÍÀ¸¸é info:binutils#nm¿¡ ``Á¤º¸'' ¹®¼­°¡ ÀÖµû.


5.2. Ưº°ÇÔ¼ö _init, _fini

µÎ°³ÀÇ Æ¯º°ÇÑ ÇÔ¼ö°¡ ÃʱâÈ­¿Í Á¾°áÈ­ÀÇ ¸ðµÑÀ» µ½´Â´Ù:_init¿Í _fini. ``_init''ÇÔ¼ö°¡ ¶óÀ̺귯¸®¿¡ ÀÇÇØ ³»º¸³»Áø´Ù¸é, ¶óÀ̺귯¸®°¡ óÀ½¿¡ ¿­¾îÁú¶§ ºÒ¸±°ÍÀÌ´Ù(dlopen()À̳ª °øÀ¯¶óÀ̺귯¸®ÀÇ ÇüÅ·Î). C ÇÁ·Î±×·¥¿¡¼­, ÀÌ°ÍÀº ´ç½ÅÀÌ _initÀ̶õ À̸§ÀÌ ºÙÀº ¾î¶² ÇÔ¼ö¸¦ Á¤ÀÇÇß´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ÀÌ°Í¿¡ ´ëÇÑ _finiÇÔ¼ö°¡ Àִµ¥, ÀÌ°ÍÀº Ŭ¶óÀ̾ðÆ®°¡ ¶óÀ̺귯¸® »ç¿ëÀ» ³¡³¾¶§ ºÒ¸®´Â ÇÔ¼öÀÌ´Ù(0³ª ÇÁ·Î±×·¥ÀÇ Á¤»óÁ¾·á¸¦ °¡Á®¿À´Â dlclose()ÀÇ ÇüÅ·Î). ÀÌ ÇÔ¼öÀÇ C ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù:

  void _init(void);
  void _fini(void);

``.o''ÆÄÀÏÀ» gcc¿¡¼­ ÄÄÆÄÀÏ ÇÒ ¶§, ``-nostartfiles''¿É¼ÇÀ» ³Ö¾î¶ó. ÀÌ°ÍÀº CÄÄÆÄÀÏ·¯°¡ .soÆÄÀÏ¿¡ ´ëÇØ ½Ã½ºÅÛ ½ÃÀÛ ¶óÀ̺귯¸®¸¦ ¸µÅ©Çϵµ·Ï ÇØÁØ´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ´ç½ÅÀº ``multiple=definition''¿¡·¯¸¦ ¸¸³¯ °ÍÀÌ´Ù. Jim Mischel°ú Tim GentryÀÌ _init, _finiÇÔ¼ö¿¡ ´ëÇÑ ³íÀÇ¿¡¼­ ±ÛÀ» ¾²´Âµ¥ µµ¿òÀ» ÁáÀ» »Ó¸¸ ¾Æ´Ï¶ó ÀÌ·± Á¦¾ÈÀ» ÇØÁØ°Í¿¡ ÀÇÇØ °¨»çÇÑ´Ù.


5.3. °øÀ¯ ¶óÀ̺귯¸®´Â ½ºÅ©¸³Æ®°¡ µÉ ¼ö ÀÖ´Ù

GNU ·Î´õ°¡ Ưº°ÇÑ ½ºÅ©¸³Æ® ¾ð¾î¸¦ ÅëÇØ º¸ÅëÀÇ ¶óÀ̺귯¸® Çü½Ä´ë½Å ÅؽºÆ® ÆÄÀÏÀÇ ÇüÅ·Π°øÀ¯ ¶óÀ̺귯¸®¸¦ À¯ÁöÇÏ°Ô Çϴ°ÍÀº Àǹ̰¡ ¾ø´Ù. ÀÌ°ÍÀº °£Á¢ÀûÀ¸·Î ´Ù¸¥ ¶óÀ̺귯¸®¸¦ ÇÕÄ¡°Ô µÊÀ¸·Î¼­ À¯¿ëÇÏ´Ù. ¿¹¸¦µé¾î, ³ªÀÇ ½Ã½ºÅÛÁß Çϳª¿¡¼­ µ¹¾Æ°¡´Â /usr/lib/libc.soÀÇ ¸®½ºÆ®°¡ ÀÖ´Ù:

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )

ÀÌ°Í¿¡ ´ëÇØ ´õ ¸¹Àº Á¤º¸¸¦ ¾ò±âÀ§ÇØ ld¸µÄ¿ ½ºÅ©¸³Æ®¸¦ º¸¾Æ¶ó(ld¸í·É¾î). ÀϹÝÀûÀÎ Á¤º¸´Â info:ld#Options¿Í info:ld#Commands¿¡¼­ ¾òÀ»¼ö ÀÖ°í, info:ld#Option Commands¿¡¼­ ¸í·É¾îÀÇ Á¤º¸¸¦ ¾òÀ»¼ö ÀÖ´Ù.


5.4. GNU libtool

¸¸¾à ´ç½ÅÀÌ ´Ù¸¥ ¸¹Àº ½Ã½ºÅÛ¿¡ Æ÷ÆÃÇÒ ÀÀ¿ëÇÁ·Î±×·¥À» Á¦ÀÛÇÑ´Ù¸é, ´ç½ÅÀº ¶óÀ̺귯¸®¸¦ ¸¸µé°í ¼³Ä¡Çϱâ À§ÇØ GNU libtool¸¦ »ç¿ëÇϴ°ÍÀ» °í·ÁÇØ¾ß ÇÒ °ÍÀÌ´Ù. GNU libtoolÀº ½ºÅ©¸³Æ®¸¦ Áö¿øÇÏ´Â ÀϹÝÀûÀÎ ¶óÀ̺귯¸®ÀÌ´Ù. LibtoolÀº ÀÏ°üÀûÀÌ°í Æ÷Æð¡´ÉÇÑ ÀÎÅÍÆäÀ̽º¼Ó¿¡ °øÀ¯¶óÀ̺귯¸®ÀÇ º¹Àâµµ¸¦ ÁÙ¿©ÁØ´Ù. LibtoolÀº ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ¸¸µé°í, (Á¤Àû, °øÀ¯)¶óÀ̺귯¸®¸¦ ¸µÅ©ÇÏ°í, ½ÇÇàÆÄÀÏÀ» ¸µÅ©ÇÏ°í, ½ÇÇàÆÄÀÏÀ» µð¹ö±×ÇÏ°í, ¶óÀ̺귯¸®¸¦ ¼³Ä¡ÇÏ°í, ½ÇÇàÆÄÀÏÀ» ¼³Ä¡Çϴµ¥ Æ÷Æð¡´ÉÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. ÀÌ°ÍÀº ¶ÇÇÑ libltdlÀ» Æ÷ÇÔÇϴµ¥, µ¿Àû ÀûÀç ÇÁ·Î±×·¥ÀÇ Æ÷Æð¡´ÉÇÑ °¨½Î´Â ¿ªÇÒÀ» ÇÑ´Ù. ´õ ¸¹Àº Á¤º¸¸¦ À§Çؼ­ http://www.gnu.org/software/libtool/manual.htmlÀÇ ¹®¼­¸¦ Âü°íÇ϶ó.


5.5. °ø°£À» À§ÇØ ½Éº¼À» Á¦°ÅÇϱâ

»ý¼ºµÈ ÆÄÀÏ¿¡ Æ÷ÇԵǴ ¸ðµç ½Éº¼Àº µð¹ö±ë¿¡ À¯¿ëÇÏÁö¸¸, ³Ê¹« ¸¹Àº °ø°£À» Â÷ÁöÇÑ´Ù. ¸¸¾à °ø°£ÀÌ ÇÊ¿äÇÏ´Ù¸é, ±×°ÍµéÀÇ ÀϺθ¦ Áö¿ö¶ó.

ÃÖ¼±ÀÇ Á¢±Ù¹ýÀº ¿ÀºêÁ§Æ® ÆÄÀÏÀ» Á¤»óÀûÀ¸·Î »ý¼ºÇÏ°í, µð¹ö±ë°ú °Ë»ç¸¦ ¸ÕÀúÇÑ´Ù(À̰͵éÀ» °¡Áö°í µð¹ö±ë, °Ë»ç¸¦ Çϴ°ÍÀº ¸Å¿ì ÆíÇÏ´Ù). ±×¸®°í³ª¼­, ÇÁ·Î±×·¥À» ¿ÏÀüÈ÷ °Ë»çÇßÀ¸¸é, strip(1)À» »ç¿ëÇؼ­ ½Éº¼µéÀ» Áö¿ö¶ó. strip(1) ¸í·ÉÀº ½Éº¼À» Áö¿ì´Âµ¥ ¸¹ÀÌ Æí¸®ÇÏ°Ô ÇØÁØ´Ù; ÀÚ¼¼ÇÑ°ÍÀº ±×°ÍÀÇ ¹®¼­¸¦ ÂüÁ¶Ç϶ó.

´Ù¸¥, GNU ld¿é¼ÇÀÇ ´Ù¸¥ °ÍÀ¸·Î´Â ``-S''¿Í ``-s''°¡ ÀÖ´Ù; ``-S''´Â Ãâ·ÂÆÄÀÏ¿¡¼­ (¸ðµç ½Éº¼À̾ƴÑ)µð¹ö°Å ½Éº¼ Á¤º¸¸¦ ºü¶ß¸°´Ù. ``-s''¿É¼ÇÀº Ãâ·ÂÆÄÀÏ¿¡ ¸ðµç ½Éº¼ Á¤º¸¸¦ ½á ³Ö´Â´Ù. ``-Wl, -S''¿Í ''-Wl,-s''·Î¼­ gcc¸¦ ÅëÇØ ÀÌ ¿É¼ÇÀ» ¾µ ¼ö ÀÖ´Ù. ´ç½ÅÀÌ Ç×»ó ½Éº¼À» Á¦°ÅÇÏ°í, ÀÌ ¿É¼ÇÀÌ ºÒÇÊ¿äÇÑ°ÍÀ̶ó¸é, ±×³É ÆíÇÏ°Ô ´À²¸¶ó. ÇÏÁö¸¸, ÀÌ°ÍÀº ´ú À¯¿¬ÇÑ ¹æ¹ýÀÏ °ÍÀÌ´Ù.


5.6. ¸Å¿ì ÀÛÀº ½ÇÇàÈ­Àϵé

´ç½ÅÀº Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux¹®¼­°¡ À¯¿ëÇÏ´Ù´Â °ÍÀ» ¾Ë°ÍÀÌ´Ù. ÀÌ°ÍÀº ¸Å¿ìÀÛÀº ÇÁ·Î±×·¥µéÀÌ ¾î¶»°Ô ¸¸µå´ÂÁö ¼³¸íÇÑ´Ù. »ç½Ç, ÀϹÝÀûÀÎ »óȲ¿¡¼­ ÀÌ·± Æ®¸¯À» »ç¿ëÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÇÏÁö¸¸ ÀÌ°ÍÀº ELF°¡ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö º¸¿©ÁÖ´Â ÁÁÀº¿¹ÀÌ´Ù.


5.7. C++ÃʱâÈ­ ¼Óµµ ³ôÀ̱â

KDE °³¹ßÀÚ´Â ¸¹ÀÌ Àç ¹èÄ¡¸¦ ÇؾßÇÏ°Ô¶§¹®¿¡ Å« GUI C++ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇϴµ¥ ¿À·¡°É¸°´Ù´Â °ÍÀ» ¾È´Ù. ÀÌ°Í¿¡ ¿©·¯°¡Áö ÇØ°áÃ¥ÀÌ ÀÖ´Ù. ´õ ¸¹Àº Á¤º¸¸¦ À§ÇØ Making C++ ready for the desktop (by Waldo Bastian)¸¦ Âü°íÇ϶ó.


6. ±×¿ÜÀÇ ¿¹Á¦µé

´ÙÀ½ÀÇ ¿¹Á¦µéÀº ¸ðµç 3°¡Áö ¹æ¹ýµé(Á¤Àû, °øÀ¯, µ¿Àû ÀûÀç ¶óÀ̺귯¸®)ÀÇ ¿¹Á¦µéÀÌ´Ù. libhello.c´Â º¸ÅëÀÇ ¶óÀ̺귯¸®ÀÌ°í, libhello.h´Â Çì´õÆÄÀÏÀÌ´Ù. demo_use.c´Â º¸ÅëÀÇ ¶óÀ̺귯¸® È£Ãâ ÆÄÀÏÀÌ´Ù. ´ÙÀ½À¸·Î, Á¤Àû, °øÀ¯ ¶óÀ̺귯¸®¸¦ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö º¸¿©ÁÖ´Â script_static, script_dynamic ½ºÅ©¸³Æ®°¡ ³ª¿Â´Ù. ±×¸®°í, °øÀ¯ ¶óÀ̺귯¸®¸¦ µ¿Àû ÀûÀç ¶óÀ̺귯¸®·Î ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö º¸¿©ÁÖ´Â demo_dynamic.c, script_dynamicÀÌ ³ª¿Â´Ù.


6.1. File libhello.c

/* libhello.c - demonstrate library use. */

#include <stdio.h>

void hello(void) {
  printf("Hello, library world.\n");
}


6.2. File libhello.h

/* libhello.h - demonstrate library use. */


void hello(void);


6.3. File demo_use.c

/* demo_use.c -- demonstrate direct use of the "hello" routine */

#include "libhello.h"

int main(void) {
 hello();
 return 0;
}


6.4. File script_static

#!/bin/sh
# Static library demo

# Create static library's object file, libhello-static.o.
# I'm using the name libhello-static to clearly
# differentiate the static library from the
# dynamic library examples, but you don't need to use
# "-static" in the names of your
# object files or static libraries.

gcc -Wall -g -c -o libhello-static.o libhello.c

# Create static library.

ar rcs libhello-static.a libhello-static.o

# At this point we could just copy libhello-static.a
# somewhere else to use it.
# For demo purposes, we'll just keep the library
# in the current directory.

# Compile demo_use program file.

gcc -Wall -g -c demo_use.c -o demo_use.o

# Create demo_use program; -L. causes "." to be searched during
# creation of the program.  Note that this command causes
# the relevant object file in libhello-static.a to be
# incorporated into file demo_use_static.

gcc -g -o demo_use_static demo_use.o -L. -lhello-static

# Execute the program.

./demo_use_static


6.5. File script_shared

#!/bin/sh
# Shared library demo

# Create shared library's object file, libhello.o.

gcc -fPIC -Wall -g -c libhello.c

# Create shared library.
# Use -lc to link it against C library, since libhello
# depends on the C library.

gcc -g -shared -Wl,-soname,libhello.so.0 \
    -o libhello.so.0.0 libhello.o -lc

# At this point we could just copy libhello.so.0.0 into
# some directory, say /usr/local/lib.

# Now we need to call ldconfig to fix up the symbolic links.
 
# Set up the soname.  We could just execute:
# ln -sf libhello.so.0.0 libhello.so.0
# but let's let ldconfig figure it out.

/sbin/ldconfig -n .

# Set up the linker name.
# In a more sophisticated setting, we'd need to make
# sure that if there was an existing linker name,
# and if so, check if it should stay or not.

ln -sf libhello.so.0 libhello.so

# Compile demo_use program file.

gcc -Wall -g -c demo_use.c -o demo_use.o

# Create program demo_use.
# The -L. causes "." to be searched during creation
# of the program; note that this does NOT mean that "."
# will be searched when the program is executed.

gcc -g -o demo_use demo_use.o -L. -lhello

# Execute the program.  Note that we need to tell the program
# where the shared library is, using LD_LIBRARY_PATH.

LD_LIBRARY_PATH="." ./demo_use


6.6. File demo_dynamic.c

/* demo_dynamic.c -- demonstrate dynamic loading and
   use of the "hello" routine */


/* Need dlfcn.h for the routines to
   dynamically load libraries */
#include <dlfcn.h>

#include <stdlib.h>
#include <stdio.h>

/* Note that we don't have to include "libhello.h".
   However, we do need to specify something related;
   we need to specify a type that will hold the value
   we're going to get from dlsym(). */

/* The type "simple_demo_function" describes a function that
   takes no arguments, and returns no value: */

typedef void (*simple_demo_function)(void);


int main(void) {
 const char *error;
 void *module;
 simple_demo_function demo_function;

 /* Load dynamically loaded library */
 module = dlopen("libhello.so", RTLD_LAZY);
 if (!module) {
   fprintf(stderr, "Couldn't open libhello.so: %s\n",
           dlerror());
   exit(1);
 }

 /* Get symbol */
 dlerror();
 demo_function = dlsym(module, "hello");
 if ((error = dlerror())) {
   fprintf(stderr, "Couldn't find hello: %s\n", error);
   exit(1);
 }

 /* Now call the function in the DL library */
 (*demo_function)();

 /* All done, close things cleanly */
 dlclose(module);
 return 0;
}


6.7. File script_dynamic

#!/bin/sh
# Dynamically loaded library demo

# Presume that libhello.so and friends have
# been created (see dynamic example).

# Compile demo_dynamic program file into an object file.

gcc -Wall -g -c demo_dynamic.c

# Create program demo_use.
# Note that we don't have to tell it where to search for DL libraries,
# since the only special library this program uses won't be
# loaded until after the program starts up.
# However, we DO need the option -ldl to include the library
# that loads the DL libraries.

gcc -g -o demo_dynamic demo_dynamic.o -ldl

# Execute the program.  Note that we need to tell the
# program where get the dynamically loaded library,
# using LD_LIBRARY_PATH.

LD_LIBRARY_PATH="." ./demo_dynamic


7. ±× ¿ÜÀÇ Á¤º¸µé

¶óÀ̺귯¸®¿¡ ´ëÇÑ À¯¿ëÇÑ Á¤º¸´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ´Ù:

  • Daniel BarlowÀÇ ``The GCC HOWTO''. Ưº°È÷ ÀÌ HOWTO´Â ¶óÀ̺귯¸®¸¦ ¸¸µé°í ÁúÀÇÇÏ´Â ÄÄÆÄÀÏ·¯ ¿É¼ÇÀ» ´Ù·é´Ù. ÀÌ°ÍÀº ¿©±â¼­ ´Ù·çÁö ¸øÇÑ Á¤º¸¸¦ ´Ù·é´Ù. ÀÌ HOWTO´Â http://www.linuxdoc.org¿¡¼­ º¼ ¼ö ÀÖ´Ù.

  • TTS(the Tool Interface Standards)À§¿øȸÀÇ ``Executable and Linkable Format (ELF)''(ÀÌ ¹®¼­´Â »ç½Ç ÀÌ À§¿øȸÀÇ Æ÷Æð¡´ÉÇÑ Çü½Ä ½ºÆå v 1.1ÀÇ ÇÑ Ã©ÅÍÀÌ´Ù). ÀÌ°ÍÀº ELFÇü½Ä¿¡ °üÇÑ Á¤º¸¸¦ Á¦°øÇÏ°í, ELFÇü½Ä¿¡ °üÇÑ ÀÚ¼¼ÇÑ ¸¹Àº °ÍÀ» Á¦°øÇÑ´Ù. ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz¸¦ Âü°íÇ϶ó. ¸¸¾à MIT·ÎºÎÅÍ ÆÄÀÏÀ» ¾ò´Â´Ù¸é, Çü½ÄÀÌ ÀÌ»óÇÔ¿¡ ÁÖÀÇÇ϶ó; gunzip, untar¸¦ ÇÑ ÈÄ¿¡, À̸§À» ``ps''ÆÄÀÏ·Î ¹Ù²Ù¸é, º¸ÅëÀÇ psÆÄÀÏÀÌ µÉ °ÍÀÌ´Ù.

  • Hongjui LuÀÇ ``ELF: From the Programmer's Perspective''. ÀÌ°ÍÀº ELF¿¡ ´ëÇØ ¸®´ª½º, GCC gccÀÇ ½ºÆå Á¤º¸¸¦ º¸¿©ÁØ´Ù. ¶ÇÇÑ ÀÌ ¹®¼­´Â ftp://tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù.


8. Copyright and License

ÀÌ ¹®¼­´Â Copyright (C) 2000 David A. Wheeler¿¡ ÀÇÇØ ÀúÀÛ±ÇÀÌ ÀÖ´Ù. ÀÌ ¹®¼­´Â GNU General License(GPL)À» µû¸¥´Ù. ´ç½ÅÀº ÀÌ ¹®¼­¸¦ °øÂ¥·Î Àç ¹èÆ÷ ÇÒ ¼ö ÀÖ´Ù. ÀÌ ¹®¼­ÀÇ ¼Ò½º¸¦ ``ÇÁ·Î±×·¥''°ú ÇÔ²² ¹ø¿ªÇÏ°í, ´ÙÀ½°ú °°Àº °ÍµéÀ» µû¸£¶ó.

ÀÌ ÇÁ·Î±×·¥Àº °øÂ¥ ¼ÒÇÁÆ®¿þ¾îÀÌ´Ù; ´ç½ÅÀº Àç¹èÆ÷ ÇÒ ¼ö ÀÖ°í Free Software Foundation¿¡¼­ ³ª¿Â GNU GPLÀÇ ¿ë¾î¸¦ »ç¿ëÇؼ­ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù; ÀÌ ¹®¼­ÀÇ ¹öÀü 2³ª ±× ÀÌÈÄÀÇ ¹öÀü¿¡¼­.

ÀÌ ÇÁ·Î±×·¥Àº À¯¿ëÇÒ °ÍÀ̶ó°í ¹Ù¶ó°í ¹èÆ÷µÈ´Ù. ÇÏÁö¸¸ ¾î¶² º¸Áõ¼­µµ ¾ø´Ù; »ó¾÷ÀûÀ̰ųª Ưº°ÇÑ ¸ñÀû¿¡ ´ëÇÑ º¸ÁõÁ¶Â÷ ¾ø´Ù. ÀÚ¼¼ÇÑ°ÍÀº GNU GPLÀ» º¸¶ó.

ÀÌ ÇÁ·Î±×·¥°ú ÇÔ²² GNU GPLÀÇ º¹»çº»À» ¹Þ¾ÒÀ» °ÍÀÌ´Ù; ±×·¸Áö ¾ÊÀ¸¸é the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA¿¡ ÆíÁö½á¶ó.

À̰͵éÀº ´Ù¸¥ À¥»çƼƮ¿¡¼­ ¹Ì·¯¸µÀ» Çã¶ôÇÑ´Ù. ÇÏÁö¸¸, ´ÙÀ½°ÍµéÀ» ºÎŹÇÑ´Ù:

  • ³ÊÀÇ ¹Ì·¯ »çÀÌÆ®°¡ ¿ø·¡ »çÀÌÆ®ÀÇ ¾÷±×·¹À̵带 ÀÚµ¿ÀûÀ¸·Î ÇÏ°ÔÇÏ°í,

  • ¿øº» »çÀÌÆ®http://www.dwheeler.com/program-library°¡ ¾îµðÀÎÁö ÇÏÀÌÆÛ ÅؽºÆ®·Î °Ô½ÃÇÏ°í,

  • ÀÛ°¡ÀÎ ³ª((David A. Wheeler) ¿¡°Ô ¾Ë·ÁÁÖ¾î¶ó.

³ª¸¦ ÁÖ·Î ±ÍÂú°Ô ÇÏ´Â 2°¡ÁöÁßÀÇ Çϳª´Â Áö³ª°£ ¹ö±×µé¿¡ ´ëÇÑ À̾߱⸦ °è¼Ó ÇÏ´Â °ÍÀÌ´Ù. ´ç½ÅÀÌ ÀÌ ¹®¼­ÀÇ ¹Ì·¯¸µÀ» Á¦´ë·Î ÇÏ°í ÀÖ´Ù¸é, ³ª´Â ´ç½Å¿¡°Ô¼­ ¸î³âÀü¿¡ °íÃÄÁø ¹ö±×¿¡ °üÇÑ ¾ê±â¸¦ µèÁö ¾Ê¾Æµµ µÈ´Ù. ¿øº» »çÀÌÆ®¸¦ ¹Ì·¯ÇÑ´Ù¸é, »ç¿ëÀÚµéÀº ´ç½ÅÀÇ ¹Ì·¯»çÀÌÆ®°¡ »õ·Î¿î°ÍÀÎÁö üũÇÒ ¼ö ÀÖ´Ù. ³ª´Â ¸Å¿ì º¸¾È ¹®Á¦¿¡ ½ÅÁßÇϱ⶧¹®¿¡ ÀϹÝÀûÀÎ ÀÎÅͳÝÁ¢¼ÓÀº ÇÏÁö ¾Ê´Â´Ù; ¸¸¾à ÀÌ°ÍÀÌ ´ç½Å¿¡°Ô ¹®Á¦°¡ µÈ´Ù¸é, ´Ù¸¥ ¹æ¹ýÀ» ã¾Æ¼­, ´ç½ÅÀÇ È¯°æ¿¡¼­ ¶§¶§·Î üũ¸¦ Çϸ鼭 ¾÷µ¥ÀÌÆ®¸¦ Ç϶ó.

ÀÌ ¶óÀ̼¾½º¿¡ ÀÇÇØ, ´ç½ÅÀÌ ¹®¼­¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸, ´ç½ÅÀÌ ¾²Áö ¾ÊÀº°ÍÀ» ´ç½Å²¨¶ó°í ÇÒ ¼ö ¾ø´Ù(µû¶ó¼­, Ç¥ÀýÀÌ´Ù). ¶ÇÇÑ, °³Á¤ÆÇÀÌ ¿øº»°ú °°Àº°ÍÀ̶ó°í ÇÒ ¼öµµ ¾ø´Ù. ÀÛ¾÷À» °³Á¤ÇÔÀ¸·Î¼­, ÀüºÎ°¡ ´ç½ÅÀÇ ÆDZÇÀº ¾Æ´Ï´Ù; ÀÌ°ÍÀº ÆDZÇÀǹý¿¡ ÀÇÇÑ ``°ø°øÀÇ''ÀÏÀº ¾Æ´Ï´Ù. ÀÚ¼¼ÇÑ°ÍÀº ¶óÀ̼¾½º¸¦ ã¾Æº¸¶ó, Ưº°È÷ ``´ç½ÅÀº ÆÄÀÏÀÌ ¹Ù²ï°Í¿¡´ëÇÑ Å« º¯È­¸¦ ¾²°í, ¾ðÁ¦ ¹Ù²î¾ú´ÂÁö °³Á¤µÈ ÆÄÀÏ¿¡ ¸í½ÃÇ϶ó''¶ó´Â °ÍÀ» ÁÖÀÇÇ϶ó. ¶óÀ̼¾½º°¡ ¹«¾ùÀ» Çã¿ëÇÏ´ÂÁö ¾Ë°í ½ÍÀ¸¸é, ³ª¿¡°Ô ¿¬¶ôÇ϶ó. ´ëºÎºÐÀÇ °æ¿ì, ´ç½ÅÀÌ ¹Ù²Û°ÍÀ» ÁÖ ÁýÇÊÀÚ(ÇöÀç´Â David A. Wheeler)¿¡°Ô º¸³»´Â °ÍÀÌ ÁÁ´Ù. ±×·¯¸é, ´ç½ÅÀÌ º¯È­½ÃŲ°ÍÀÌ ¿øº»¿¡ Ãß°¡µÇ¾î¼­ ¸ðµç »ç¶÷ÀÌ º¸°Ô µÉ°ÍÀÌ´Ù.


ID
Password
Join
Money may buy friendship but money can not buy love.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2003-11-29 06:32:46
Processing time 0.0023 sec