ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ÇÏ¿ìÅõ
ÇÁ·Î±×·¥ ¶óÀ̺귯¸® ÇÏ¿ìÅõ
David A. WheelerÁöÀ½
¹öÀü 0.60, 2000³â 4¿ù 27ÀÏ
¹ø¿ª : Ȳ Áø Èñ(
jeenee@soback.kornet.net)
2000³â 5¿ù
ÀÌ ÇÏ¿ìÅõ ¹®¼´Â ÇÁ·Î±×·¡¸Ó°¡ ¾î¶»°Ô ¸®´ª½ºÈ¯°æ¿¡¼ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®
¸¦ »ý¼ºÇÏ°í »ç¿ëÇÒ¼ö ÀÖ´ÂÁö¸¦ ´Ù·ç°í ÀÖÀ¸¸ç ¶óÀ̺귯¸®¿¡´Â Á¤Àû ¶óÀ̺귯¸®, °øÀ¯ ¶óÀ̺귯¸® ¹× µ¿Àû(DL) ¶óÀ̺귯¸®°¡ ÀÖ´Ù.
ÀÌ ÇÏ¿ìÅõ ¹®¼´Â ÇÁ·Î±×·¡¸Ó°¡ ¾î¶»°Ô GNUÀÇ Åø¼ÂÀ» ÀÌ¿ëÇÏ¿© ¸®´ª½º¿¡
¼ ÇÁ·Î±×·¥ ¶óÀ̺귯¸®¸¦ »ý¼ºÇÏ°í ÀÌ¿ëÇÒ¼ö ÀÖ´ÂÁö¸¦ ´Ù·é´Ù. ÇÁ·Î±×·¥
¶óÀ̺귯¸®¶õ ´Ü¼øÇÏ°Ô º¸¸é ³ªÁß¿¡ ¾î¶² ÇÁ·Î±×·¥ Äڵ忡 ³¢¿ö³Ö¾îÁú¼ö ÀÖ´Â ÄÄ
ÆÄÀÏµÈ ÄÚµå(±×¸®°í µ¥ÀÌÅÍ)°¡ µé¾îÀÖ´Â ÆÄÀÏÀ̸ç, À̸¦ ÅëÇؼ ÇÁ·Î±×·¥µéÀº
´õ¿í ¸ðµâȵɼö ÀÖÀ¸¸ç, ÀçÄÄÆÄÀÏÀÌ ºü¸£¸ç, °»½ÅÀÌ ¿ëÀÌÇØÁø´Ù. ÇÁ·Î±×·¥
¶óÀ̺귯¸®´Â Á¤Àû, °øÀ¯, µ¿Àû(DL) ¶óÀ̺귯¸®ÀÇ ¼¼°¡Áö ÇüÅ·Π´ëº°µÈ´Ù.
¸ÕÀú ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±âÀü¿¡ ¹Ì¸® ½ÇÇàÇÁ·Î±×·¥¿¡ ¼³Ä¡µÇ´Â Á¤Àû
¶óÀ̺귯¸®°¡ ´Ù·ç¾î Áú°ÍÀ̸ç, ±× ´ÙÀ½Àº ÇÁ·Î±×·¥ ½ÃÀ۽ÿ¡ ÀûÀçµÇ¾î ¿©·¯ ÇÁ·Î±×
·¥¿¡ ÀÇÇØ °øÀ¯µÇ´Â °øÀ¯ ¶óÀ̺귯¸®, ±×¸®°í ¸¶Áö¸·À¸·Î ÇÁ·Î±×·¥ ½ÇÇàÁßÀÇ
¾î¶² ¼ø°£¿¡µµ ÀûÀç ¹× »ç¿ëÀÌ °¡´ÉÇÑ µ¿Àû ¶óÀ̺귯¸®¸¦ ´Ù·ê °ÍÀÌ´Ù. µ¿Àû
¶óÀ̺귯¸®¸¦ ´Ù¸¥ ¾î¶² ÇÑ ¶óÀ̺귯¸®ÀÇ Æ÷¸ËÀ̶ó°í º¸±â´Â ¾î·Á¿ï °ÍÀÌ
´Ù.(Á¤Àû ¶óÀ̺귯¸®ÀÌ°Ç °øÀ¯ ¶óÀ̺귯¸®ÀÌ°Ç ¸ðµÎ µ¿Àû ¶óÀ̺귯¸®·Î »ç¿ë
°¡´ÉÇÔ) ´ë½Å µ¿Àû ¶óÀ̺귯¸®°¡ ´Ù¸¥Á¡Àº ±×°ÍÀÌ ÇÁ·Î±×·¡¸Ó¿¡ ÀÇÇؼ ÀÌ¿ë
µÇ´Â ¹æ½Ä¿¡ ÀÖ´Â °ÍÀÌ´Ù. ÀÌ Ã¥ÀÇ ´Ù¸¥ Àå¿¡´Â ±×°ÍÀÇ ¿¹µé°ú Âü°íÇÒ ¸¸ÇÑ ¹®
ÇåµéÀ» ½ÇÀ» °ÍÀÌ´Ù.
ÀÌ Ã¥Àº ÀÌÁ¦´Â ´ëºÎºÐÀÇ ¸®´ª½º ¹èÆ÷º»¿¡¼ »ç¿ëµÇ´Â ELF Æ÷¸ËÀÇ ½ÇÇà
ÇÁ·Î±×·¥°ú ¶óÀ̺귯¸®¸¸À» ´Ù·ê °ÍÀÌ´Ù. GNUÀÇ gcc Åø¼ÂÀº ELF¿Ü¿¡ ´Ù¸¥
ÇüÅÂÀÇ ¶óÀ̺귯¸®µµ ´Ù·ê¼ö Àִµ¥ ¾ÆÁ÷µµ ´ëºÎºÐÀÇ ¸®´ª½º ¹èÆ÷ÆÇÀº À̹Ì
Åð¹°ÀÌµÈ a.outÇüÀÇ Æ÷¸ËÀ» ´Ù·ç°í´Â ÀÖ´Ù, ÇÏÁö¸¸ ÀÌ°ÍÀº ÀÌÃ¥ÀÇ ¹üÀ§¸¦ ¹þ
¾î³ ¾ê±âÀÌ´Ù.
¾î¶² »ç¶÷µéÀº µ¿Àû ¸µÅ© ¶óÀ̺귯¸®(DLL)¶õ ¿ë¾î¸¦ »ç¿ëÇÏ¿© °øÀ¯
¶óÀ̺귯¸®¸¦ ĪÇϱ⵵ ÇÏ°í, ¶§·Ð Á¤ÀûÀÌ°Ç °øÀ¯°Ç µ¿Àû ¶óÀ̺귯¸®·Î »ç¿ëµÉ ¶§
DLLÀ̶ó ĪÇϱ⵵ ÇÏ°í ¶Ç, ¶§·Î´Â À§ÀÇ µÎ Á¶°ÇÀ» ¸ðµÎ ¸¸Á·ÇÒ ¶§ DLLÀ̶õ
¿ë¾î¸¦ ¾²±âµµ Çϳª ÀÌ°ÍÀº º°·Î Áß¿äÇÑ ¾ê±â°¡ ¾Æ´Ï´Ù. À̹®¼´Â ´ç½ÅÀÌ ¾î
¶² Àǹ̸¦ ¼±ÅÃÇÏ°Ç°£¿¡ ¸®´ª½º¿¡¼ÀÇ DLLÀ» ´Ù·ïÁÙ °ÍÀÌ´Ù.
¸¸¾à ¿©·¯ ½Ã½ºÅÛ¿¡ Æ÷Æõɼö ÀÖ´Â ÇÁ·Î±×·¥À» °³¹ßÇÏ·Á ÇÑ´Ù¸é LINUX
ToolÀ» ¹Ù·Î »ç¿ëÇÏ´Â °Í º¸´Ù´Â GNU LibtoolÀÇ »ç¿ëÀ» °í·ÁÇØ º¸±æ ¹Ù¶õ´Ù.
GNU LibtoolÀº °øÀ¯ ¶óÀ̺귯¸®ÀÇ »ç¿ë(»ý¼º°ú ¼³Ä¡µî)ÀÇ º¹À⼺À» ÀÏ°üµÇ°í
À̽ÄÀûÀÎ ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ Á¦°ÅÇØÁÖ´Â ÀüÇüÀûÀÎ ¶óÀ̺귯¸® Áö¿ø ½ºÅ©¸³
Æ®ÀÌ´Ù. ¸®´ª½º¿¡¼ GNU LibtoolÀº ToolµéÁß¿¡¼ ÃÖ»óÀ§¿¡ ±¸ÇöµÇ¾î ÀÖÀ¸¸ç
±× »ç¿ë°ü·Êµµ ÀÌ ÇÏ¿ìÅõ ¹®¼¿¡ ±â¼úµÇ¾îÀÖ´Ù. DL ¶óÀ̺귯¸®ÀÇ À̽İ¡´É
ÇÑ ÀÎÅÍÆäÀ̽º ±¸ÇöÀ» À§Çؼ´Â ¿©·¯°¡Áö À̽ļº ±¸ÇöÀåÄ¡°¡ ÀÖÀ¸¸ç ±× Áß
GNU Libtool Àº "Libltdl" ÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ´Ù¸¥ ¼±ÅÃÀ¸·Î´Â glib ¶óÀ̺귯¸®
(glibc¿Í È¥µ¿ÇÏÁö¸»°Í)ÀÇ µ¿Àû ¸ðµâ ÀûÀçÀÇ À̽ļºÁö¿ø±â´ÉÀ» »ç¿ëÇÒ¼ö ÀÖ´Ù.
±×°ÍÀ» »ç¿ëÇÏ·Á ÇÑ´Ù¸é ÀÌ ¹®¼¸»°í [10]
developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html ¿¡¼ º¸±æ ¹Ù¶õ´Ù. ´Ù½Ã Çѹø ¸»
Çϰǵ¥ ¸®´ª½º¿¡¼ ¶óÀ̺귯¸®ÀÇ »ç¿ë¿¡ °üÇÑ Á¦¹Ý ±â´ÉµéÀÇ ±¸ÇöÀÌ ÀÌ ¹®¼
¿¡¼ ±â¼úµÉ °ÍÀÌ¸ç ¸®´ª½º¿ë Äڵ带 °³¹ßÁßÀ̰ųª µð¹ö±ë ÁßÀ̶ó¸é À̹®¼ÀÇ
³»¿ëÀÌ À¯¿ëÇÒ°ÍÀÌ´Ù.
ÀÌ ÇÏ¿ìÅõ ¹®¼ÀÇ ¸ÞÀÎÁÖ¼Ò´Â [11]
www.dwheeler.com/program-library
À̸ç LDP([12]
http://www.linuxdoc.org)¿¡ Á¦°øµÈ´Ù. ÀúÀÛ±ÇÀÚ´Â David A.
WheelerÀ̸ç GPLÀÇ ¶óÀ̼¾½º¸¦ µû¸¥´Ù.
Á¤Àû ¶óÀ̺귯¸®´Â ´ÜÁö Åë»óÀÇ ¿ÀºêÁ§Æ® ÈÀÏÀ» ¸ðÀº°ÍÀÌ´Ù. Åë»óÀûÀ¸·Î Á¤
Àû ¶óÀ̺귯¸®´Â .a¶ó´Â Á¢¹Ì¾î·Î ³¡³´Ù. ÀÌ ¿ÀºêÁ§Æ® ÁýÇÕÀº ar(archiver)
ÇÁ·Î±×·¥¿¡ ÀÇÇؼ »ý¼ºµÈ´Ù. Á¤Àû ¶óÀ̺귯¸®´Â °øÀ¯ ¶óÀ̺귯¸®°¡ °¡Áö´Â Àå
Á¡µé ¶§¹®¿¡ ÀÌÁ¦´Â ¿¾³¯Ã³·³ ±×·¸°Ô ¸¹ÀÌ »ç¿ëµÇ¾î ÁöÁö´Â ¾Ê´Â´Ù. ±×·¸Áö¸¸
¾ÆÁ÷µµ »ç¿ëµÇ¾î Áö°í ÀÖ°í ¿ª»çÀûÀ¸·Î °¡Àå¸ÕÀú Á¸ÀçÇß°í ¼³¸íÀÌ °£´ÜÇÏ´Ù.
Á¤Àû ¶óÀ̺귯¸®´Â ÀçÄÄÆÄÀϾøÀÌ ÇÁ·Î±×·¥¿¡ ¸µÅ©µÉ¼ö Àֱ⠶§¹®¿¡ ÀçÄÄÆÄÀÏ
¿¡ ÇÊ¿äÇÑ ½Ã°£ÀÌ Àý¾àµÉ¼ö ÀÖ´Ù. ¿äÁòÀº ÄÄÇ»ÅÍÀÇ ºü¸¥ ½ÇÇà½Ã°£¶§¹®¿¡ ÀÌ·±
ÀçÄÄÆÄÀÏ¿¡ µå´Â ½Ã°£ Àý¾àÀº ¿¾³¯Ã³·³ ±×·¸°Ô Áß¿äÇÑ ÀÌÀ¯°¡ µÉ¼ö´Â ¾øÀ»
°ÍÀÌ´Ù. Á¤Àû ¶óÀ̺귯¸®´Â °³¹ßÀÚµéÀÌ ¼Ò½ºÄÚµåÀÇ Àç°ø¾øÀÌ ÇÁ·Î±×·¡¸Óµé·Î
ÇÏ¿©±Ý ¸µÅ©ÇÏ¿© »ç¿ëÇϵµ·Ï ÇÒ¶§´Â °¡²û¾¿ À¯¿ëÇÑ °ÍÀ̵ȴÙ. (À̶§
¶óÀ̺귯¸®ÀÇ ÆǸÅÀÚ´Â ÀÌÀÍÀÌÁö¸¸ ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÏ°íÀÚ ÇÏ´Â ÇÁ·Î±×·¡¸Óµé¿¡°Ô
´Â À¯¿ëÇÑ°ÍÀÌ ¾Æ´Ï´Ù.) À̷лóÀ¸·Î ½ÇÇàÆÄÀÏ¿¡ ¸µÅ©µÇ´Â Á¤Àû ELF
¶óÀ̺귯¸® ÄÚµå´Â 1-5%Á¤µµ »¡¸® ¼öÇàµÇ¾îÁ®¾ßÇϳª ½ÇÁ¦¿¡ À־ ´Ù¸¥ ¿©·¯°¡Áö
º¹ÇÕÀûÀÎ ÀÌÀ¯·Î ÀÎÇÏ¿© ÀÌ·± ¿¹´Â Àß ¸ÂÁö ¾Ê´Â°Í °°´Ù.
Á¤Àû ¶óÀ̺귯¸®¸¦ »ý¼ºÇϰųª ±âÁ¸ÀÇ Á¤Àû ¶óÀ̺귯¸®¿¡ ºÎ°¡Àû ¿ÀºêÁ§Æ®
ÆÄÀÏÀ» Ãß°¡ÇÒ °æ¿ì ´ÙÀ½ÀÇ ¸í·ÉÀ» »ç¿ëÇÑ´Ù.
ar rcs my_library.a file1.o file2.o
À§ÀÇ ¿¹ÀÇ ¸í·ÉÀº file1.o file2.o¶ó´Â ¿ÀºêÁ§Æ® ÆÄÀÏÀ» mylibrary.a¿¡ Ãß°¡ÇÏ
°Å³ª Á¸ÀçÇÏÁö ¾ÊÀ»°æ¿ì ÀÌ ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. Á¤Àû ¶óÀ̺귯¸® »ý¼º°ú °ü·ÃÇÑ
´õ ÀÌ»óÀÇ Á¤º¸´Â ar(1)À» º¸±â ¹Ù¶õ´Ù.
Á¤Àû ¶óÀ̺귯¸®¸¦ ´ç½ÅÀÌ ¸¸µé¾ú´Ù¸é »ç¿ëÇϱ⸦ ¿øÇÒ °ÍÀÌ´Ù. À̸¦ »ç¿ëÇÏ
·Á¸é ½ÇÇà ÇÁ·Î±×·¥À» »ý¼ºÇϱâ À§ÇÑ ÄÄÆÄÀÏ°ú ¸µÅ©°úÁ¤ÀÇ ÇÑ ºÎºÐ¿¡ ÀÌ ÆÄ
ÀÏÀ» Æ÷ÇÔ½ÃÅ°¸é µÈ´Ù. ¸¸¾à¿¡ gcc(1)À» »ç¿ëÇÏ¿© ½ÇÇàÆÄÀÏÀ» ¸¸µç´Ù¸é -l ¿É
¼ÇÀ» »ç¿ëÇÏ¿© ´ç½ÅÀÌ ¸¸µç ¶óÀ̺귯¸®¸¦ ¸í½ÃÇÏ¸é µÈ´Ù. (info:gccÀ» ÂüÁ¶ÇÏ
¸é ´õ ¸¹Àº Á¤º¸¸¦ ¾òÀ»¼ö ÀÖÀ½). ¸µÄ¿ÀÎ ld(1)¸¦ ¹Ù·Î »ç¿ëÇÏ¿©µµ(-l,¶É´À -L
¿É¼Ç) µÇ³ª ld(1)ÀÇ ÀÎÅÍÆäÀ̽º°¡ ÀÚÁÖ º¯ÇϹǷΠgcc(1)À» ¾²´Â °ÍÀÌ ´õ ³ª
À» °ÍÀÌ´Ù.
°øÀ¯ ¶óÀ̺귯¸®¶õ ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÉ ¶§ ÀÌ ÇÁ·Î±×·¥¿¡ ÀÇÇؼ ÀûÀçµÇ´Â
¶óÀ̺귯¸®¸¦ ¸»ÇÑ´Ù. ¾î¶² °øÀ¯ ¶óÀ̺귯¸®°¡ ¹Ù¸£°Ô ÀûÀç¾ú´Ù¸é ÀÌÈÄ¿¡ ½ÇÇàµÇ
´Â ¸ðµç ÇÁ·Î±×·¥µéÀº ÀÚµ¿ÀûÀ¸·Î ÀÌ »õ·Î¿î °øÀ¯ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ °ÍÀÌ
´Ù. ½ÇÀç¿¡ ÀÖ¾î¼, ¸®´ª½º¿¡¼ »ç¿ëµÇ´Â Á¢±Ù¹æ½ÄÀº ¾Æ·¡¿Í °°Àº ±â´ÉµéÀ» Çã
¿ëÇϹǷΠ´õ¿í ź·ÂÀûÀÌ¸ç ¶ÇÇÑ, ¼¼·ÃµÇ°Ô ±â´ÉÇÑ´Ù.
* ¶óÀ̺귯¸®¸¦ °»½ÅÇÏ¸é¼ ÀÌ ¶óÀ̺귯¸®ÀÇ ±¸¹öÀü Áö¿ø¿ë ¹öÀüÀÌ ¾øÀ̵µ
¿©ÀüÈ÷ ±¸ ¹öÀüÀÇ ¶óÀ̺귯¸®ÀÇ »ç¿ëÀ» ¿øÇÏ´Â ÇÁ·Î±×·¥À» Áö¿øÇÒ¼ö ÀÖ´Ù.
* ƯÁ¤ ÇÁ·Î±×·¥ÀÇ ¼öÇà½Ã ¶óÀ̺귯¸® ¶Ç´Â ½ÉÁö¾î ¶óÀ̺귯¸®ÀÇ Æ¯Á¤ÇÔ¼öÀÇ
¿À¹ö¶óÀ̵ù(´ëÄ¡)ÀÌ °¡´ÉÇÏ´Ù.
* ÀÌ ¸ðµç ±â´ÉÀ» ±âÁ¸ÀÇ ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÏ¿© ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ °¡´ÉÇÏ
´Ù.
- °ü ·Ê
-
°øÀ¯ ¶óÀ̺귯¸®°¡ ÀÌ·¯ÇÑ ±â´ÉµéÀ» Áö¿øÇϱâ À§Çؼ´Â »ç¿ëÀÚ°¡ ¹Ýµå½Ã µû
¶ó¾ßÇÒ ÀÌ¿ë»óÀÇ ¸î°¡Áö °ü·Ê¿Í °¡À̵å¶óÀÎÀÌ ÀÖ´Ù. ´ç½ÅÀº ÇÑ ¶óÀ̺귯¸®¸¦
ÀÏÄ´ À̸§µéÀÇ Â÷ÀÌ Æ¯È÷ "soname"°ú "real name"À» ±¸º°ÇÒ¼ö ÀÖ¾î¾ßÇÏ
¸ç, (¶ÇÇÑ À̵éÀÌ ¾î¶»°Ô »óÈ£ÀÛ¿ë Çϴ°¡µµ ¾Ë¾Æ¾ß ÇÑ´Ù) ¶ÇÇÑ, ¶óÀ̺귯¸®°¡
ÆÄÀÏ ½Ã½ºÅÛ»óÀÇ ¾îµð¿¡ À§Ä¡ÇØ¾ß Çϴ°¡µµ ¾Ë¾Æ¾ß ÇÑ´Ù.
- °øÀ¯ ¶óÀ̺귯¸® À̸§µé
-
¸ðµç °øÀ¯ ¶óÀ̺귯¸®´Â "soname"À̶ó ºÒ¸®´Â Ưº°ÇÑ À̸§À» °¡Áö°í ÀÖ´Ù.
"soname"Àº Á¢µÎ¾î "lib", ¶óÀ̺귯¸® À̸§, ".so"¶ó´Â ¹®±¸, ±× ´ÙÀ½ ¸¶Ä§Ç¥¿Í
ÀÎÅÍÆäÀ̽º º¯°æ½Ã Áõ°¡µÇ´Â ¹öÀü ³Ñ¹ö·Î ±¸¼ºµÈ´Ù. ( ¿¹¿Ü·Î °¡Àå Àú¼öÁØÀÇ
C¶óÀ̺귯¸®µéÀº "lib"·Î ½ÃÀÛµÇÁö ¾Ê´Â´Ù) ¿ÏÀüÇÑ °ø½ÄÀû "soname"¿¡´Â
¶óÀ̺귯¸®°¡ ¼ÓÇÑ µð·ºÅ丮¸íÀÌ ¾ÕºÎºÐ¿¡ µé¾î°£´Ù. ¿î¿ëÁßÀÎ ½Ã½ºÅÛ¿¡¼´Â ¿ÏÀü
ÇÑ °ø½ÄÀû "soname" À̶õ °øÀ¯¶óÀ̺귯¸®ÀÇ ½ÇÁ¦ À̸§("real name")¿¡ ´ëÇÑ
½Éº¼¸¯ ¸µÅ©(½ÇÁ¦ Äڵ带 ´ã°íÀÖ´Â ÆÄÀÏÀÌ ¾Æ´Ñ)°¡ µÉ °ÍÀÌ´Ù.
¸ðµç °øÀ¯ ¶óÀ̺귯¸®´Â ½ÇÁ¦ ¶óÀ̺귯¸® Äڵ尡 ÀúÀåµÇ¾î ÀÖ´Â ÆÄÀÏÀÇ ÆÄÀÏ
¸íÀÎ "real name"À» ¶ÇÇÑ °¡Áø´Ù. ½ÇÁ¦ ÆÄÀϸíÀº "soname"¿¡ ¸¶Ä§Ç¥¿Í ¸¶À̳Ê
¹öÀü ³Ñ¹ö, ¸¶Ä§Ç¥ ±×¸®°í ¸±¸®Áî ³Ñ¹ö¸¦ ´õÇÑ °ÍÀÌ´Ù. ¸±¸®Áî ³Ñ¹ö´Â ¼±Åûç
Ç×ÀÌ´Ù. ¸¶ÀÌ³Ê ³Ñ¹ö¿Í ¸±¸®Áî ³Ñ¹ö·Î Á¤È®È÷ ¾î¶² ¹öÀüÀÇ ¶óÀ̺귯¸®°¡ ¼³Ä¡
µÇ¾î ÀÖ´ÂÁö ¾Ë°Ô ÇÔÀ¸·Î½á ½Ã½ºÅÛ ±¸¼ºÀ» Á¶ÀýÇÒ¼ö ÀÖ´Ù. ÀÌ ¹øÈ£µéÀº
¶óÀ̺귯¸®¸¦ ±â¼úÇϱâÀ§ÇÑ ¹®¼È½Ã¿¡ »ç¿ëµÈ ¹øÈ£¿Í ¸ÂÁö ¾ÊÀ»¼öµµ ÀÖÀ½¿¡ À¯ÀÇÇÏ
¶ó. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ¶óÀ̺귯¸®ÀÇ ¹®¼È°¡ ´õ ¿ëÀÌÇØÁø´Ù.
ºÎ°¡ÀûÀ¸·Î ÄÄÆÄÀÏ·¯°¡ ¶óÀ̺귯¸®¸¦ ¿ä±¸ÇÒ ¶§ »ç¿ëÇÏ´Â À̸§ÀÌ Çϳª ´õ Á¸
ÀçÇÑ´Ù.(³ª´Â À̸¦ "linker name"À̶ó ÀÏÄÃÀ» °ÍÀÌ´Ù.) ¿©±â¿¡´Â ¾î¶°ÇÑ ¹öÀü³Ñ
¹öµµ Æ÷ÇÔµÇÁö ¾Ê´Â "soname"ÀÌ ÇØ´çµÈ´Ù.
°øÀ¯ ¶óÀ̺귯¸®¸¦ °ü¸®ÇÏ´Â ÇÙ½ÉÀº ÀÌ·¯ÇÑ À̸§µéÀ» Àß ºÐº°ÇÏ´Â °ÍÀÌ´Ù. ÇÁ
·Î±×·¥¿¡¼ ÇÊ¿äÇÑ °øÀ¯ ¶óÀ̺귯¸®¸¦ ³»ºÎÀûÀ¸·Î Ç¥ÇöÇÒ¶§´Â ±× ¶óÀ̺귯¸®
ÀÇ "soname"À» ½á¾ßÇÑ´Ù. ¹Ý´ë·Î ¸¸¾à¿¡ ´ç½ÅÀÌ °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µé¾ú´Ù
¸é ÀÚ¼¼ÇÑ ¹öÀü Á¤º¸¸¦ Æ÷ÇÔÇÑ ½ÇÁ¦ ÆÄÀϸíÀ» ÁÖ¾î¾ß ÇÑ´Ù. ´ç½ÅÀÌ »õ·Î¿î ¹ö
ÀüÀÇ ¶óÀ̺귯¸®¸¦ ¼³Ä¡ÇÒ¶§´Â ¸î °³ÀÇ Á¤ÇØÁø µð·ºÅ丮µéÁßÀÇ ÇÑ°÷¿¡ ¼³Ä¡ÇÑ
µÚ¿¡ ldconfig¶ó´Â ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¿©¾ß ÇÑ´Ù. ldconfig´Â µð·ºÅ丮¿¡ Á¸ÀçÇÏ
´Â ÆÄÀϵéÀ» Á¡°ËÇÑ µÚ ½ÇÁ¦ ÆÄÀϸíÀÇ ½Éº¼¸¯ ¸µÅ©·Î½á sonameÀ» »ý¼ºÇϸç
µ¿½Ã¿¡ ij½¬ ÆÄÀÏÀÎ /etc/ld.so.cache¸¦ ¼ÂÆÃÇÑ´Ù.
ldconfig´Â linker nameÀ» ¼ÂÆÃÇÏÁö ¾Ê´Â´Ù. ÀÌ°ÍÀº º¸Åë ¶óÀ̺귯¸®ÀÇ ¼³Ä¡
½Ã¿¡ ¼ÂÆÃÀ» Çϴµ¥, °£´ÜÇÏ°Ô °¡Àå ÃÖ±ÙÀÇ sonameÀ̳ª real name¿¡ ½Éº¼¸¯
¸µÅ©¸¦ ¸¸µé¸é µÈ´Ù. ´ëºÎºÐÀÇ °æ¿ì ¶óÀ̺귯¸®¸¦ °»½ÅÇÏ°í ÀÚµ¿ÀûÀ¸·Î ¸µÅ©½Ã
¿¡ »ç¿ëÇϱ⸦ ¿øÇÒ°ÍÀ̹ǷΠsoname¿¡ ½Éº¼¸¯ ¸µÅ©Çϱ⸦ ±ÇÀåÇÑ´Ù. H. J. Lu
¿¡°Ô ldconfig°¡ ¿Ö ÀÚµ¿À¸·Î linker nameÀ» ¼ÂÆÃÇÏÁö ¾Ê´À³Ä°í ¹°¾ú´õ´Ï ±×
ÀÇ ¼³¸íÀº °¡Àå ÃÖ±ÙÀÇ ¶óÀ̺귯¸®·Î ¸µÅ©½ÃÅ°°í ½ÍÀ»¶§°¡ ÀÖÀ»°ÍÀÌ¸ç ¶ÇÇÑ
ÀÌÀü ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ °³¹ßÇϰųªÇÒ ¶§ ±×°ÍÀ» ¸µÅ©ÇÏ·Á ÇÒ ¶§°¡ ÀÖÀ¸¹Ç
·Î ldconfig´Â ¿©·¯ºÐÀÌ ¾î¶² ¶óÀ̺귯¸®¿Í ¸µÅ©ÇÏ°í ½ÍÀºÁö °¡Á¤ÇÏÁö ¾Ê´Â
°ÍÀÌ¸ç ±×·¡¼ ¼³Ä¡ÀÚ´Â ¾î¶² ¶óÀ̺귯¸®°¡ ¸µÅ©µÉ°ÍÀÎÁö¸¦ ¸í½ÃÇØ¾ß Çϴ°Í
À̶ó Çß´Ù.
ÀÌ»óÀÇ ¾ê±â¸¦ Á¾ÇÕÇÑ ¿¹¸¦ µé¾îº¸¸é ldconfig°¡ /usr/lib/libreadline.so.3.0°ú
°°Àº real nameÀÇ ½Éº¼¸¯ ¸µÅ©·Î ¼ÂÆÃÇÑ /usr/lib/libreadline.so.3 ÇüÅÂÀÇ ¿Ï
ÀüÇÑ °ø½ÄÀû sonameÀÌ ÀÖÀ»°ÍÀ̸ç /usr/lib/libreadline.so.3¿¡ ½Éº¼¸¯ ¸µÅ©µÈ
link nameÀ¸·Î½á /usr/lib/libreadline.so°¡ ¶ÇÇÑ ÀÖÀ» °ÍÀÌ´Ù.
- ÆÄÀÏ ½Ã½ºÅÛ»óÀÇ À§Ä¡
-
°øÀ¯ ¶óÀ̺귯¸®´Â ÆÄÀÏ ½Ã½ºÅÛ »óÀÇ Æ¯Á¤À§Ä¡¿¡ Á¸ÀçÇؾßÇÑ´Ù. ¿ÀÇ ¼Ò½º ¼Ò
ÇÁÆ®¿þ¾îµéÀº GNUÀÇ Ç¥ÁØÀ» µû¸£´Â °æÇâÀÌ ÀÖÀ¸¸ç ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº info¹®
¼ÀÇ [13]info:standards#Directory_Variables ºÎºÐÀ» »ìÆ캸±æ ¹Ù¶õ´Ù. GNU Ç¥
ÁØÀº ¼Ò½ºÄÚµåÀÇ ¹èÆ÷½Ã¿¡ ¸ðµç ¶óÀ̺귯¸®¸¦ /usr/local/lib¿¡ ¼³Ä¡ÇÏ±æ ±Ç
ÀåÇÑ´Ù(/usr/local/bin¿¡´Â ¸í·ÉµéÀÌ ¸ðÀÓ). GNUÇ¥ÁØÀº ¶ÇÇÑ ÀÌ·¯ÇÑ µðÆúÆ®µé
À» ¹«½ÃÇϰųª ¼³Ä¡·çƾÀ» È£ÃâÇÏ´Â ÀýÂ÷ µî¿¡ °üÇÑ °ü·ÊµéÀ» Á¤ÀÇÇÏ°í ÀÖ´Ù.
ÆÄÀϽýºÅÛ °èÃþÀû ±¸Á¶Ç¥ÁØ(FHS:File system Hierarchy Standard) ¶ÇÇÑ ¼Ò
½º¹èÆ÷½Ã¿¡ ¾î¶² À§Ä¡¿¡ ¹«¾ùÀ» µÎ¾î¾ß ÇÏ´ÂÁö¿¡ ´ëÇØ ³íÇÏ°í ÀÖ´Ù.(
www.pathname.com/fhs
¸¦ ÂüÁ¶Çϱ⠹ٶ÷). FHS¿¡¼´Â ´ëºÎºÐÀÇ ¶óÀ̺귯¸®¸¦
/usr/lib¿¡ ¼³Ä¡ÇÒ °ÍÀ» ±ÇÀåÇÑ´Ù, ±×·¯³ª ½Ã½ºÅÛ ½ÃÀ۽à ÇÊ¿äÇÑ ¶óÀ̺귯¸®´Â
/lib¿¡ ¶ÇÇÑ, ºñ½Ã½ºÅÛ ¶óÀ̺귯¸®´Â /usr/local/lib¿¡ ¼³Ä¡µÇ¾î¾ß ÇÑ´Ù.
À§ÀÇ µÎ Ç¥ÁØÀÌ ¼·Î ¸ð¼øµÇ´Â µí º¸ÀÌÁö¸¸ ½ÇÁ¦·Î ±×·¸Áö´Â ¾Ê´Ù. GNUÀÇ
Ç¥ÁØÀº ¼Ò½ºÄÚµåÀÇ °³¹ßÀÚ¸¦ À§ÇÑ µðÆúÆ®°ªÀ» Á¦¾ÈÇÏ´Â °ÍÀÌ°í, FHS´Â ¼Ò½º
ÀÇ ¹èÆ÷ÀÚ(½Ã½ºÅÛÀÇ µðÆúÆ® ¼Ò½ºÄڵ带 ¼±ÅÃÀûÀ¸·Î ±× ½Ã½ºÅÛÀÇ ÆÐÅ°Áö °ü¸®
µµ±¸¸¦ ÅëÇؼ ´ëÄ¡½ÃÅ°´Â)¸¦ À§ÇÑ µðÆúÆ®°ªÀ» Á¦¾ÈÇÏ´Â °ÍÀÌ´Ù. ½ÇÁ¦·Î ÀÌ°Í
Àº »ó´çÈ÷ È¿°úÀûÀÎ °ÍÀÌ´Ù, Áï, ´ç½ÅÀÌ ´Ù¿î·ÎµåÇÑ °¡Àå ÃÖ½ÅÀÇ(¹ö±×ÀÇ °¡´É
¼ºÀÌ ÀÖ´Â) ¼Ò½ºÄÚµå´Â ÀÚµ¿ÀûÀ¸·Î ·ÎÄà µð·ºÅ丮ÀÎ /usr/local¿¡ ¼³Ä¡µÉ°ÍÀ̸ç
±× Äڵ尡 ÀÌÁ¦ ¿Ïº®ÇØÁö¸é ÆÐÅ°Áö ¸Å´ÏÀú¸¦ ÀÌ¿ëÇÏ¿© ½Ã½ºÅÛ¿¡ ¼³Ä¡µÈ µð
ÆúÆ®(¶óÀ̺귯¸®)¸¦ ´ëÄ¡ÇÏ°í ¹èÆ÷½ÃÀÇ Ç¥ÁØ µð·ºÅ丮·Î ¼³Ä¡ÇÒ¼ö ÀÖ´Â °ÍÀÌ
´Ù. ¶óÀ̺귯¸®¸¦ ÅëÇؼ¸¸ È£Ãâ°¡´ÉÇÑ ÇÁ·Î±×·¥µéÀ» ¶óÀ̺귯¸®°¡ È£ÃâÇÏ´Â
°æ¿ì¿¡´Â ¹Ýµå½Ã ±× ÇÁ·Î±×·¥µéÀ» usr/local/libexec(¹èÆ÷º»¿¡¼´Â /usr/libexec
ÀÓ)¿¡ µÎ¾î¾ßÇÔÀ» ¸í½ÉÇ϶ó. ÇÑ°¡Áö È¥µ¿Àº ·¹µåÇÞÀÇ ¹èÆ÷º»µéÀº ¶óÀ̺귯¸®¸¦
ã´Â °úÁ¤¿¡¼ /usr/local µð·ºÅ丮¸¦ Á¦¿Ü ½ÃŲ´Ù´Â °ÍÀε¥, ¾Æ·¡¿¡¼ ³íÀÇ
µÉ /etc/so.confºÎºÐÀ» Âü°íÇÏ±æ ¹Ù¶õ´Ù. ±×¿Ü¿¡ ¶Ç´Ù¸¥ ÇϳªÀÇ Ç¥ÁØ
¶óÀ̺귯¸® µð·ºÅ丮°¡ Àִµ¥ X-À©µµ¿ì ½Ã½ºÅÛÀÌ »ç¿ëÇÏ´Â /usr/X11R6/libÀÌ ±×
°ÍÀÌ´Ù. /lib/security µð·ºÅ丮´Â PAM¸ðµâ¿¡¼ »ç¿ëµÊ¿¡ À¯ÀÇÇ϶ó. ÀÌ µð·º
Å丮´Â Åë»ó µ¿Àû ¶óÀ̺귯¸®·Î½á ÀûÀçµÈ´Ù.(¿ª½Ã µÞºÎºÐ¿¡¼ ³íÀǵɰÍÀÓ)
- ¶óÀ̺귯¸®´Â ¾î¶»°Ô »ç¿ëµÇ´Â°¡
-
¸ðµç ¸®´ª½º ½Ã½ºÅÛÀÌ Æ÷ÇԵǴ GNUÀÇ glibc-±â¹ÝÀÇ ½Ã½ºÅÛÀº ELF ÀÌÁø ½Ç
Çà ÇÁ·Î±×·¥ÀÇ ½ÃÀ۽ÿ¡ ÀÚµ¿ÀûÀ¸·Î ÇÁ·Î±×·¥ ·Î´õ¸¦ ÀûÀçÇÏ°í ½ÇÇà½ÃŲ´Ù.
¸®´ª½º ½Ã½ºÅÛ¿¡¼ ÀÌ ·Î´õ´Â /lib/ld-linux.so.X(X´Â ¹öÀü ³Ñ¹öÀÓ)À̶ó ºÒ¸®¿ö
Áö¸ç ÇÁ·Î±×·¥¿¡¼ »ç¿ëµÇ´Â ¸ðµç °øÀ¯ ¶óÀ̺귯¸®¸¦ Â÷·Ê´ë·Î ã¾Æ¼ ÀûÀç½Ã
Ų´Ù.
Ž»öµÇ¾îÁú µð·ºÅ丮ÀÇ ¸ñÂ÷´Â /etc/ld.so.conf¿¡ µé¾î ÀÖ´Ù. ·¹µåÇÞ¿¡ ±â¹ÝÇÑ
¹èÆ÷º»¿¡´Â ÀϹÝÀûÀ¸·Î /usr/local/lib°¡ /etc/ld.so.confÆÄÀÏ¿¡ µé¾î ÀÖÁö¾ÊÀºµ¥
ÀúÀÚ°¡ »ý°¢Çϱâ·Î ÀÌ°ÍÀº ÀÏÁ¾ÀÇ ¹ö±×°¡ ¾Æ´Ñ°¡ »ý°¢ÇÑ´Ù. ·¹µåÇÞÀÇ °æ¿ì
/usr/local/libÀ» /etc/ld.so.conf¿¡ ÷°¡ÇÏ´Â °ÍÀº ¸¹Àº ÇÁ·Î±×·¥µéÀ» ¼öÇà½ÃÅ°
±âÀ§ÇØ ÈçÈ÷ ÀÖ´Â ¼öÁ¤ÀÛ¾÷ÀÌ´Ù.
¸¸¾à ¶óÀ̺귯¸®³»ÀÇ Æ¯Á¤ÇÑ ÇÔ¼ö¸¸À» ´ëÄ¡½ÃÅ°°í ³ª¸ÓÁö´Â ±×´ë·Î À¯ÁöÇÏ·Á
ÇÒ¶§´Â ´ëÄ¡½Ãų ¶óÀ̺귯¸®(.oÆÄÀϵé)µéÀ» /etc/ld.so.preload ÆÄÀÏ¿¡ ¸í½ÃÇϸé
µÇ´Âµ¥ ÀÌ·¯ÇÑ ÇÁ¸®·Îµå ¶óÀ̺귯¸®µéÀº Ç¥ÁØÀûÀÎ ÇÔ¼öº¸´Ù ¿ì¼±±ÇÀ» °¡Áö°Ô
µÈ´Ù. ÀÌ·¯ÇÑ ÇÁ¸®·Îµù ÆÄÀϵéÀº º¸Åë ÀÀ±Þ ÆÐÄ¡º»¿¡¼ »ç¿ëµÇ´Âµ¥ Á¤»óÀû
¹èÆ÷º»¿¡´Â Àß Æ÷ÇÔµÇÁö ¾Ê´Â´Ù.
¸Å ÇÁ·Î±×·¥ÀÇ ½ÃÀ۽ø¶´Ù ÀÌ ¸ðµç µð·ºÅ丮µéÀ» Ž»öÇÏ´Â °ÍÀº Àü¹ÝÀûÀ¸·Î
¸Å¿ì ºñÈ¿À²ÀûÀ̱⠶§¹®¿¡ ½ÇÁ¦ÀûÀ¸·Î´Â ij½¬°¡ »ç¿ëµÈ´Ù. ldconfig ÇÁ·Î
±×·¥Àº Åë»ó /etc/ld.so.conf¸¦ ÀÐ¾î¼ ¸ðµç ÇÊ¿äÇÑ µ¿Àû ¸µÅ© µð·ºÅ丮µé·ÎºÎ
ÅÍ Àû´çÇÑ ½Éº¼¸¯ ¸µÅ©¸¦ »ý¼ºÇÑ´Ù.(±×·¡¼ À̸§ »ç¿ëÀÇ ±ÔÄ¢À» Àß µû¶ó¾ß
ÇÑ´Ù) ±× ´ÙÀ½À¸·Î /etc/ld.so.cache ¿¡ ÀÌ ³»¿ëµéÀ» ±â·ÏÇϸç ÀÌ ´ÙÀ½ ºÎÅÍ
´Â ÇÁ·Î±×·¥µéÀÌ ÀÌ ÆÄÀÏÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô Çؼ ¶óÀ̺귯¸®ÀÇ ¾×¼¼
½º ¼Óµµ´Â »ó´çÈ÷ Çâ»óµÇ´Â °ÍÀÌ´Ù. À§ÀÇ ³»¿ëÀÌ ÇÔÃàÇÏ´Â ¹Ù´Â DLLÀÌ
Ãß°¡ ¶Ç´Â Á¦°ÅµÉ ¶§, ¶Ç´Â DLLÀÇ µð·ºÅ丮°¡ º¯°æµÉ¶§´Â ¹Ýµå½Ã
ldconfig°¡ ½ÇÇàµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀ̸ç, ±×·¡¼ ÆÐÅ°Áö ¸Å´ÏÀú°¡ ¶óÀ̺귯¸®¸¦
¼³Ä¡ÇÒ ¶§, ÀÌ °úÁ¤Àº Åë»óÀ¸·Î ¼öÇàµÇ´Â ÀýÂ÷ÀÎ °ÍÀÌ´Ù. ±×·¡¼ ÇÁ·Î±×·¥ ½Ã
À۽à µ¿Àû ·Î´õ´Â ½ÇÁ¦·Î´Â /etc/ld.so.cache¸¦ »ç¿ëÇÏ¿© ÇÊ¿äÇÑ ¶óÀ̺귯¸®¸¦
ÀûÀçÇÏ´Â °ÍÀÌ´Ù.
- ȯ°æ º¯¼ö
-
¿©·¯ Á¾·ùÀÇ È¯°æº¯¼öµéÀÌ À§ÀÇ ÀÌ·¯ÇÑ ÇÁ·Î±×·¥ ½ÃÀÛ½ÃÀÇ ÀûÀç°úÁ¤µéÀ» Á¶
ÀýÇÒ¼ö ÀÖÀ¸¸ç ¶ÇÇÑ ÀÌ °úÁ¤µéÀ» ´ëÄ¡Çϵµ·Ï Çϴ ȯ°æº¯¼öµéµµ ÀÖ´Ù. ¿¹¸¦ µé
¸é ÀÌ ¼öÇà°úÁ¤Áß, ¾î¶² ¶óÀ̺귯¸®¸¦ ÀáÁ¤ÀûÀ¸·Î ±³Ã¼ÇÏ¿© ¼öÇàÇÒ¼öµµ ÀÖ´Ù.
¸®´ª½º¿¡¼ ȯ°æº¯¼ö LD_LIBRARY_PATH´Â ÄÝ·ÐÀ¸·Î ºÐ¸®µÇ¾î Àִ ǥÁØ
ÀûÀÎ ¶óÀ̺귯¸®¼Â¿¡ ¾Õ¼¼ °¡Àå ¸ÕÀú Ž»öµÇ¾îÁú ¶óÀ̺귯¸® µð·ºÅ丮ÁýÇÕ
ÀÌ´Ù. ÀÌ·¸°Ô ÇÏ¸é »õ·Î¿î ¶óÀ̺귯¸®¸¦ µð¹ö±ëÇϰųª ºñÇ¥ÁØÀûÀÎ ¶óÀ̺귯¸®
¸¦ ¾î¶² Ư¼öÇÑ ¿ëµµ·Î »ç¿ëÇÒ ¶§¿¡ À¯¿ëÇÒ°ÍÀÌ´Ù. ȯ°æº¯¼ö LD_PRELOAD
´Â /etc/ld.so. preloadó·³ Ç¥ÁØÀûÀÎ ÇÔ¼öµé¿¡ ¿À¹ö¶óÀ̵åµÉ ÇÔ¼öµéÀÌ ÀÖ´Â ¿À
ºêÁ§Æ® ÆÄÀÏÀÇ ¸®½ºÆ®¸¦ ³ªÅ¸³½´Ù. À§ÀÇ ÀÌ·¯ÇÑ ±â´ÉµéÀº ·Î´õ /lib/ld-linux.so
°¡ ±¸ÇöÇÑ´Ù.
ÀûÀç°úÁ¤À» Á¦¾îÇÏ´Â ´Ù¸¥ Á¾·ùÀÇ È¯°æº¯¼öµéÀÌ ÀÖ´Ù; À̸§ÀÌ LD_ ¶Ç´Â
RTLD_·Î ½ÃÀÛÇÑ´Ù. ÀÌ·¯ÇÑ º¯¼öµéÀÇ ´ëºÎºÐÀº ÀûÀç°úÁ¤ÀÇ Àú¼öÁØ µð¹ö±ëÀ̳ª
Ư¼ö±â´ÉÀÇ ±¸ÇöÀ» À§Çؼ »ç¿ëµÇ¾î Áø´Ù. ÀÌµé ´ëºÎºÐÀÌ Àß ¹®¼ÈµÇÁö ¾Ê¾Ò
±â ¶§¹®¿¡ ÀÚ¼¼È÷ ¾Ë·Á¸é ¼Ò½ºÄڵ带 Àо°¡´Â °ÍÀÌ ÃÖ¼±ÀÇ ¹æµµÀÏ °ÍÀÌ´Ù.
ÀÌ·¸°Ô µ¿Àû¸µÅ© ¶óÀ̺귯¸®¿¡ ´ëÇÑ Á¦¾î±ÇÀ» »ç¿ëÀÚ¿¡°Ô Çã¶ôÇÏ´Â °ÍÀº Ư
º°ÇÑ Á¶Ä¡°¡ ÃëÇØÁöÁö ¾Ê´Â´Ù¸é setuid/setgid µîÀÇ ÇÁ·Î±×·¥¿¡ À־ ´ë´Ü
È÷ À§ÇèÇÑ °ÍÀÌ´Ù. ±×·¡¼ GNU·Î´õÀÇ °æ¿ì ¸¸¾à¿¡ ÇÁ·Î±×·¥ÀÌ setuid ¶Ç´Â
setgidÀÏ °æ¿ì¿¡´Â ÀÌ·¯ÇÑ È¯°æº¯¼öµé(¶Ç´Â ÀÌ¿Í À¯»çÇÑ ´Ù¸¥ º¯¼öµé)Àº ¹«½Ã
µÇ°Å³ª ¾Æ´Ï¸é ÇÒ¼öÀÖ´Â ±â´ÉÀÌ ´ë´ÜÈ÷ Á¦ÇѵȴÙ. ·Î´õ´Â ÇÁ·Î±×·¥ÀÌ setuid
¶Ç´Â setgidÀÎÁö Á¡°ËÇϱâÀ§ÇØ ÇÁ·Î±×·¥ÀÇ credential¸¦ üũÇÑ´Ù; uid¿Í
euid(effective user ID)°¡ ´Ù¸£°Å³ª gid¿Í egid(effective group ID)°¡ ´Ù¸¥°æ
¿ì¿¡ ·Î´õ´Â ÀÌ ÇÁ·Î±×·¥À» setuid/setgid(¶Ç´Â »ó¼Ó¹ÞÀº°Í)ÀÌ¶ó °¡Á¤ÇÏ°í ¸µ
Å©°úÁ¤ÀÇ Á¦¾î±â´ÉÀ» ´ë´ÜÈ÷ Á¦ÇÑÇÏ°Ô µÈ´Ù. GNUÀÇ glibc¶óÀ̺귯¸®ÀÇ ¼Ò½ºÄÚ
µå¸¦ Àо¸é ÀÌ·¯ÇÑ ³»¿ëÀ» Àß º¼¼ö ÀÖÀ»°ÍÀ̸ç ƯÈ÷ elf/rtld.c, sysdeps/
generic/dl-sysdep.c¸¦ º¸±æ ¹Ù¶õ´Ù. ÀÌ°ÍÀÌ ¶æÇÏ´Â ¹Ù´Â ¸¸¾à¿¡ ´ç½ÅÀÌ uid,
gid¸¦ euid, egid¿Í °°°ÔÇÏ°í ÇÁ·Î±×·¥À» È£ÃâÇϸé ÀÌ·¯ÇÑ È¯°æº¯¼öµéÀº ¿ÏÀü
ÇÑ ¿µÇâ·ÂÀ» ¹ÌÄ¥¼ö ÀÖ´Ù´Â ¶æÀÌ´Ù. ´Ù¸¥ À¯´Ð½º À¯»ç ½Ã½ºÅ۵鿡¼´Â ÀÌ·¯ÇÑ
»óȲÀ» ´Ù¸£°Ô ´Ù·ç±âµµ ÇÏÁö¸¸ °°Àº ÀÌÀ¯·Î ÀÎÇؼ setuid/setgid ÇÁ·Î±×·¥
Àº ȯ°æº¯¼ö¿¡ ÀÇÇؼ À߸øµÈ ¿µÇâÀ» ¹Þ¾Æ¼´Â ¾ÊµÇ´Â °ÍÀÌ´Ù.
- °øÀ¯ ¶óÀ̺귯¸®ÀÇ »ý¼º
-
°øÀ¯ ¶óÀ̺귯¸®ÀÇ »ý¼ºÀº ½±´Ù. ¸ÕÀú gccÀÇ fPICÇ÷¡±×("position inde-
pendent code" °øÀ¯¶óÀ̺귯¸®·Î »ç¿ëÇÒ ¶§ Çʼö)¸¦ »ç¿ëÇÏ¿© ¿ÀºêÁ§Æ® ÆÄÀÏ
À» »ý¼ºÇÑ´Ù. ±× ´ÙÀ½¿£ ´ÙÀ½°ú °°Àº ¸í·ÉÇüÅ·Π°øÀ¯ ¶óÀ̺귯¸®¸¦ »ý¼ºÇÑ´Ù.
gcc -shared -WI, -soname, your_soname\
-o library_name file_list library_list
µÎ °³ÀÇ ¿ÀºêÁ§ÇÁ ÆÄÀÏ(a.o, b.o)À» Æ÷ÇÔÇÏ´Â ÇϳªÀÇ °øÀ¯ ¶óÀ̺귯¸®¸¦ »ý¼º
ÇÏ´Â ¿¹¸¦ µé¸é ¾Æ·¡¿Í °°´Ù. ÄÄÆÄÀϽÿ¡ °øÀ¯ ¶óÀ̺귯¸®¿¡ ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï
Áö¸¸ ±Ç°íµÇ´Â »çÇ×ÀÎ µð¹ö±ë Á¤º¸(-g¿É¼Ç)¿Í °æ°í(- wall¿É¼Ç)ÀÇ »ý¼º¿¡ À¯ÀÇ
Ç϶ó, ±×¸®°í -c¿É¼ÇÀ¸·Î ¿ÀºêÁ§Æ® ÆÄÀÏÀÌ »ý¼ºµÇ¸ç ºÐ¸íÈ÷ -fPIC ¿É¼ÇÀÌ »ç
¿ëµÇ°í ÀÖ´Ù.
gcc -fPIC -g -c -Wall a.c
gcc -fPIC -g -c -Wall b.c
gcc -shared -Wl, -soname, libmystuff.so.1 \
-o libmystuff.so.1.0.1 a.o b.o -lc
À̶§ ÁÖÀÇ»çÇ× ¸î°¡Áö¸¦ Àû¾îº¸¸ç ¾Æ·¡¿Í °°´Ù.
* ÄÄÆÄÀÏ °á°ú »ý¼ºµÉ ¶óÀ̺귯¸®¸¦ ¸í±âÇÏ´Â °ÍÀ» ÀØÁö ¸»°ÍÀ̸ç -fomit,
-frame, -pointer µîÀÇ ÄÄÆÄÀÏ·¯ ¿É¼ÇÀº ÁøÂ¥ ÇÊ¿äÇÒ °æ¿ì¿Ü¿£ ¾²Áö ¸» °Í.
°á°úÀûÀ¸·Î »ý¼ºµÈ ¶óÀ̺귯¸®´Â µ¿ÀÛÇÏÁö¸¸ ÀÌ·¸°Ô ÇÏ¸é µð¹ö°Å´Â ¹«¿ëÁö¹°
ÀÌ µÈ´Ù.
* -fpic°¡ ¾Æ´Ñ -fPIC¸¦ »ç¿ëÇÏ¿© ÄÚµå·Ñ »ý¼º½ÃÄÑ¾ß ÇÑ´Ù.(-fpic¸¦ ¾µ °æ¿ì ºÐ
±âÁ¡¿¡¼ Å« À§Ä¡º¯È°¡ ÇÊ¿äÇÒ°æ¿ì ¿ÏÀüÇÑ À§Ä¡ µ¶¸³Çü Äڵ带 ¾òÀ»¼ö ¾ø´Ù.)
- °øÀ¯ ¶óÀ̺귯¸®ÀÇ ¼³Ä¡ ¹× »ç¿ë
-
ÀÌÁ¦ ¸¸¾à¿¡ ´ç½ÅÀÌ ÇϳªÀÇ °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸¸µé¾ú´Ù¸é ±× ´ÙÀ½À¸·Î ¼³Ä¡
¸¦ ¿øÇÒ °ÍÀÌ´Ù. °¡Àå °£´ÜÇÑ ¹æ¹ýÀº ¸¸µé¾îÁø °øÀ¯ ¶óÀ̺귯¸®¸¦ Ç¥ÁØ µð·ºÅä
¸®µéÁßÀÇ Çϳª(¿¹¸¦ µé¸é /usr/lib)¿¡ º¹»çÇÏ°í ldconfig(8)¸¦ ½ÇÇà½ÃÅ°´Â °ÍÀÌ
´Ù.
¸¸¾à¿¡ (/usr/lib µð·ºÅ丮ÀÇ º¯°æ±ÇÀ» °¡ÁöÁö ¸øÇϰųª Çؼ) À§Ã³·³ ÇÒ¼ö ¾ø
´Â °æ¿ì°¡ ÀÖ´Ù¸é ȯ°æº¯¼ö¸¦ »ç¿ëÇÏ¿© Á¶Á¤ÇÒ¼ö ÀÖ´Ù. ¸ÕÀú ¾îµò°¡¿¡ °øÀ¯
¶óÀ̺귯¸®¸¦ »ý¼ºÇؾßÇÑ´Ù. ±× ´ÙÀ½¿¡ ÇÊ¿äÇÑ °ÍÀº real name¿¡ °üÇÑ ½Éº¼¸¯
¸µÅ©·Î½á sonameÀ» »ý¼º(¶Ç´Â ¹öÀü¸íÀ» ÀüÇô ¸í½ÃÇÏÁö ¾Ê´Â »ç¿ëÀÚÀ» À§ÇÑ
¹öÀü¸íÀÌ Æ÷ÇÔµÇÁö ¾ÊÀº sonameÀ» ½Éº¼¸¯ ¸µÅ©·Î »ý¼º)ÇÏ´Â °ÍÀε¥ À̸¦ À§
ÇÑ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº ´ÙÀ½°ú °°ÀÌ ldconfig¸¦ ½ÇÇàÇÏ´Â °ÍÀÌ´Ù.
ldconfig -n directory_with_shared_library
±× ´ÙÀ½À¸·Î Ç¥ÁØ ¶óÀ̺귯¸® º¸´Ù ¾Õ¼¼ Ž»öµÉ ¶óÀ̺귯¸® µð·ºÅ丮 ¸ñ·Ï
ÀÎ LD_LIBRARY_PATH º¯¼ö¸¦ ¼³Á¤ÇÑ´Ù. ¸¸¾à¿¡ bash¶ó¸é ´ÙÀ½°ú °°ÀÌ ÇÏ
¿© my_programÀ» Æ÷ÇÔµÇ°Ô ÇÒ¼ö ÀÖ´Ù.
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH my_program
¸¸¾à ƯÁ¤ÇÑ ÇÔ¼ö¸¸À» ¿À¹ö¶óÀ̵å ÇÏ·Á¸é ¿À¹ö¶óÀ̵ù ¿ÀºêÁ§Æ® ÆÄÀÏÀ» »ý¼º
ÇÑ µÚ¿¡ LD_PRELOAD¸¦ ¼³Á¤Çؼ ÇÒ¼ö ÀÖ´Ù. Áï, ÀÌ ÆÄÀÏ¿¡ ÀÖ´Â ÇÔ¼öµéÀÌ
±âÁ¸ ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵åÇÑ´Ù.
ÀϹÝÀûÀ¸·Î ¶óÀ̺귯¸®¸¦ °»½ÅÇϴµ¥ ÀÖ¾î Ưº°ÇÑ °í·Á»çÇ×Àº ¾ø´Ù. ¸¸¾à
API°¡ º¯ÈÇÑ´Ù¸é ¶óÀ̺귯¸®ÀÇ Á¦ÀÛÀÚ´Â sonameÀ» º¯°æÇÒ °ÍÀÌ´Ù. °°Àº
sonameÀ» °¡Áö¸é¼ ³»¿ëÀº °»½ÅµÈ ½Å¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ ¹«½ÃÇÏ°í ±¸¹öÀüÀÇ
¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ·Á¸é, ±¸¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ ¾îµò°¡¿¡ º¹»çÇÏ°í ±×°ÍÀÇ
À̸§À» º¯°æ(À̸¦Å×¸é ¿¾³¯À̸§.origµî)ÇÑ µÚ ÀÌ À̸§ º¯°æµÈ ¶óÀ̺귯¸®¸¦ ½Ç
Á¦·Î È£ÃâÇÏ¿© »ç¿ëÇϵµ·Ï Àç¼³Á¤ÇÏ´Â ÀÛÀº wrap½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÏ¿© °Á¦Àû
À¸·Î ±¸¹öÀüÀ» »ç¿ëÇÏ°Ô ÇÒ¼öÀÖ´Ù. °ü·Ê»ó ¿©·¯¹öÀüÀÇ ¶óÀ̺귯¸®µéÀÌ °°Àº µð
·ºÅ丮¿¡ ÀÖÀ»¼ö ÀÖÁö¸¸ ÀÌ ±¸¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ µû·Î ƯÁ¤ÇÑ µð·ºÅ丮¿¡
À§Ä¡½Ãų¼öµµ ÀÖ´Ù. wrap ½ºÅ©¤©Æ®´Â ¾Æ¸¶ ¾Æ·¡¿Í °°À» °ÍÀÌ´Ù.
#!/bin/sh
export LD_LIBRARY_PATH=/usr/local/my_lib:$LD_LIBRARY_PATH
exec /usr/bin/my_program.orig $*
ÇÑ ÇÁ·Î±×·¥ÀÌ »ç¿ëÇÏ´Â °øÀ¯ ¶óÀ̺귯¸®ÀÇ ¸ñ·ÏÀº ldd(1)¸¦ ½á¼ ¾Ë ¼ö ÀÖ
´Ù. ±×·¡¼, ¿¹¸¦ µé¸é ls¸í·ÉÀÌ »ç¿ëÇÏ´Â °øÀ¯ ¶óÀ̺귯¸®ÀÇ ¸ñ·ÏÀº ´ÙÀ½ÀÇ ¿¹
¿Í °°ÀÌ ¾Ë¼öÀÖ´Ù
ldd /bin/ls
º¸Åë ÇÁ·Î±×·¥¿¡¼ ÀÇÁ¸ÇÏ°í ÀÖ´Â ¶óÀ̺귯¸®ÀÇ sonameÀÇ ¸ñ·Ï°ú Æ÷ÇÔµÈ µð
·ºÅ丮°¡ º¸ÀÏ°ÍÀÌ´Ù. ½ÇÁúÀûÀ¸·Î ´ÙÀ½ÀÇ µÎ ¸ðµâÀÇÁ¸¼ºÀº Ç×»ó º¸ÀÏ°ÍÀε¥ ±×
°ÍÀº ¾Æ·¡¿Í °°´Ù.
* /lib/ld-linux.so.N(NÀº 1ÀÌ»ó Àû¾îµµ 2). ÀÌ ¶óÀ̺귯¸®´Â ´Ù¸¥ ¸ðµç
¶óÀ̺귯¸®¸¦ ÀûÀçÇÑ´Ù.
* libc.so.N(NÀº 6¶Ç´Â ±×ÀÌ»ó). ÀÌ°ÍÀº C ¶óÀ̺귯¸®ÀÌ´Ù. ´Ù¸¥ ÇÁ·Î±×·¡¹Ö
¾ð¾îµé¿¡¼µµ(Àû¾îµµ ±× ¾ð¾îÀÇ ¶óÀ̺귯¸®¸¦ ±¸ÇöÇϱâÀ§Çؼ) C ¶óÀ̺귯¸®
¸¦ ¾²´Â °æÇâÀÌ ÀÖ´Ù. ±×·¡¼ ¸ðµç ÇÁ·Î±×·¥¿¡¼ Àû¾îµµ ÀÌ ¶óÀ̺귯¸®´Â Æ÷
Ç﵃ °ÍÀÌ´Ù.
°æ°í: ldd¸¦ ½Å·ÚÇÒ¼ö ¾ø´Â ÇÁ·Î±×·¥¿¡ »ç¿ëÇÏ¿©¼´Â ¾ÊµÈ´Ù. ÀÌ´Â lddÀÇ ¸Å´º
¾ó¿¡µµ ¸í¹éÈ÷ ¾ð±ÞµÈ ¾ê±âÀÌ´Ù. ldd´Â Á÷Á¢ ±× ÇÁ·Î±×·¥À» È£ÃâÇÔÀ¸·Î½á ¼öÇà
µÇ±â ¶§¹®¿¡ ¿¹±âÄ¡ ¸øÇÑ ÄÚµåÀÇ ½ÇÇàÀ» °¡Á®¿Ã¼ö Àֱ⠶§¹®ÀÌ´Ù.
- ºñȣȯ ¶óÀ̺귯¸®
-
»õ·Î¿î ¹öÀüÀÇ ¶óÀ̺귯¸®°¡ ±¸¹öÀüÀÇ ¶óÀ̺귯¸®¿Í ÀÌÁøÄÚµå Â÷¿ø¿¡¼ ȣȯ
µÇÁö ¾Ê´Â´Ù¸é sonameÀº º¯°æµÉ ÇÊ¿ä°¡ ÀÖ´Ù. ÀÌÁøÄڵ忡¼ ºñȣȯµÇ´Â °æ
¿ì¿¡´Â ´ÙÀ½ÀÇ ³×°¡Áö ÀÌÀ¯°¡ °¡Àå ±âº»ÀûÀÌ´Ù.
- ÇÔ¼öÀÇ ÇൿÀÌ º¯°æµÇ¾î ¿ø·¡ÀÇ ÇÔ¼ö½ºÆå(±Ô°Ý)À» ´õ ÀÌ»ó ¸¸Á·ÇÏÁö ¸øÇÒ
¶§.
- ¿Ü·¡ µ¥ÀÌÅÍ ¾ÆÀÌÅÛÀÌ º¯ÇßÀ»¶§(¿¹¿Ü:¿É¼Ç ¾ÆÀÌÅÛÀ» ¶óÀ̺귯¸®ÀÇ ±¸Á¶ ¸¶
Áö¸· ºÎºÐ¿¡ ÷°¡ÇÏ´Â °ÍÀº ÀÌ·¯ÇÑ ¾ÆÀÌÅÛ±¸Á¶°¡ ¶óÀ̺귯¸®ÀÇ ³»ºÎ¿¡ ÇÒ´çµÇ
¾î ÀÖ´ÂÇÑ ±¦ÂúÀ½)
- ¿Ü·¡ÇÔ¼ö°¡ Á¦°ÅµÇ¾úÀ» ¶§.
- ¿Ü·¡ÇÔ¼öÀÇ ÀÎÅÍÆäÀ̽º°¡ º¯°æµÇ¾úÀ» ¶§.
¸¸¾à ÀÌ·¯ÇÑ ¿øÀεéÀ» ´ç½ÅÀÌ ÇÇÇØ°£´Ù¸é ´ç½ÅÀÇ ¶óÀ̺귯¸®´Â ÀÌÁø¸ðµå¿¡
¼ ȣȯ°¡´ÉÇÒ °ÍÀÌ´Ù. ´Ù¸¥ ½ÄÀ¸·Î ¾ê±âÇÏÀÚ¸é ´ç½Å ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ÀÌÁø
ÀÎÅÍÆäÀ̽º(ABI) ȣȯ¼ºÀº ÀÌ·¯ÇÑ º¯°æÀ» ÇÏÁö¾Ê´Â´Ù¸é ÁöÄÑÁú °ÍÀÌ´Ù. ¿¹
¸¦µé¸é ´ç½ÅÀº »õ·Î¿î ÇÔ¼ö¸¦ Ãß°¡Ç쵂 ±âÁ¸ÇÔ¼öµéÀ» »èÁ¦ÇÏÁö¾Ê±æ ¿øÇÒ¼ö ÀÖ
À» °ÍÀÌ´Ù. ´ç½ÅÀº ±¸¹öÀüÀÇ ÇÁ·Î±×·¥ÀÌ ¶óÀ̺귯¸® ±¸Á¶ÀÇ ³¡ºÎºÐ¿¡ ¾ÆÀÌÅÛ
À» Ãß°¡Çϰųª, ¶Ç´Â (ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ¾Æ´Ñ)¶óÀ̺귯¸®¿¡¼¸¸ ÀÌ·¯ÇÑ ±¸Á¶¸¦
ÇÒ´çÇϰųª, ¶Ç´Â ¾î¶² ƯÁ¤ÇÑ ¾ÆÀÌÅÛÀ» ¿É¼ÇÈÇÏ´Â(¶Ç´Â ¶óÀ̺귯¸®¿¡¼ ±×
¾ÆÀÌÅÛÀ» ä¿ö³Ö´Â)µîµîÀÇ ÀÌ·¯ÇÑ º¯°æ¿¡ ¿µÇâÀ» ¹ÞÁö¾ÊÀ½ÀÌ È®½ÇÇÒ¶§¸¸ ±×
¶óÀ̺귯¸® ±¸Á¶¿¡ ÀÌ·¯ÇÑ ¾ÆÀÌÅÛÃß°¡¸¦ ÇÒ¼öÀÖ´Â °ÍÀÌ´Ù. »ç¿ëÀÚµéÀÌ ¹è¿À»
»ç¿ëÇÏ°í ÀÖÀ»½Ã¿¡´Â ±×·¯ÇÑ ±¸Á¶È®ÀåÀ» ¾Æ¸¶ ÇÒ¼ö ¾øÀ» °ÍÀÓ¿¡ À¯ÀÇÇ϶ó.
µ¿Àû ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÇ ½ÃÀ۽ð¡ ¾Æ´Ñ ´Ù¸¥¶§¿¡ ÀûÀçµÇ´Â ¶óÀ̺귯¸®
¸¦ ¸»ÇÑ´Ù. Ç÷¯±×ÀεîÀÇ ¸ðµâÀº ±×°ÍÀÇ ÇÊ¿ä½Ã±îÁö ÀûÀ縦 ±â´Ù¸®´Â °ÍÀÌ Çã
¿ëµÇ¹Ç·Î À̵éÀÇ ±¸Çö¿¡ ƯÈ÷ À¯¿ëÇÏ´Ù. ¿¹¸¦µé¸é PAM(Pluggable Authenti-
cation Module:ÀûÀç°¡´É ÀÎÁõ¸ðµâ)µîÀÇ ½Ã½ºÅÛ¿¡¼´Â °ü¸®ÀÚ°¡ ÀÎÁõÀ» ±¸¼º¶Ç
´Â À籸¼ºÇϴµ¥ µ¿Àû ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ´Ù. ¶ÇÇÑ µ¿Àû ¶óÀ̺귯¸®´Â ¼ö½Ã·Î
¾ð¾îÄڵ带 ±â°è¾î·Î ÄÄÆÄÀÏÇÏ°í, ÄÄÆÄÀÏµÈ ¸ðµâµéÀ» È¿À²ÀûÀ¸·Î ¸ØÃã¾øÀÌ »ç
¿ëÄÚÀúÇÏ´Â ÀÎÅÍÇÁ¸®Å͸¦ ±¸ÇöÇϴµ¥µµ À¯¿ëÇÏ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀº Àú½ºÆ® ÀΟ
ÀÓ ÄÄÆÄÀÏ·¯(JIT)³ª ¸ÖƼ À¯Àú´øÀü(MUD:multi user dungeon)ÀÇ °³¹ß¿¡µµ À¯
¿ëÇÏ´Ù.
¸®´ª½º¿¡¼´Â µ¿Àû ¶óÀ̺귯¸®´Â Æ÷¸Ë¸¸ÀÇ °üÁ¡¿¡¼ º»´Ù¸é Ưº°ÇÑ °ÍÀÌ ¾Æ
´Ï´Ù. Áï, ±×°ÍÀº À§¿¡¼ ³íÀÇÇÑ Ç¥ÁØÀûÀÎ ¿ÀºêÁ§Æ® ÆÄÀÏÀ̳ª Ç¥ÁØÀûÀÎ °øÀ¯
¶óÀ̺귯¸®·Î½á ¸¸µé¾îÁø´Ù. °¡Àå Áß¿äÇÑ Â÷ÀÌÁ¡Àº ±×°ÍÀÌ ÇÁ·Î±×·¥ÀÇ ¸µÅ©½Ã
³ª ½ÃÀ۽ÿ¡ ÀÚµ¿À¸·Î ÀûÀçµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó´Â °ÍÀÌ´Ù. ±× ´ë½ÅÀ¸·Î
¶óÀ̺귯¸®¸¦ ¿°í ½Éº¼À» »ìÇÇ¸ç ¿¡·¯¸¦ Á¦¾îÇÏ°í ´Ý´ÂµîÀÇ API°¡ Á¦°øµÈ´Ù. CÀÇ »ç
¿ëÀÚ´Â ÀÌ·¯ÇÑ API¸¦ »ç¿ëÇϱâ À§Çؼ <dlfcn.h>¸¦ includeÇÏ¿©¾ß ÇÑ´Ù.
¸®´ª½º¿¡¼ »ç¿ëµÇ´Â ÀÎÅÍÆäÀ̽º¸¦ ³ª´Â "dlopen() API"¶ó°í ºÎ¸£¸ç ¼Ö¶ó¸®
½ºÀÇ ±×°Í°ú Çٽɿ¡ À־ µ¿ÀÏÇÏ´Ù. ±×·¯³ª ÀÌ·¯ÇÑ µ¿ÀÏÇÑ ¹æ½ÄÀÇ ÀÎÅÍÆä
À̽º°¡ ¸ðµç Ç÷§Æû¿¡¼ °°Àº °ÍÀº ¾Æ´Ï´Ù. HP-UX´Â shl_load()¶ó´Â ´Ù¸¥ ¸Þ
Ä¿´ÏÁòÀ» »ç¿ëÇϸç À©µµ¿ìÁî¿¡¼´Â DLLÀ» ¿ÏÀüÈ÷ ´Ù¸¥ ÀÎÅÍÆäÀ̽º·Î ´Ù·é
´Ù. À̽ļº¿¡ ¸ñÇ¥¸¦ µÐ´Ù¸é Ç÷§Æû°£ÀÇ ÀÌÁú¼ºÀ» ¼û±â°ÔÇØÁÖ´Â ¸î°³ÀÇ
wrapping ¶óÀ̺귯¸®ÀÇ »ç¿ëÀ» °í·ÁÇؾßÇÑ´Ù. ÇÑ°¡Áö ¹æ¹ýÀ¸·Î glib
¶óÀ̺귯¸®ÀÇ µ¿Àû ¸ðµâÀûÀç±â´ÉÀÌ ÀÖ´Ù. ÀÌ°ÍÀº ÀÌ·¯ÇÑ ÇÔ¼öµéÀÇ À̽ļº ±¸ÇöÀ» À§ÇØ
Ç÷§ÆûÀÇ ÇϺο¡ ÀÖ´Â µ¿ÀûÀûÀç·çƾÀ» »ç¿ëÇÑ´Ù. ÀÌ¿¡°üÇÑ ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº
[15]
developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html
¿¡¼ ¹è¿ï¼ö ÀÖ´Ù. ¿©±â ¹®¼¿¡¼ Àß ¼³¸íµÇ¾î ÀÖÀ¸¹Ç·Î ´õ ÀÌ»ó
ÀÇ ¼³¸íÀº ÇÏÁö ¾Ê°Ú´Ù. ´Ù¸¥ ¹æ¹ýÀº [16]GNU libtoolÁß¿¡ ÇϳªÀÎ libltdlÀ»
¾²´Â °ÍÀÌ´Ù. ÀÌ°ÍÀÇ ´Ù¾çÇÑ ±â´ÉÀ» ¾²±âÀ§Çؼ´Â ¾Æ¸¶µµ COBRA Object
Broker(ORB)¸¦ º¸±æ ¹Ù¶õ´Ù. ¸®´ª½º¿Í ¼Ö¶ó¸®½º¿¡¼ Á¦°øÇÏ´Â ±â´É¿¡ ¿©ÀüÈ÷
°ü½ÉÀÌ ÀÖ´Ù¸é °è¼Ó ÀоîÁÖ±æ ¹Ù¶õ´Ù.
- dlopen()
-
dlopen(3) ÇÔ¼ö´Â ¶óÀ̺귯¸®¸¦ ¿¾î¼ »ç¿ëÁغñ¸¦ ÇÑ´Ù. C¿¡¼ ÇÔ¼öÀÇ ¿ø
ÇüÀº ¾Æ·¡¿Í °°´Ù.
void *dlopen(const char *filename, int flag);
¸¸¾à¿¡ ÆÄÀÏÀÇ À̸§ÀÌ /(Áï, Àý´ë°æ·Î)·Î ½ÃÀÛÇÑ´Ù¸é dlopen()Àº
¶óÀ̺귯¸®¸¦ Ž»öÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù. ±×·¸Áö ¾Ê´Ù¸é dlopen()Àº ´ÙÀ½°ú °°Àº ¼ø¼·Î
¶óÀ̺귯¸®¸¦ Ž»öÇÑ´Ù.
- ÄÝ·ÐÀ¸·Î ºÐ¸®µÈ »ç¿ëÀÚÀÇ LD_LIBRARY ȯ°æº¯¼öÀÇ °¢ µð·ºÅ丮 ¸ñ·Ï.
- /etc/ld.so.cache¿¡ ¸í¼¼µÈ ¶óÀ̺귯¸®µé
- /lib, ±×´ÙÀ½Àº /usr/lib
dlopen()¿¡¼ Ç÷¡±×ÀÇ °ªÀº µ¿Àû ¶óÀ̺귯¸®·Î ºÎÅÍÀÇ ÄÚµå ¼öÇà½Ã¿¡ ¹ÌÁ¤ÀÇ
µÈ ½Éº¼°ªÀ» ÇØ°áÇÔÀ» ¶æÇÏ´Â RTLD_LAZY, dlopen()ÀÌ ¸®ÅϵDZâÀü ¸ðµç ¹Ì
Á¤ÀÇµÈ ½Éº¼ÀÇ °ªÀÌ ÇØ°áµÇ´Â, ±×·¸Áö ¾ÊÀ¸¸é ½ÇÆи¦ ¶æÇÏ´Â RTLD_NOW
ÁßÀÇ Çϳª°¡ µÇ¾î¾ß ÇÑ´Ù. ¶óÀ̺귯¸®³»¿¡¼ Á¤ÀÇµÈ ¿Ü·¡½Éº¼ÀÌ ¼øÂ÷ÀûÀ¸·Î
È£ÃâµÇ´Â ¶óÀ̺귯¸®µé¿¡ ÀÇÇؼ À¯È¿ÇØÁüÀ» ¶æÇÏ´Â RTLD_ GLOBAL¶ÇÇÑ
»ç¿ëµÇ°Å³ª ¿É¼ÇÀÌ µÉ ¼ö ÀÖ´Ù. µð¹ö±ë ÁßÀ̶ó¸é RTLD_LAZY´Â ¹ÌÇØ°áµÈ
½Éº¼ÂüÁ¶¿¡ ÀÇÇÑ ¿¹Ãø ºÒ°¡´ÉÀÇ ¿¡·¯¸¦ ÀÏÀ¸Å³¼ö ÀÖÀ¸¹Ç·Î RTLD_NOW¸¦
»ç¿ëÇÏ±æ ¿øÇÒ °ÍÀÌ´Ù. RTLD_NOW´Â ¶óÀ̺귯¸®¸¦ ¿©´Âµ¥ ¾à°£ ´À¸®´Ù.
ÀÌ°ÍÀÌ ¹®Á¦°¡ µÈ´Ù¸é RTLD_LAZY·Î ³ªÁß¿¡ ÀüȯÇϸéµÈ´Ù.
¸¸¾à ¶óÀ̺귯¸®µéÀÌ ¼·Î ÀÇÁ¸ÇÒ °æ¿ì(¿¹¸¦ µé¸é X°¡ Y¸¦ ÀÇÁ¸ÇÑ´Ù¸é), ÀÇ
Á¸ÀÌ µÇ¾îÁÖ´Â ¶óÀ̺귯¸®(ÀÌ ¿¹¿¡¼´Â Y)¸¦ ¸ÕÀú ·ÎµåÇÏ¿©¾ß ÇÑ´Ù.
dlopen()ÀÇ ¸®ÅÏ°ªÀº (ÀûÀçµÇ´Â µ¿Àû ¶óÀ̺귯¸®ÀÇ ÀÏÁ¾ÀÇ ÆÄÀÏ) ÇÚµé(handle)
ÀÌ´Ù. ±×°ÍÀº ´Ù¸¥ µ¿Àû ¶óÀ̺귯¸® ·çƾ¿¡¼ »ç¿ëµÇ¾îÁú ¾î¶°ÇÑ °ªÀ̶ó °í·Á
µÉ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀûÀç½Ãµµ°¡ ½ÇÆÐÇϸé dlopen()Àº NULLÀ» ¸®ÅÏÇÒ °ÍÀ̸ç
Á¡°ËÇØ º¸±æ ¹Ù¶õ´Ù. °°Àº ¶óÀ̺귯¸®°¡ µÎ¹ø ÀÌ»ó dlopen()¿¡ ÀÇÇؼ ·ÎµåµÈ
´Ù¸é °°Àº ÆÄÀÏ ÇÚµéÀÌ ¸®ÅϵȴÙ.
¸¸¾à ¶óÀ̺귯¸®¿¡¼ _init·Î ¸í¸íµÈ ·çƾÀ» ¿ÜºÎ È£Ãâ ÇÑ´Ù¸é ±× Äڵ尡
dlopen()ÀÇ ¸®ÅÏÀü¿¡ ¼öÇàµÈ´Ù. ÀÌ·¯ÇÑ »ç½ÇÀ» ÀÌ¿ëÇØ ´ç½ÅÀÇ ¶óÀ̺귯¸®¿¡¼
ÃʱâÈ ·çƾÀ» ±¸ÇöÇÏ¸é µÉ °ÍÀÌ´Ù.
- dlerror()
-
¿¡·¯´Â dlerror()À» È£ÃâÇÔÀ¸·Î½á º¸°íµÇ´Âµ¥, ÀÌ ÇÔ¼ö´Â °¡Àå ÃÖ±ÙÀÇ
dlopen(), dlsym(), ¶Ç´Â dlclose()·Î ÀÎÇØ ¹ß»ýÇÑ ¿¡·¯¸¦ ±â¼úÇÏ´Â ½ºÆ®¸µ
À» ¸®ÅÏÇÑ´Ù. ÇÑ°¡Áö Ưº°ÇÑ Á¡Àº dlerror()¸¦ È£ÃâÇÏ°í ³µÚ¿¡´Â ±× ´ÙÀ½ºÎ
ÅÍ´Â ¶Ç´Ù¸¥ ¿¡·¯°¡ ¹ß»ýÇϱâ Àü±îÁö dlerror()´Â NULLÀ» ¸®ÅÏÇÑ´Ù´Â °ÍÀÌ
´Ù.
- dlsym()
-
µ¿Àû ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ°í »ç¿ëÇÏÁö ¸øÇÑ´Ù¸é ¾Æ¹«·± Àǹ̵µ ¾øÀ» °ÍÀÌ´Ù.
dlsym(3)Àº ¶óÀ̺귯¸® »ç¿ëÀÇ °¡Àå ÁÖµÈ ·çƾÀ̸ç ÀÌ ÇÔ¼ö´Â ¿ÀǵÈ
¶óÀ̺귯¸®¿¡¼ ½Éº¼°ªÀ» Á¶»çÇÑ´Ù. ÀÌÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾîÀÖ´Ù.
void *dlsym(void *handle, char *symbol);
handleÀº dlopen()¿¡ ÀÇÇØ ¸®ÅϵǴ °ªÀ̸ç symbolÀº NIL-·Î ³¡³ª´Â ¹®ÀÚ¿
ÀÌ´Ù. dlsym()ÀÇ °á°ú°ªÀ» void * ŸÀÙÀÇ Æ÷ÀÎÅÍ¿¡ ÀúÀåÇÏ¸é ¸Å¹ø »ç¿ë½Ã¸¶´Ù
ij½ºÆ® ¿¬»êÀ» ¼öÇàÇØ¾ß ÇϹǷÎ(±×¸®°í, ÇÁ·Î±×·¥À» À¯ÁöÇÏ·Á´Â ¸¹Àº ´Ù¸¥ »ç
¶÷µé¿¡°Ô ÀûÀº Á¤º¸¹Û¿¡ ÁÖÁö¸øÇÒ °ÍÀ̹ǷÎ) ÇÇÇÒ¼ö ÀÖ´Ù¸é ÀÌ·¸°Ô ÇÏÁö¸»±æ
¹Ù¶õ´Ù.
dlsym()Àº ½Éº¼ÀÌ ¹ß°ßµÇÁö ¾ÊÀº°æ¿ì¿¡ NULL°ªÀ» ¸®ÅÏÇϰԵȴÙ. ¸¸¾à¿¡ ¾î
¶² ½Éº¼ÀÌ °áÄÚ Á¦·Î³ª NULL°ªÀ» °¡ÁöÁö ¾ÊÀ» °ÍÀ» ´ç½ÅÀÌ ¾Ë°í ÀÖ´Ù¸é ¾Æ
¹«·± ¹®Á¦µµ ¾øÀ¸³ª ¸¸¾à ±×·¸Áö ¾Ê´Ù¸é ÀáÀçÀûÀÎ ¸ðÈ£¼ºÀÌ Á¸ÀçÇÏ°Ô µÈ´Ù, Áï
¸¸¾à¿¡ NULL°ªÀ» °¡Áö°Ô µÈ °æ¿ì ±×°ÍÀÌ ±×·± ½Éº¼ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù´Â °Í
ÀÎÁö ¾Æ´Ï¸é ½ÇÁ¦·Î ±× ½Éº¼ÀÇ °ªÀÌ NULLÀÎÁö ÇÏ´Â °ÍÀÌ´Ù. Ç¥ÁØÀûÀÎ ÇØ°á
Ã¥Àº dlerror()À» È£Ãâ(Á¸ÀçÇÒ¼ö ÀÖ´Â ¸ðµç ¿¡·¯ÀÇ °¡´É¼ºÀ» ÇؼÒÇϴ°ÍÀÓ)
ÇÏ°í ±×´ÙÀ½À¸·Î ½Éº¼°ªÀ» ¾Ë±âÀ§ÇØ dlsym()À» È£ÃâÇÑ µÚ dlerror()À» Çѹø
´õ È£ÃâÇÏ¿© ¿¡·¯°¡ ¹ß»ýÇß´ÂÁö¸¦ Á¡°ËÇÏ´Â °ÍÀÌ´Ù. ÀÌ ºÎºÐÀÇ Äڵ带 ¹ßÃéÇÑ
´Ù¸é ¾Æ·¡¿Í °°À» °ÍÀÌ´Ù.
dlerror();
/* ¿¡·¯ÄÚµåÀÇ ÃʱâÈ */
s = (actual_type) dlsym(handle, symbol_being_searched_for);
if ((err = dlerror()) != NULL)
/* ½Éº¼°ªÀ» ãÁö ¸øÇÒ¶§ */
else
/* ½Éº¼°ªÀ» ã¾ÒÀ» ¶§ ±× °ªÀÌ s¿¡ ÀÖÀ½ */
- dlclose()
-
dlclose()´Â dlopen()ÀÇ ¿ªÀ¸·Î½á µ¿Àû ¶óÀ̺귯¸®¸¦ ´Ý´Âµ¥ »ç¿ëµÈ´Ù. µ¿Àû
¶óÀ̺귯¸®´Â µ¿Àû ÆÄÀÏÇڵ鿡 °üÇÑ ¸µÅ©¼öÈ¿¸¦ °è¼Ó À¯ÁöÇÏ°í ÀÖÀ¸¹Ç·Î Àû¾î
µµ dlopen()ÀÌ È£ÃâµÈ Ƚ¼ö¸¸ÅÀÇ dlclose()ÀÇ ¼öÇàÀÌ ¾ø±â Àü¿¡´Â ½ÇÁ¦ÀûÀ¸·Î
¸Þ¸ð¸®¿¡¼ »èÁ¦µÇÁö ¾Ê´Â´Ù. ±×·¡¼ °°Àº ÇÁ·Î±×·¥ÀÌ °°Àº ¶óÀ̺귯¸®¸¦ ¿©
·¯¹ø È£ÃâÇÏ´Â °ÍÀº ¾Æ¹«·± ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù.
µ¿Àû ¶óÀ̺귯¸®ÀÇ ¿¹
dlopen()ÀÇ ¸Å´º¾ó ÆäÀÌÁö¿¡ ³ª¿À´Â µ¿Àû¶óÀ̺귯¸®ÀÇ ¿¹°¡ ¾Æ·¡¿¡ ÀÖ´Ù. ¿¹
¿¡¼´Â ¼öÇжóÀ̺귯¸®°¡ ·ÎµåµÇ°í 2.0ÀÇ cosine°ªÀÌ Ãâ·ÂµÇ¸ç ¸Å¼ø°£¸¶´Ù ¿¡
·¯¸¦ °Ë»ç(±Ç°íµÊ)ÇÑ´Ù.
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char **argv)
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("/lib/libm.so", RTLD_LAZY);
if (!handle)
fputs (dlerror(), stderr);
exit(1);
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL)
fputs(error, stderr);
exit(1);
printf ("%f", (*cosine)(2.0));
dlclose(handle);
¸¸¾à À§ÀÇ ÇÁ·Î±×·¥ÀÇ À̸§ÀÌ foo.c ¶ó¸é ´ÙÀ½ÀÇ ¸í·ÉÀ» ½á¼ ½ÇÇàÇÁ·Î±×·¥À»
¸¸µé ¼ö ÀÖ´Ù.
gcc -Wl,export-dynamic -o foo foo.c -ldl
-WI, export-dynamic ¿É¼ÇÀº ½ÇÁúÀûÀ¸·Î ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï³ª ¶§¶§·Î À¯¿ëÇÔ
À» ¾Ë°ÔµÉ °ÍÀÌ´Ù. ±×°ÍÀº ld¿¡ Á¤ÀǵǾî Àִµ¥ ELFÆÄÀÏÀÇ »ý¼º½Ã¿¡ À̿ɼÇ
Àº ¸ðµç ½Éº¼À» ´ÙÀ̳ª¹Í ½Éº¼Å×ÀÌºí¿¡ ºÎ°¡ÇÑ´Ù. Åë»óÀûÀ¸·Î ´ÙÀ̳ª¹Í ½Éº¼Å×
À̺íÀº µ¿Àû ¿ÀºêÁ§Æ®¿¡¼ »ç¿ëµÇ´Â ½Éº¼¸¸À» °¡Áö°í ÀÖ´Ù. ÀÌ ¿É¼ÇÀº
dlopen()ÀÇ ¾î¶² ¿ëµµ¿¡¼ ÇÊ¿äÇÏ´Ù. -WI, export-dynamic º¸´Ù -rdynamicÀ»
¾²¶ó°í ¸»ÇÒ¼öµµ ÀÖ°ÚÁö¸¸ ELF¹®¼¿¡ ÀÇÇϸé -rdynamicÀº ºñ ¸®´ª½º ½Ã½º
ÅÛÀÇ gcc¿¡¼´Â Ç×»ó Á¦´ë·Î µ¿ÀÛÇÏ´Â °ÍÀº ¾Æ´Ï¶ó°í ÇÑ´Ù.
nm ¸í·É
nm¸í·ÉÀº ÁÖ¾îÁø ¶óÀ̺귯¸®ÀÇ ½Éº¼¸ñ·ÏÀ» º¸°íÇÑ´Ù. ±×°ÍÀº °øÀ¯ ¹× Á¤Àû
¶óÀ̺귯¸® ¸ðµÎ¿¡¼ µ¿ÀÛÇÑ´Ù. ÁÖ¾îÁø ¶óÀ̺귯¸®ÀÇ Á¤ÀÇµÈ ½Éº¼¸í°ú °ª ±×¸®°í
ŸÀÙÀ» ¾Ë·ÁÁØ´Ù. ÀÌ ¸í·ÉÀº ¶ÇÇÑ ¶óÀ̺귯¸®¿¡¼ ÀÌ Á¤º¸°¡ À¯È¿ÇÏ°Ô µÇ¾îÀÖ
´Ù¸é(-ls¿É¼ÇÀ» º¸¶ó) ¼Ò½ºÄÚµå»óÀÇ ¾îµð¿¡¼ ½Éº¼ÀÌ Á¤ÀǵǾú´Â°¡(ÆÄÀÏÀ̸§°ú
¶óÀγѹö·Î)µµ ¾Ë·ÁÁØ´Ù.
½Éº¼Å¸ÀÙ¿¡ ´ëÇؼ´Â Á»´õ ¼³¸íÀÌ ÇÊ¿äÇÏ´Ù. ŸÀÙÀÌ º¸°íµÉ ¶§ ¼Ò¹®ÀÚ´Â Áö¿ª
º¯¼öÀÓÀ» ³ªÅ¸³»¸ç ´ë¹®ÀÚ´Â Àü¿ª(¿ÜºÎ)º¯¼öÀÓÀ» ³ªÅ¸³½´Ù. ÀüÇüÀûÀÎ ½Éº¼Å¸ÀÙ
¿¡´Â T(ÄÚµåºÎºÐ¿¡¼ º¸ÅëÀÇ Á¤ÀÇ), D(ÃʱâÈµÈ µ¥ÀÌŸ ºÎºÐ), B(ÃʱâÈ ¾ÊµÈ
µ¥ÀÌÅÍ ¼½¼Ç), U(¹ÌÁ¤ÀÇ:½Éº¼ÀÌ ¶óÀ̺귯¸®¿¡¼ »ç¿ëµÇ³ª ±× ¶óÀ̺귯¸®¿¡ ÀÇ
Çؼ Á¤ÀǵÇÁö ¾ÊÀ½), W(´Ù¸¥ ¶óÀ̺귯¸®°¡ ÀÌ ½Éº¼À» Á¤ÀÇÇÏ¸é ±× ³»¿ëÀÌ ÀÌ
¸¦ ´ëÄ¡(override)ÇÔ)µîÀÌ ÀÖ´Ù.
ÇÔ¼öÀÇ À̸§Àº ¾Ë°í ÀÖÁö¸¸ Á¤È®È÷ ¾î´À ¶óÀ̺귯¸®¿¡¼ Á¤ÀǵǾîÀÖ´ÂÁö ¸ð
¸¥´Ù¸é nm ¸í·ÉÀÇ -o¿É¼Ç(°¢ ¶óÀθ¶´Ù ÆÄÀϸíÀ» ¾Õ¿¡ º¸¿©ÁÜ)À» »ç¿ëÇÏ°í µ¿
½Ã¿¡ grep¸í·ÉÀ» ½á¼ ¶óÀ̺귯¸®ÀÇ À̸§À» ã¾Æº¸±æ ¹Ù¶õ´Ù. Bourne
shell¿¡¼ /lib, /usr/libÀÇ ¸ðµç ¶óÀ̺귯¸®¿Í /usr/lib, /usr/local/libÀÇ Á÷°è ¼
ºêµð·ºÅ丮¿¡¼ "cos"¸¦ ã´Â °ÍÀº ¾Æ·¡¿Í °°À» °ÍÀÌ´Ù.
nm -o /lib/* /usr/lib/* /usr/lib/*/*
/usr/local/lib/* 2> /dev/null | grep 'cos$'
´õ ÀÌ»óÀÇ ÀÚ¼¼ÇÑ ³»¿ëÀº [17]info:binutils#nmÀ» ÂüÁ¶Ç϶ó
°øÀ¯ ¶óÀ̺귯¸®´Â ½ºÅ©~PlÆ®Àϼö ÀÖ´Ù.
GNU ·Î´õ´Â °øÀ¯ ¶óÀ̺귯¸®°¡ ¹ÙÀ̳ʸ® ÀÌ¿Ü¿¡µµ ƯÁ¤ÇÑ ½ºÅ©¸³Æ®¾ð¾î·Î
ÀÛ¼ºµÈ ÅؽºÆ®ÆÄÀϷεµ °¡´ÉÇϵµ·Ï Çã¿ëÇÏ°í ÀÖÀ½À» ¾ËÇÊ¿ä°¡ ÀÖ´Ù. ÀÌ°ÍÀº °£
Á¢ÀûÀ¸·Î ´Ù¸¥ ¶óÀ̺귯¸®µéÀ» Á¶ÇÕÇϴµ¥ À¯¿ëÇÏ´Ù. ¿¹¸¦ µé¾î ³ªÀÇ ½Ã½ºÅÛÁß
ÀÇ Çϳª¿¡ »ç¿ëµÈ /usr/lib/libc.soÀÇ ¸ñ·ÏÀÌ ¾Æ·¡¿¡ ³ª¿ÍÀÖ´Ù.
/* °øÀ¯ ¶óÀ̺귯¸®¸¦ ¸ÕÀú »ç¿ëÇÏ¸ç ´Ü ¾î¶² ÇÔ¼öµéÀº Á¤Àû ¶óÀ̺귯¸®À̹Ç
·Î ±×°ÍÀ» ´ÙÀ½Â÷·Ê·Î »ç¿ëÇÏ´Â GNU ld scriptÀÓ. */
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )
´õ ¸¹Àº ³»¿ëÀº ld ¸µÄ¿¿¡ °üÇÑ texinfo ¹®¼¸¦ º¸¶ó. ÀϹÝÀûÀÎ Á¤º¸´Â
info:ld#Options, info:ld#Commands, ±×¸®°í ºñ½ÁÇÑ info:ld#Option Commands
µî¿¡¼ ã¾Æº¸¶ó
GNU Libtool
´Ù¾çÇÑ ½Ã½ºÅÛ¿¡ À̽İ¡´ÉÇÑ ÀÀ¿ëÇÁ·Î±×·¥À» Á¦ÀÛÁßÀ̶ó¸é GNU LibtoolÀ»
»ç¿ëÇÏ¿© ¶óÀ̺귯¸®¸¦ ¸¸µé°í ¼³Ä¡ÇÒ °ÍÀ» °í·ÁÇØ º¸¶ó. GNU LibtoolÀº Àü
ÇüÀûÀÎ ¶óÀ̺귯¸® Áö¿ø ½ºÅ©¸³Æ®ÀÌ´Ù. LibtoolÀº ¶óÀ̺귯¸® »ç¿ëÀÇ º¹À⼺
À» ÀÏ°üµÇ°í À̽İ¡´ÉÇÑ ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ Á¦°ÅÇØÁÙ °ÍÀÌ´Ù. LibtoolÀº ¿À
ºêÁ§Æ® ÆÄÀÏÀÇ »ý¼º, Á¤Àû ¹× °øÀ¯¶óÀ̺귯¸®ÀÇ ¸µÅ©, ½ÇÇà ¹ÙÀ̳ʸ®ÀÇ ¸µÅ©
¹× µð¹ö±×, ¶óÀ̺귯¸®ÀÇ ¼³Ä¡, ½ÇÇà ¹ÙÀ̳ʸ®ÀÇ ¼³Ä¡¸¦ À§ÇÑ À̽ÄÀû ÀÎÅÍÆäÀÌ
½º¸¦ Á¦°øÇÑ´Ù. ±×¾È¿¡´Â libltdlÀ̶ó´Â µ¿ÀûÀûÀç ÇÁ·Î±×·¥À» À§ÇÑ À̽ļº
wrapper°¡ ¶ÇÇÑ Æ÷ÇԵȴÙ. ´õ ¸¹Àº Á¤º¸´Â [19]
www.gnu.org/software/libtool/manual.html
¿¡¼ ã¾Æº¸±æ ¹Ù¶õ´Ù.
¾Æ·¡ ºÎÅÍ´Â (Á¤Àû, °øÀ¯ ¹× µ¿Àû ¶óÀ̺귯¸®ÀÇ)¼¼°¡Áö ÇüÅÂÀÇ ¸ðµç
¶óÀ̺귯¸®ÀÇ ¿¹ÀÌ´Ù. libhello.c´Â libhello.h¸¦ Çì´õ·Î ÇÏ´Â º¸ÅëÀÇ ¶óÀ̺귯¸®À̸ç,
demo_use.c´Â libhello.c¸¦ È£ÃâÇÏ´Â Æò¹üÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. ±× ´ÙÀ½¿¡´Â ÀÌ°ÍÀÌ
¾î¶»°Ô Á¤Àû ¹× °øÀ¯¶óÀ̺귯¸®·Î »ç¿ëµÇ´Â°¡ÀÇ ¿¹¸¦ º¸¿©ÁÖ´Â ½ºÅ©¸³Æ®
(script_static, script_shared)°¡ ÁÖ¼®°ú ÇÔ²² ÀÖÀ¸¸ç, ±× ´ÙÀ½¿¡´Â °øÀ¯
¶óÀ̺귯¸®°¡ ¾î¶»°Ô µ¿Àû ¶óÀ̺귯¸®·Î »ç¿ëµÇ´ÂÁö¸¦ º¸¿©ÁÖ´Â demo_
dyanmic.c¿Í script_dynamicÀÌ ÀÖ´Ù.
File libhello.c
/* libhello.c - ¶óÀ̺귯¸®·Î »ç¿ëµÇ´Â ÆÄÀÏ */
#include <stdio.h>
void hello(void)
printf("Hello, library world.");
File libhello.h
/* libhello.h - Çì´õ ÆÄÀÏ */
void hello(void);
File demo_use.c
/* demo_use.c -- ¹Ù·Î hello·çƾÀ» »ç¿ëÇÏ´Â ¿¹ */
#include "libhello.h"
int main(void) {
hello();
return 0;
}
File script_static
#!/bin/sh
# Á¤Àû ¶óÀ̺귯¸® µ¥¸ð
# Á¤Àû ¶óÀ̺귯¸®ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏÀÎ libhello-static.o»ý¼º.
# libhello-staticÀ̶ó´Â À̸§À» »ç¿ëÇÏ´Â °ÍÀº Á¤Àû ¶óÀ̺귯¸®
# ¿Í µ¿Àû ¶óÀ̺귯¸® »ç¿ëÀ» ¾ö¿¬È÷ ±¸º°Çϱâ À§ÇÑ°ÍÀÏ »ÓÀ̹Ç
# ·Î -staticÀ̶ó´Â À̸§À» ¿ÀºêÁ§Æ® ÆÄÀÏÀ̳ª Á¤Àû ¶óÀ̺귯¸®¿¡
# ¾µ ÇÊ¿ä´Â ¾ø´Ù.
gcc -Wall -g -c -o libhello-static.o libhello.c
# Á¤Àû ¶óÀ̺귯¸®ÀÇ »ý¼º.
ar rcs libhello-static.a libhello-static.o
# ¿©±â¼ libhello-static.a¸¦ ³ªÁß¿¡ »ç¿ëÇϱâ
# À§ÇØ ¾îµò°¡¿¡ º¹»çÇØ ³õÀ»¼ö ÀÖÀ» °ÍÀÌ´Ù.
# µ¥¸ð ¸ñÀûÀ¸·Î »ç¿ëÇϱâ À§Çؼ ¿ì¸®´Â
# ÇöÀçÀÇ µð·ºÅ丮¿¡ ¶óÀ̺귯¸®¸¦ µÎ±â·Î ÇÑ´Ù.
# demo_use ÇÁ·Î±×·¥ÀÇ ÄÄÆÄÀÏ
gcc -Wall -g -c demo_use.c -o demo_use.o
# demo_use ÇÁ·Î±×·¥ÀÇ »ý¼º; -L. ¿É¼ÇÀº "." °¡ ÇÁ·Î±×·¥
# ÀÇ »ý¼º½Ã¿¡ °Ë»öµÇ°Ô ÇÑ´Ù. ÀÌ ¸í·ÉÀ¸·Î libhello-static.a¿¡
# ÀÖ´Â °ü·ÃµÈ ¿ÀºêÁ§Æ®°¡ ÆÄÀÏ demo_use_static¿¡ »ðÀԵȴÙ.
gcc -g -o demo_use_static demo_use.o -L. -lhello-static
# ÇÁ·Î±×·¥ÀÇ ½ÇÇà
./demo_use_static
File script_shared
#!/bin/sh
# °øÀ¯ ¶óÀ̺귯¸®ÀÇ µ¥¸ð
# °øÀ¯ ¶óÀ̺귯¸®ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏ libhello.oÀÇ »ý¼º.
gcc -fPIC -Wall -g -c libhello.c
# °øÀ¯ ¶óÀ̺귯¸®ÀÇ »ý¼º.
# -lc¸¦ »ç¿ëÇÏ¿© C ¶óÀ̺귯¸®¿Í ¸µÅ©ÇÑ´Ù. ¿Ö³ÄÇϸé
# libhello°¡ C ¶óÀ̺귯¸®¿¡ ÀÇÁ¸µÇ±â ¶§¹®ÀÌ´Ù.
gcc -g -shared -Wl,-soname,libhello.so.0 \
-o libhello.so.0.0 libhello.o -lc
# ¿©±â¼ libhello.so.0.0¸¦ ¾î¶² µð·ºÅ丮 À̸¦Å׸é
# /usr/local/lib¿¡ º¹»çÇÏ¿©µµ µÈ´Ù.
# ÀÌÁ¦ ldconfig¸¦ ÀÌ¿ë ½Éº¼¸¯ ¸µÅ©¸¦ ¸¸µç´Ù.
# sonameÀ» ¼Â¾÷ÇÔ. ¾Æ·¡¿Í °°ÀÌ Çصµ ¹«¹æÇÏ´Ù.
# ln -sf libhello.so.0.0 libhello.so.0
# ¿©±â¼´Â ±×³É ldconfig·Î Çϵµ·Ï ÇÑ´Ù.
/sbin/ldconfig -n .
# linker nameÀ» ¼ÂÆÃÇÑ´Ù.
# Á»´õ ¸é¹ÐÇÏ°Ô ÇÏ·Á¸é ÀÌ¹Ì Á¸ÀçÇÏ´Â linker nameÀÌ
# ÀÖ´ÂÁö È®ÀÎÇغ¸°í ¸¸¾à ±×·¸´Ù¸é ±×³É ³öµÖ¾ß ÇÒÁö
# ¾Æ´ÑÁö¸¦ Àß Ã¼Å©ÇؾßÇÑ´Ù.
ln -sf libhello.so.0 libhello.so
# demo_use ÇÁ·Î±×·¥ ÆÄÀÏÀ» ÄÄÆÄÀÏÇÑ´Ù.
gcc -Wall -g -c demo_use.c -o demo_use.o
# demo_use ÇÁ·Î±×·¥ÀÇ »ý¼º.
# -L. Àº "." ÀÌ ÇÁ·Î±×·¥ÀÇ »ý¼º½Ã¿¡ °Ë»öµÇµµ·Ï
# ÇÑ´Ù. "." °¡ ÇÁ·Î±×·¥ ½ÇÇà½Ã¿¡ °Ë»öµÇ´Â °ÍÀÌ
# ¾Æ´Ô¿¡ À¯ÀÇÇ϶ó.
gcc -g -o demo_use demo_use.o -L. -lhello
# ÇÁ·Î±×·¥ ½ÇÇà. LD_LIBRARY_PATH¸¦ »ç¿ë
# ÇÏ¿© °øÀ¯ ¶óÀ̺귯¸®°¡ ¾îµð¿¡ Àִ°¡¸¦
# ÇÁ·Î±×·¥¿¡ ¾Ë·Á ÁÖ¾î¾ßÇÑ´Ù.
LD_LIBRARY_PATH="." ./demo_use
File demo_dynamic.c
/* demo_dynamic.c -- "hello" routineÀÇ
µ¿ÀûÀûÀç¿Í »ç¿ëÀÇ ¿¹ */
/* dlfcn.h ÆÄÀÏÀÌ µ¿ÀûÀûÀç ¶óÀ̺귯¸® ·çƾ¿¡ ÇÊ¿äÇÔ */
#include <dlfcn.h>
#include <stdio.h>
/* "libhello.h"¸¦ includeÇÒ ÇÊ¿ä°¡ ¾øÀ½¿¡ À¯ÀÇÇ϶ó.
±×·¸Áö¸¸ ±×¿Í °ü·ÃÇÏ¿© ¾î¶² °ÍÀº ¹Ýµå½Ã ¸í½ÃÇؾßÇÑ´Ù;
Áï, dlsym()À¸·Î ¾òÀº °ªÀ» °¡Áö°í ÀÖÀ» µ¥ÀÌÅÍÀÇ Å¸ÀÙ
Àº ºÐ¸íÈ÷ Á¤ÇØÁ®¾ß ÇÑ´Ù. */
/* "simple_demo_function" ŸÀÙÀº ¸Å°³º¯¼ö¿Í ¸®ÅÏ°ªÀÌ ¾ø´Â
ÇÔ¼öÀÇ Å¸ÀÙÀ» ¸»ÇÑ´Ù. */
typedef void (*simple_demo_function)(void);
int main(void)
const char *error;
void *module;
simple_demo_function demo_function;
/* µ¿Àû ¶óÀ̺귯¸®¸¦ ÀûÀçÇÔ */
module = dlopen("libhello.so", RTLD_LAZY);
if (!module)
fprintf(stderr, "Couldn't open libhello.so: %s",
dlerror());
exit(1);
/* ½Éº¼À» °¡Á®¿È */
dlerror();
demo_function = dlsym(module, "hello");
if ((error = dlerror()))
fprintf(stderr, "Couldn't find hello: %s", error);
exit(1);
/* DL ¶óÀ̺귯¸®ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. */
(*demo_function)();
/* ¸ðµç °ÍÀ» ¸¶Ä£ µÚ È®½ÇÈ÷ Ŭ·Î¡ÇÑ´Ù. */
dlclose(module);
return 0;
File script_dynamic
#!/bin/sh
# µ¿Àû ¶óÀ̺귯¸® µ¥¸ð
# libhello.so¿Í friends°¡ À̹Ì
# »ý¼ºµÇ¾úÀ½À» °¡Á¤ÇÑ´Ù. ( dynamicÀÇ ¿¹¸¦ º¸¶ó).
# demo_dynamic ÇÁ·Î±×·¥À» ¿ÀºêÁ§Æ® ÆÄÀÏ·Î ÄÄÆÄÀÏ.
gcc -Wall -g -c demo_dynamic.c
# demo_use ÇÁ·Î±×·¥ÀÇ »ý¼º.
# ÀÌ ÇÁ·Î±×·¥ÀÌ »ç¿ëÇϴ ƯÁ¤ÀÇ ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÌ
# ½ÃÀÛµÇ°í ³µÚ°¡ µÇ±â Àü±îÁö´Â ÀûÀçµÇÁö ¾Ê±â ¶§¹®¿¡ µ¿Àû
# ¶óÀ̺귯¸®¸¦ ã±âÀ§ÇØ ¾îµð¸¦ °Ë»öÇØ¾ß ÇÏ´ÂÁö ¾Ë¸± ÇÊ¿ä°¡
# ¾øÀ½¿¡ À¯ÀÇÇ϶ó.
# ±×·¸Áö¸¸ µ¿Àû ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ´Â ¶óÀ̺귯¸®¸¦
# Æ÷ÇÔÇϱâ À§Çؼ -ldl¿É¼ÇÀº ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù.
gcc -g -o demo_dynamic demo_dynamic.o -ldl
# ÇÁ·Î±×·¥ÀÇ ½ÇÇà. LD_LIBRARY_PATH ¸¦ ÀÌ¿ëÇÏ¿©
# ÇÁ·Î±×·¥ÀÌ ¾îµð¼ µ¿Àû ¶óÀ̺귯¸®¸¦ ¾òÀ»¼ö
# ÀÖ´ÂÁö ¾Ë·Á ÁÖ¾î¾ß ÇÑ´Ù.
.
LD_LIBRARY_PATH="." ./demo_dynamic
¶óÀ̺귯¸®¿¡ °üÇÑ Æ¯È÷ À¯¿ëÇÑ ¼Ò½º¿Í Á¤º¸°¡ ´ÙÀ½ÀÇ ¹®¼¿¡ ÀÖ´Ù;
- ``The GCC HOWTO'' -Daniel BarlowÀú. ƯÈ÷ ÀÌ HOWTO ¹®¼´Â
¶óÀ̺귯¸®ÀÇ »ý¼º¿¡ ÇÊ¿äÇÑ ÄÄÆÄÀÏ·¯ ¿É¼Ç°ú ¶óÀ̺귯¸®¿¡ ¾î¶»°Ô ÁúÀÇÇϴ°¡¿¡
°üÇؼ Àß³íÀÇ µÇ°í ÀÖ´Ù. ÀÌ ¹®¼´Â ¿©±â¼ ´Ù·çÁö ¸øÇÑ ³»¿ëÀ» ´Ù·ç¾îÁÙ °Í
ÀÌ¸ç ¿ªÀ¸·Î ±× ¹®¼°¡ ´Ù·çÁö ¸øÇÑ ³»¿ëÀÌ ¿ª½Ã ¿©±â¿¡¼ ¼Ò°³µÇ°í ÀÖ´Â °Í
ÀÌ´Ù. ÀÌ HOWTO ¹®¼´Â Linux Documentation ProjectÀÇ 20]
www.linuxdoc.org ¿¡¼ ã¾Æº¼ ¼ö ÀÖ´Ù.
- Tool Interface Standards (TIS) committee(ÀÌ´Â µ¿ÀÏÇÑ À§¿øȸ¿¡ ÀÇÇÑ
Portable Formats Specification Version 1.1ÀÇ ÇÑ Chapter(Àå)ÀÌ´Ù.)¿¡ ÀÇÇÑ
``Executable and Linkable Format (ELF)''. ÀÌ°ÍÀº ELF Æ÷¸Ë¿¡ °üÇÑ (GNU
³ª ¸®´ª½º¿¡¸¸ ÇÑÁ¤µÇÁö ¾ÊÀº)ÀÚ¼¼ÇÑ Á¤º¸µéÀ» Á¦°øÇÑ´Ù. [21]
tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz À» º¸¸é µÈ´Ù. ÆÄÀÏÀ» MIT¿¡
¼ ´Ù¿î¹ÞÀ¸¸é ºñÁ¤»óÀûÀÎ Æ÷¸ËÀÏ °ÍÀÌ´Ù. gunzip, tar·Î ǬµÚ¿¡ ``hps''¶ó´Â
ÆÄÀÏÀ» ¾ò°Ô µÉ°ÍÀε¥ ù°ÁÙ°ú ¸Ç¸¶Áö¸·ÁÙÀ» ¾ø¾Ö°í ³ª¸é ÀμⰡ´ÉÇÑ Æ÷½ºÆ®
½ºÅ©¸³Æ® ÆÄÀÏÀ» ¾òÀ»¼ö ÀÖÀ»°ÍÀÌ´Ù.
- ``ELF: From the Programmer's Perspective'' - Hongjui LuÁöÀ½. ÀÌ ¹®¼
´Â ¸®´ª½º¿Í GNU gcc-specificÀÇ ELF¿¡ °üÇÑ Á¤º¸¸¦ Á¦°øÇÏ¸ç ¾òÀ»¼ö ÀÖ´Â
°÷Àº [22]
tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gzÀÌ´Ù.
ÀúÀÛ±ÇÀº(C) David A. Wheeler¿¡°Ô ÀÖÀ¸¸ç GNU General Public License
(GPL)¸¦ Æ÷ÇÔÇÑ´Ù. ¾Æ¹«·± ´ë°¡¾øÀÌ Àç¹èÆ÷ ÇÒ¼ö ÀÖÀ¸¸ç ´ÙÀ½°ú °°Àº Ç׿¡ ÀÇ
°ÅÇÏ¿© Æ÷ÇÔµÈ ÅؽºÆ®¿Í ÇÁ·Î±×·¥À» ¹ø¿ª ¹× ÀÌ¿ëÇÒ¼ö ÀÖ´Ù.
ÀÌ ÇÁ·Î±×·¥Àº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îÀÌ´Ù; Free Software Foundation¿¡ ÀÇÇؼ Ãâ
ÆǵǴ GNU General Public License¿¡ ÀÇ°ÅÇÏ¿© Àç¹èÆ÷ ¶Ç´Â º¯°æÇÒ¼ö ÀÖ´Ù.
¹öÀü 2¶Ç´Â ±×ÀÌ»óµµ ¸¶Âù°¡ÁöÀÌ´Ù.
ÀÌ ¹®¼´Â ±×°ÍÀÌ À¯¿ëÇÏ±æ ¹Ù¶ó¸ç ¹èÆ÷µÇ´Â °ÍÀÌÁö¸¸ ¾î¶°ÇÑ º¸ÁõÀº ¾ø´Ù´Â
°Í¿¡ À¯ÀÇÇ϶ó. ƯÁ¤¸ñÀûÀ̳ª »ó¾÷ÀûÀÎ »ç¿ëÀ» À§ÇÑ ¾î¶² ¾Ï½ÃÀûÀÎ º¸Áõµµ ¾ø
´Ù´Â °Í¿¡ À¯ÀÇÇÏ±æ ¹Ù¶ó¸ç ÀÌ¿¡ °üÇؼ´Â GNU General Public License¿¡¼
´õ ÀÚ¼¼È÷ º¸±æ ¹Ù¶õ´Ù.
GNU General Public License¿Í ÀÌ ÇÁ·Î±×·¥À» ÀÌ¹Ì °¡Áö°í ÀÖÀ»ÅÙµ¥ ¸¸¾à
±×·¸Áö ¸øÇÏ´Ù¸é Free Software Foundation, Inc., 59 Temple Place, Suite
330, Boston, MA 02111-1307 USA¿¡ ÆíÁöÇ϶ó.
À§ ³»¿ëµéÀº ´Ù¸¥ À¥»çÀÌÆ®¿¡¼ ¹Ì·¯¸µ ÇÒ¼ö ÀÖÀ¸¸ç ´Ù¸¸,
- ¹Ì·¯ »çÀÌÆ®´Â ÁÖ »çÀÌÆ®°¡ °»½ÅµÇ¸é ÀÚµ¿À¸·Î °»½ÅµÉ¼ö ÀÖ¾î¾ß Çϸç,
- ÁÖ »çÀÌÆ®ÀÇ ÁÖ¼Ò( 23]
www.dwheeler.com/program-library)¸¦ ºÐ¸í
È÷ ¸í½ÃÇØ¾ß Çϸç ÀÌ¿¡ ÇÏÀÌÆÛ ÅؽºÆ® ¸µÅ© µÇ¾î¾ß Çϸç,
- ³»°Ô(David A. Wheeler) ÀúÀÚ·Î½á °¡Á®¾ßÇÒ Á¢±Ù±ÇÀ» ÁÖ¾î¾ß ÇÑ´Ù.
»óÀ§ÀÇ µÎ Ç׸ñÀº ³»°¡ ¾µ¸ð¾ø´Â ¹ö±×¸®Æ÷Æ®¸¦ °è¼ÓÇؼ ¹ÞÁö ¾Ê°Ô ÇØÁØ´Ù.
³ª´Â ´ç½ÅÀÇ À߸øµÈ ¹Ì·¯¸µÀ¸·Î ÀÎÇØ 1³âÀü¿¡ °íÄ£ ¹ö±×ÀÇ º¸°í¸¦ ¹ÞÁö¾Ê±æ
¿øÇÑ´Ù. ÁÖ »çÀÌÆ®·Î ¸µÅ©ÇÔÀ¸·Î½á »ç¿ëÀÚ´Â ¹Ì·¯³»¿ëÀÌ ÃÖ½ÅÀÇ °ÍÀÎÁö ¾Ë ¼ö
ÀÖ´Ù. ³ª´Â ¸Å¿ì °ÇÑ º¸¾ÈÀ» ÇÊ¿ä·Î Çؼ ÀϹÝÀûÀÎ ÀÎÅͳݿ¬°á Á¶Â÷ À§ÇèºÎ´ã
ÇÏÁö ¾Ê´Â »çÀÌÆ®µé¿¡¼ ¹ß»ýµÇ´Â ¹®Á¦µé¿¡ ¸Å¿ì ¹Î°¨ÇÏ´Ù. ¸¸¾à ´ç½ÅÀÌ ÀÌ·±
Á¶°ÇÀ̶ó¸é Àû¾îµµ ´Ù¸¥ Æ÷ÀÎÆ®¸¦ ã¾Æ¼ ÀÚÁÖ ½º´ÏÄ¿³Ý ¾÷µ¥ÀÌÆ®(sneaknet
update)Ç϶ó.
ÀÌ ¶óÀ̼¾½º¿¡ ÀÇÇؼ ´ç½ÅÀº ¹®¼¸¦ º¯°æÇÒ¼ö ÀÖÁö¸¸ ´ç½ÅÀÌ ¾²Áö ¾ÊÀº ³»
¿ëÀ» ´ç½Å°ÍÀ̶ó´ø°¡ º¯°æµÈ ³»¿ëÀÌ ¿ø¹®°ú °°´Ù°í ¸»ÇÒ ¼ö´Â ¾ø´Ù. ¹®¼¿¡ ´ë
ÇÑ º¯°æÀÌ Àüü ¹®¼¿¡ ´ëÇÑ ÀúÀÛ±ÇÀ» ÁÖ´Â °ÍÀÌ ¾Æ´Ï´Ù. ÀÌÀÏÀº ÀúÀÛ¹ý¿¡¼
¸»ÇÏ´Â, ÀúÀÛ±Ç ¼Ò½Ç·Î ÀÎÇÏ¿© ÀÚÀ¯·ÎÀÌ »ç¿ëÇÒ¼ö ÀÖ´Â ±×·± ¼º°ÝÀÇ ÀÛ¾÷ÀÌ ¾Æ
´Ï´Ù. ¹®¼°¡ º¯°æµÇ¾úÀ» ¶§ ±× ³»¿ë°ú ³¯Â¥¸¦ ºÐ¸íÈ÷ ¾Ë·Á¾ß ÇÑ´Ù´Â ÀÚ¼¼ÇÑ
ÀúÀ۱ǹýÀÇ ±ÔÄ¢À» »ìÆ캸±æ ¹Ù¶õ´Ù. º¸ÅëÀÇ °æ¿ì º¯°æµÈ ³»¿ëÀ» ¹®¼ÀÇ ÅëÇÕ
±ÇÀÚ(David A. Wheeler)¿¡°Ô ¾Ë·Á ÅëÇÕ½ÃÅ°´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù.
-
file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO.
html#AEN12
-
file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO.
html#AEN25
-
file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO.
html#AEN33
-
file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO.
html#AEN126
-
file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO.
html#AEN168
-
file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO.
html#AEN189
-
file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO.
html#AEN220
-
file://localhost/export/sunsite/users/gferg/howto/00Program-Library-HOWTO.
html#AEN233
-
http://www.gnu.org/software/libtool/libtool.html
-
developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.ht ml
-
www.dwheeler.com/program-library
-
www.linuxdoc.org/
- info:standards#Directory_Variables
-
www.pathname.com/fhs
-
http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.ht ml
-
www.gnu.org/software/libtool/libtool.html
- info:binutils#nm
-
www.gnu.org/software/libtool/libtool.html
-
www.gnu.org/software/libtool/manual.html
-
www.linuxdoc.org/
-
tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz
-
tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz
-
www.dwheeler.com/program-library