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

You are not allowed to 'diff'


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
He who has a shady past knows that nice guys finish last.


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