°øÀ¯ ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ¶§ ÀûÀçµÇ´Â ¶óÀ̺귯¸®ÀÌ´Ù. °øÀ¯ ¶óÀ̺귯¸®°¡ Á¦´ë·Î ¼³Ä¡µÈ´Ù¸é, ±×´ÙÀ½¿¡ ½ÃÀÛÇÏ´Â ¸ðµç ÇÁ·Î±×·¥Àº ÀÚµ¿ÀûÀ¸·Î »õ °øÀ¯ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ´Ù. À̰ÍÀº ÈξÀ ´õ À¯¿¬¼º ÀÖ°í, ¹ßÀüµÈ°ÍÀÌ´Ù. ¿Ö³ÄÇϸé, ¸®´ª½º¿¡¼ »ç¿ëÇÏ´Â ¹æ¹ýÀº ´ç½Å¿¡°Ô ´ÙÀ½°ú °°Àº °ÍµéÀ» Çã¿ëÇϱ⠶§¹®ÀÌ´Ù:
¶óÀ̺귯¸®¸¦ ¾÷µ¥ÀÌÆ®Çصµ ÇÁ·Î±×·¥ÀÌ ¿¹Àü ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ¼ö ÀÖµµ·Ï Áö¿øÇÑ´Ù.
¾î¶² ƯÁ¤ÇÑ ÇÁ·Î±×·¥À» ½ÇÇà½Ãų¶§, ¶óÀ̺귯¸® ³»ÀÇ Æ¯Á¤ÇÑ ¶óÀ̺귯¸®³ª ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵å ÇÒ ¼ö ÀÖ´Ù.
ÀÌ ¸ðµç°ÍµéÀ» Á¸ÀçÇϰíÀÖ´Â ¶óÀ̺귯¸®¿¡¼ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â µ¿¾È¿¡ °¡´ÉÇÏ´Ù.
ÀÌ ¿øÇÏ´Â ¸ðµç ±â´ÉÀ» Áö¿øÇÏ´Â °øÀ¯ ¶óÀ̺귯¸®¿¡ ´ëÇØ, ¸¹Àº °ü·Ê¿Í ÁöħÀÌ µû¶óÁÖ¾î¾ß ÇÑ´Ù. ´ç½ÅÀº ¶óÀ̺귯¸®ÀÇ À̸§ÀÇ Â÷À̸¦ ¾Ë¾Æ¾ß ÇÑ´Ù. Ưº°È÷, ºÒ¸®´Â À̸§``soname''°ú ½ÇÁ¦À̸§``real name''¿¡ ´ëÇØ¼ ¾Ë¾Æ¾ß ÇÑ´Ù(±×¸®°í À̰͵éÀÌ ¾î¶»°Ô »óÈ£ÀÛ¿ëÇÏ´ÂÁö¸¦). ´ç½ÅÀº ¶ÇÇÑ À̰͵éÀÌ ÆÄÀϽýºÅÛÀÇ ¾î´ÀºÎºÐ¿¡ À§Ä¡ÇÏ´ÂÁö ¾Ë¾Æ¾ß ÇÑ´Ù.
¸ðµç °øÀ¯ ¶óÀ̺귯¸®µéÀº ``ºÒ¸®´Â À̸§''À̶ó ºÒ¸®´Â Ưº°ÇÑ À̸§À» °¡Áö°í ÀÖ´Ù. ±× ºÒ¸®´Â À̸§Àº Á¢µÎ»ç ``lib'', ±× ¶óÀ̺귯¸® À̸§, ``.so''¿Í ÀÎÅÍÆäÀ̽º°¡ ¹Ù²ñ¿¡ µû¶ó Áõ°¡µÇ´Â ±â°£°ú ¹öÀü³Ñ¹ö·Î ÀÌ·ç¾îÁø´Ù(Ưº° ÄÉÀ̽º·Î, Àú ¼öÁØÀÇ C¶óÀ̺귯¸®´Â ``lib''À¸·Î À̸§ÀÌ ½ÃÀÛÇÏÁö ¾Ê´Â´Ù). ÃæºÐÈ÷ °ËÁõ¹ÞÀº(fully-qualified) ºÒ¸®´Â À̸§Àº ±× ¶óÀ̺귯¸®°¡ ¼ÓÇØÀÖ´Â µð·ºÅ丮¸¦ Á¢µÎ»ç·Î ÇÑ´Ù; ½ÇÁ¦ ½Ã½ºÅÛ¿¡¼ ÃæºÐÈ÷ °ËÁõ¹ÞÀº ºÒ¸®´Â À̸§Àº ``½ÇÁ¦À̸§''ÀÇ ½Éº¼¸¯ ¸µÅ©°¡ µÈ´Ù.
¸ðµç °øÀ¯ ¶óÀ̺귯¸®µéÀº ``½ÇÁ¦À̸§''À̶ó ºÒ¸®´Â ½ÇÁ¦ ¶óÀ̺귯¸® Äڵ带 Æ÷ÇÔÇÏ´Â ÆÄÀÏÀ̸§À» °¡Áö°í ÀÖ´Ù. ½ÇÁ¦ À̸§Àº ºÒ¸®´Â À̸§¿¡´Ù°¡ ±â°£, ¸¶ÀÌ³Ê ¼ýÀÚ, ¶Ç´Ù¸¥ ±â°£, Ãâ½Ã ¼ýÀÚ¸¦ Æ÷ÇÔÇÑ´Ù. ¸¶Áö¸·ÀÇ ±â°£°ú Ãâ½Ã ¼ýÀÚ´Â ¿É¼ÇÀÌ´Ù. ¸¶ÀÌ³Ê ¼ýÀÚ¿Í Ãâ½Ã ¼ýÀÚ´Â ´ç½ÅÀÌ ¶óÀ̺귯¸®ÀÇ ¾î¶² ¹öÀüÀ» ¾²°í ÀÖ´ÂÁö Á¤È®ÇÏ°Ô ¾Ë°Ô ÇÔÀ¸·Î¼ Çü»ó°ü¸®¸¦ ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù. ÀÌ ¼ýÀÚµéÀÌ »ç¿ëÀ» ½±°Ô ÇÑ´Ù ÇÏ´õ¶óµµ, ¶óÀ̺귯¸® ¹®¼¿¡ ¾²ÀΰͰú °°Àº ¼ýÀÚ°¡ ¾Æ´Ò ¼ö ÀÖ´Ù´Â Á¡¿¡ À¯ÀÇÇ϶ó.
°Ô´Ù°¡, ÄÄÆÄÀÏ·¯°¡ ¶óÀ̺귯¸®¸¦ ¿ä±¸ÇÒ ¶§ »ç¿ëÇÏ´Â ´Ù¸¥ À̸§ÀÌ ÀÖ´Ù(³ª´Â ±×°ÍÀ» ``¸µÅ© À̸§(linker name)''À̶ó ¸íĪÇÒ °ÍÀÌ´Ù). ±×°ÍÀº ´ÜÁö ºÒ¸®´Â À̸§¿¡¼ ¼ýÀÚ¸¦ ¾ø¾Ø À̸§ÀÌ´Ù.
°øÀ¯ ¶óÀ̺귯¸®¸¦ ´Ù·ç´Â ¹æ¹ýÀº ÀÌ À̸§µéÀÇ ±¸ºÐÀ» ÇÏ´Â °ÍÀÌ´Ù. ÇÁ·Î±×·¥ÀÌ ±×µéÀÌ ¿øÇÏ´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ ³»ºÎÀûÀ¸·Î ³ª¿ÇÑ´Ù¸é ±×°ÍµéÀº ±× ¶óÀ̺귯¸®µéÀÇ ºÒ¸®´Â À̸§¸¸ ³ª¿ÇØ¾ß ÇÑ´Ù. ¹Ý´ë·Î, ´ç½ÅÀÌ °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µç´Ù¸é, ´ç½ÅÀº ±× ¶óÀ̺귯¸®¸¦ ƯÁ¤ÇÑ ÆÄÀÏÀ̸§À¸·Î ¸¸µé¾î¾ß ÇÑ´Ù(´õ ÀÚ¼¼ÇÑ ¹öÀü Á¤º¸µé°ú ÇÔ²²). ´ç½ÅÀÌ »õ·Î¿î ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ ¼³Ä¡ÇÑ´Ù¸é, ´ç½ÅÀº ±×°ÍÀ» »õ·Î¿î Ưº°ÇÑ µð·ºÅ丮¿¡´Ù ¼³Ä¡Çϰí ldconfig(8)À» »ç¿ëÇØ¼ ÇÁ·Î±×·¥À» µ¹¸°´Ù. ldconfigÀº Á¸ÀçÇÏ´Â ÆÄÀÏÀ» Á¶»çÇϰí, /etc/ld.so.cacheÀÇ Ä³½Ã ÆÄÀÏÀ» ¼³Á¤Çϸé¼(Àá½ÃÈÄ¿¡ ¾ð±Þ µÉ °ÍÀÌ´Ù) ½ÇÁ¦ À̸§¿¡´Ù°¡ ºÒ¸®´Â À̸§À¸·Î ½Éº¼¸¯ ¸µÅ©¸¦ ¸¸µé¾îÁØ´Ù.
ldconfig´Â ¸µÄ¿ À̸§À» ¸¸µéÁö´Â ¾Ê´Â´Ù; º¸Åë À̰ÍÀº ¶óÀ̺귯¸® ¼³Ä¡ÇÒ¶§ ¸¸µé¾îÁö°í, ¸µÄ¿ À̸§Àº ``°¡ÀåÃÖ±ÙÀÇ'' ºÒ¸®´Â À̸§À̳ª ½ÇÁ¦ À̸§À¸·Î ¸¸µé¾îÁø´Ù. ³ª´Â ¸µÄ¿ À̸§À» ºÒ¸®´Â À̸§ÀÇ ½Éº¼¸¯ ¸µÅ©·Î »ç¿ëÇÒ °ÍÀ» ÃßõÇÑ´Ù. ¿Ö³ÄÇϸé, ´ëºÎºÐÀÇ °æ¿ì ´ç½ÅÀÌ ¶óÀ̺귯¸®¸¦ ¾÷µ¥ÀÌÆ® ÇÑ´Ù¸é, ´ç½ÅÀº ¸µÅ© ½Ãų¶§¿¡ ÀÚµ¿ÀûÀ¸·Î »ç¿ëÇÏ°í ½Í¾îÇÒ °ÍÀ̱⠶§¹®ÀÌ´Ù. ³ª´Â H. J. Lu¿¡°Ô ¿Ö ldconfig°¡ ÀÚµ¿ÀûÀ¸·Î ¸µÄ¿À̸§À» ¸¸µé¾îÁÖÁö ¾Ê³Ä°í ¹°¾îº¸¾Ò´Ù. ±×ÀÇ ¼³¸íÀº ÀÌ·¸´Ù. ¾Æ¸¶ ´ç½ÅÀ» ÃֽŹöÀüÀÇ ¶óÀ̺귯¸® Äڵ带 µ¹¸®°í ½Í¾îÇÒÁö ¸ð¸¥´Ù. ÇÏÁö¸¸, ±× ´ë½Å¿¡ ¿¹ÀüÀÇ(¾Æ¸¶µµ ȣȯµÇÁö ¾Ê´Â) ¹öÀüÀÇ ¶óÀ̺귯¸®·Î °³¹ßÇÏ°í ½Í¾îÇÒ ¼ö µµ ÀÖ´Ù. µû¶ó¼, ldconfig´Â ÇÁ·Î±×·¥ÀÌ ¾î¶² ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ °ÍÀÎÁö ¾î¶² °¡Á¤µµ Çϰí ÀÖÁö ¾Ê´Ù. µû¶ó¼, ¼³Ä¡ÀÚ´Â ¸µÄ¿°¡ ¾î¶² ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ°ÍÀÌÁö¿¡ ´ëÇÑ ½Éº¼¸¯ ¸µÅ©¸¦ Ưº°È÷ ¼öÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù.
µû¶ó¼, /usr/lib/libreadline.so.3´Â /usr/lib/libreadline.so.3.0°ú °°Àº ½ÇÁ¦ À̸§¿¡ ldconfig¿¡ ÀÇÇØ ½Éº¼¸¯ ¸µÅ©°¡ µÈ ÃæºÐÈ÷ °ËÁõ¹ÞÀº ºÒ¸®´Â À̸§ÀÌ´Ù. /usr/lib/libreadline.so.3À» ½Éº¼¸¯ ¸µÅ©ÇÏ´Â /usr/lib/libreadline.so °°Àº ¸µÄ¿ À̸§ÀÌ ÀÖÀ» ¼ö ÀÖ´Ù.
°øÀ¯ ¶óÀ̺귯¸®´Â ÆÄÀϽýºÅÛÀÇ ¾îµò°¡¿¡ À§Ä¡Çؾ߸¸ ÇÑ´Ù. ´ëºÎºÐÀÇ ¿ÀǼҽº ¼ÒÇÁÆ®¿þ¾î´Â 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¶óÀ̺귯¸®·Î ÀûÀçµÈ´Ù´Â °ÍÀ» ¸í½ÉÇ϶ó(À̰͵µ ¾Æ·¡¿¡¼ ³íÀǵȴÙ).
¸ðµç ¸®´ª½º ½Ã½ºÅÛÀ» Æ÷ÇÔÇÑ GNU glibc±â¹Ý ½Ã½ºÅÛ¿¡¼´Â, ELF ¹ÙÀ̳ʸ® ½ÇÇàÆÄÀÏÀÇ ½ÃÀÛÀº ÇÁ·Î±×·¥·Î´õ°¡ ÀûÀçµÇ°í ½ÇÇàµÈ ÈÄ¿¡ ÇÑ´Ù. ¸®´ª½º ½Ã½ºÅÛ¿¡¼´Â, ÀÌ ·Î´õ´Â /lib/ld-linux.so.X(¿©±â¼ X´Â ¹öÀü ¼ýÀÚ)¶ó´Â À̸§ÀÌ ºÙ´Â´Ù. ÀÌ ·Î´õ´Â ÇÁ·Î±×·¥¿¡¼ ¾²ÀÌ´Â ´Ù¸¥ ¸ðµç °øÀ¯ ¶óÀ̺귯¸®¸¦ ã¾ÆÁÖ°í ÀûÀç½ÃÄÑÁØ´Ù.
Ž»öµÉ¶§ ã¾ÆÁö´Â µð·ºÅ丮ÀÇ ¸®½ºÆ®´Â /etc/ld.so.conf¿¡ ÀúÀåµÈ´Ù. ¸¹Àº Red Hat±â¹Ý ¹èÆ÷ÆÇÀº ±âº»ÀûÀ¸·Î /usr/local/libÀ» /etc/ld.so.conf¿¡ ÀúÀåÇÏÁö ¾Ê´Â´Ù. ³ª´Â À̰ÍÀÌ ¹ö±×¶ó°í »ý°¢ÇÑ´Ù. µû¶ó¼, Red Hat±â¹Ý ½Ã½ºÅÛ¿¡¼ ¸¹Àº ÇÁ·Î±×·¥À» µ¹¸®±â À§ÇØ /etc/ld.so.conf¿¡ /usr/local/libÀ» Ãß°¡Çϴ°ÍÀº ¹ö±× ``ÇȽº''ÀÌ´Ù.
¶óÀ̺귯¸®¿¡ ¸î°³ÀÇ ÇÔ¼ö¸¦ Ãß°¡ÇÏ°í ½ÍÀºµ¥, ¶óÀ̺귯¸®ÀÇ ³ª¸ÓÁö ºÎºÐÀ» À¯ÁöÇÏ°í ½Í´Ù¸é, ¿À¹ö¶óÀ̵åÇÏ´Â ¶óÀ̺귯¸®ÀÇ À̸§(.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)¿¡ ÀÇÇØ¼ ¾÷µ¥ÀÌÆ®µÈ´Ù. µû¶ó¼, ¸î¸î ´Ù¸¥ »óȲµé¿¡¼¸¸ ÀÌ Àå¼ÒÀÇ Â÷À̰¡ ¹®Á¦°¡ µÈ´Ù.
¿©·¯°¡Áö ȯ°æº¯¼ö´Â ÀÌ °úÁ¤À» Á¦¾îÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ÀÌ °úÁ¤À» ¿À¹ö¶óÀ̵åÇϴ ȯ°æº¯¼öµéÀÌ Á¸ÀçÇÑ´Ù.
ÀÌ Æ¯º°ÇÑ ½ÇÇàÀ» À§ÇØ ´ç½ÅÀº ÀϽÃÀûÀ¸·Î ´Ù¸¥ ¶óÀ̺귯¸®¸¦ ´ëüÇÒ ¼ö ÀÖ´Ù. ¸®´ª½º¿¡¼, ȯ°æº¯¼ö 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 |
GNU C¿¡¼ ¶Ç´Ù¸¥ À¯¿ëÇÑ È¯°æº¯¼ö´Â LD_DEBUGÀÌ´Ù. À̰ÍÀº dl* ÇÔ¼ö¸¦ À§ÇØ ¸¸µé¾îÁ³´Ù. µû¶ó¼ ±×µéÀÌ Çϰí ÀÖ´Â °Íµé¿¡ ´ëÇÑ ¸Å¿ì ÀåȲÇÑ Á¤º¸¸¦ ÁØ´Ù. ¿¹¸¦ º¸ÀÚ:
export LD_DEBUG=files command_to_run |
LD_DEBUG¸¦ ``help''·Î ¼³Á¤Çϰí ÇÁ·Î±×·¥À» µ¹¸®¸é ¿©·¯°¡Áö ¿É¼ÇÀ» Ç¥½ÃÇÒ °ÍÀÌ´Ù. ´Ù½Ã, LD_DEBUG´Â º¸ÅëÀÇ »ç¿ëÀ» À§ÇØ ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó, µð¹ö±ë°ú °Ë»ç¸¦ À§ÇØ Æí¸®ÇÑ °ÍÀÌ´Ù.
·Îµù°úÁ¤À» Á¦¾îÇÒ ¼ö ÀÖ´Â ¸¹Àº ȯ°æº¯¼öµéÀÌ ÀÖ´Ù; ±×°ÍµéÀÇ À̸§Àº 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ÇÁ·Î±×·¥ÀÌ È¯°æº¯¼öµé¿¡ ÀÇÇØ ³ª»Ú°Ô ó¸®µÇ¸é ¾ÈµÈ´Â ÀÌÀ¯ÀÌ´Ù.
°øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µå´Â °ÍÀº ½±´Ù. óÀ½À¸·Î, 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) |
´ç½ÅÀÌ °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µé¾ú´Ù¸é ´ç½ÅÀº ±×°ÍÀ» ¼³Ä¡ÇÏ°í ½Í¾î ÇÒ °ÍÀÌ´Ù. °£´ÜÇÑ ¹æ¹ýÀº Ç¥ÁØ µð·ºÅ丮(¿¹µé¸¦¾î, /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¶óÀ̺귯¸®¸¦ »ç¿ëÇϰíÀÚ Çϸé(Àû¾îµµ ±×µéÀÇ ¶óÀ̺귯¸®¿¡¼ ±¸ÇöÇÏ·ÁÇÒ¶§), ´Ù¸¥ ´ëºÎºÐÀÇ ÇÁ·Î±×·¥µéÀÌ À̰ÍÀ» Æ÷ÇÔÇÒ °ÍÀÌ´Ù.
»õ¹öÀüÀÇ ¶óÀ̺귯¸®°¡ ¿¹Àü¹öÀü°ú ÀÌÁø-ȣȯÀÌ ¾ÈµÈ´Ù¸é, ºÒ·ÁÁö´Â À̸§ÀÌ ¹Ù²î¾î¾ß ÇÑ´Ù. C¿¡¼´Â ÀÌÁø ȣȯÀÌ ¾ÈµÇ°Ô µÇ´Â 4°¡Áö ±âº» °æ¿ì°¡ ÀÖ´Ù.
ÇÔ¼öÀÇ ³»¿ëÀÌ ¹Ù²î¾î¼ º»·¡ÀÇ ½ºÆå°ú ¸Â°Ô µ¿ÀÛÇÏÁö ¾Ê´Â °æ¿ì.
¼öÃâµÈ(exported) µ¥ÀÌŸ ¾ÆÀÌÅÛÀÌ º¯ÇѰæ¿ì(¿¹¿Ü : µ¥ÀÌÅÍ ±¸Á¶°¡ °è¼Ó ¶óÀ̺귯¸® ³»¿¡ Á¸ÀçÇÑ´Ù¸é, µ¥ÀÌÅÍ ±¸Á¶ÀÇ ³»ºÎ¿¡ ¾ÆÀÌÅÛÀ» Ãß°¡ÇÏ´Â °ÍÀº ±¦Âú´Ù)
exported ÇÔ¼ö°¡ Á¦°ÅµÉ °æ¿ì
exported ÇÔ¼öÀÇ ÀÎÅÍÆäÀ̽º°¡ º¯ÇÒ °æ¿ì
ÀÌ·±°æ¿ì¸¦ ÇÇÇÏ·ÁÇÑ´Ù¸é, ÀÌÁø-ȣȯÀÌ µÇ°Ô ¶óÀ̺귯¸®¸¦ À¯ÁöÇÒ ¼ö ÀÖ´Ù. ´Ù½Ã ¸»Çؼ ±×·±°æ¿ì¸¦ ÇÇÇÏ°í ½Í´Ù¸é ÀÀ¿ë ÀÌÁø ÀÎÅÍÆäÀ̽º(ABI=Application Binary Interface)¸¦ ÇÒ ¼ö ÀÖ´Ù. ¿¹µéµé¾î, ¿¹Àü°ÍµéÀ» Áö¿ìÁö ¾Ê°í »õ·Î¿î ÇÔ¼ö¸¦ Ãß°¡ÇÏ°í ½ÍÀ» ¼ö ÀÖ´Ù. ´ç½ÅÀº ±¸Á¶¿¡ »õ·Î¿î ¾ÆÀÌÅÛÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸, ¿¹Àü ÇÁ·Î±×·¥ÀÌ »õ·Î¿î ¾ÆÀÌÅÛÀ» Ãß°¡ÇÑ ±¸Á¶¸¦ ÀνÄÇÏÁö ¸øÇѴٰųª (ÇÁ·Î±×·¥ÀÌ ¾Æ´Ñ)¶óÀ̺귯¸®°¡ »õ·Î¿î °ø°£À» ÇÒ´çÇÏÁö ¸øÇϰųª, Ãß°¡ÀÇ ¾ÆÀÌÅÛÀ» ¿É¼ÇÀ¸·Î ¸¸µå´Â°Í(¶Ç´Â ¶óÀ̺귯¸®°¡ ±×°ÍµéÀ» ä¿ì°Ô Çϴ°Í)µîµîÀ» È®½ÇÈ÷ ÇØ¾ßÇÑ´Ù´Â °ÍÀ» ÁÖÀÇÇ϶ó. ÁÖÀÇÇ϶ó - À¯Àú°¡ ¹è¿¿¡ ±¸Á¶¸¦ »ç¿ëÇϰí ÀÖ´Ù¸é ´ç½ÅÀº ¹è¿ÀÇ ±¸Á¶¸¦ ´Ã¸±¼ö ¾ø´Ù.
C++(±×¸®°í ÄÄÆÄÀÏµÈ ÅÛÇø´À̳ª ´Ù¸¥ µð½ºÆÐÄ¡µÈ ¸Þ¼Òµå¸¦ Áö¿øÇÏ´Â ¾ð¾î)¿¡¼ »óȲÀº ±³¹¦ÇØÁø´Ù. À§ÀÇ ¸ðµç »óȲÀÌ ÀÌ·ç¾îÁ®¾ß Çϰí, ´õ ÇØÁÖ¾î¾ß ÇÒ À̽´µéÀÌ ÀÖ´Ù. »óȲÀº ÄÄÆÄÀÏµÈ Äڵ忡¼ ``º¸ÀÌÁö ¾Ê°Ô'' ±¸ÇöµÇ±â ¶§¹®¿¡ C++ÀÌ ¾î¶»°Ô ±¸ÇöµÇ¾ú´ÂÁö ¾ËÁö ¸øÇÏ¸é ¾Ö¸Å¸ðÈ£ÇØÁö´Â ÀÇÁ¸¼ºÀ» ³º´Â Á¤º¸µé ¶§¹®¿¡ ÀϾÙ. ¾ö¹ÐÇÏ°Ô ¸»Çϸé, À̰ÍÀº ``»õ·Î¿î'' À̽´´Â ¾Æ´Ï´Ù. ´ÜÁö, ÄÄÆÄÀÏµÈ C++Äڵ尡 ³Ê¿¡°Ô ³î¶ó°Ô ÇÒ ¼ö ÀÖÀ»°ÍÀÌ´Ù. ´ÙÀ½¿¡ ³ª¿À´Â °ÍµéÀº (¾Æ¸¶µµ ºÎÁ·ÇϰÚÁö¸¸) Troll Tech's Technical FAQ¿¡ ³ª¿À´Â ÀÌÁø ȣȯÀ» À¯ÁöÇϱâ À§ÇØ C++¿¡¼ »ç¿ëÇÏ¸é ¾ÈµÇ´Â °ÍµéÀÇ ¸ñ·ÏÀÌ´Ù.
°¡»óÇÔ¼ö¸¦ Àç ±¸ÇöÇϴ°Í(±×·¸Áö ¾ÊÀ¸¸é ¿ø·¡ÀÇ ±¸Çö¿¡¼´Â ¾ÈÀüÇÏ´Ù). ¿Ö³ÄÇϸé ÄÄÆÄÀÏ·¯´Â ÄÄÆÄÀϽÿ¡(¸µÅ©½Ã°¡ ¾Æ´Ï¶ó) SuperClass::virtualFunction()¸¦ ±¸Çϱ⠶§¹®ÀÌ´Ù.
°¡»ó ¸â¹öÇÔ¼ö¸¦ ´õÇϰųª Á¦°ÅÇϴ°Í. ¿Ö³ÄÇϸé À̰ÍÀº ¸ðµç ¼ºêŬ·¡½ºÀÇ vtlbÀÇ Å©±â¿Í ±¸Á¶¸¦ ¹Ù²Ù±â ¶§¹®ÀÌ´Ù.
µ¥ÀÌÅÍ ¸â¹öÀÇ Å¸ÀÔÀ» ¹Ù²Ù°Å³ª ÀζóÀÎ ¸â¹öÇÔ¼ö¸¦ ÅëÇØ Á¢±ÙÇÒ ¼ö ÀÖ´Â µ¥ÀÌÅÍ ¸â¹ö¸¦ ¿Å±â´Â°Í.
»õ ³ëµå¸¦ Ãß°¡ÇÏ´Â °Í À̿ܿ¡ Ŭ·¡½º ±¸Á¶¸¦ ¹Ù²Ù´Â°Í.
privateµ¥ÀÌÅÍ ¸â¹ö¸¦ Ãß°¡Çϰųª »èÁ¦Çϴ°Í. ¿Ö³ÄÇϸé À̰ÍÀº ¸ðµç ¼ºêŬ·¡½ºÀÇ Å©±â¿Í ±¸Á¶¸¦ ¹Ù²Ù±â ¶§¹®ÀÌ´Ù.
ÀζóÀÎÀÌ ¾Æ´Ñ public, protected ¸â¹ö ÇÔ¼ö¸¦ Á¦°ÅÇϴ°Í.
public, protected ¸â¹öÇÔ¼ö¸¦ inlineÀ¸·Î ¸¸µå´Â°Í.
inlineÇÔ¼ö¸¦ ¹Ù²Ù¾î¼, ¿¹Àü¹öÀüÀÌ Á¦´ë·Î ÀÛµ¿ÇÏÁö ¾Ê´Â°Í.
Æ÷ÆÃÇÒ ÇÁ·Î±×·¥ÀÇ ¸â¹ö ÇÔ¼öÀÇ Á¢±Ù±ÇÇÑ(public, protected, private)À» ¹Ù²Ù´Â°Í. ¿Ö³ÄÇϸé, ¾î¶² ÄÄÆÄÀÏ·¯´Â ÇÔ¼öÀÇ À̸§¿¡ Á¢±Ù±ÇÇÑÀ» ºÙÀ̱⠶§¹®ÀÌ´Ù.
À§ÀÇ ÁÖ¾îÁø ¸ñ·Ï´ë·Î, C++¶óÀ̺귯¸® °³¹ßÀÚµéÀº ¶§¶§·Î ÀÌÁø ȣȯ¼ºÀ» ±ú´Â ¾÷µ¥ÀÌÆ®¸¦ °èÈ¹ÇØ¾ß¸¸ÇÑ´Ù. ´ÙÇེ·´°Ôµµ, À¯´Ð½º ±â¹Ý ½Ã½ºÅÛÀº µ¿½Ã¿¡ ·ÎµåµÇ´Â ¶óÀ̺귯¸®ÀÇ ¸¹Àº ¹öÀüÀ» °¡Áö°í ÀÖ¾î¼, µð½ºÅ© °ø°£À» Á¶±Ý ÇÒ´çÇÑ´Ù¸é, À¯ÀúµéÀº ¿¹ÀüÀÇ ¶óÀ̺귯¸®¸¦ ¿ä±¸ÇÏ´Â ``¿¹Àü''ÇÁ·Î±×·¥À» µ¹¸±¼ö ÀÖ´Ù.