¾ÆÆÄÄ¡ À¥¼¹ö´Â °ü¸®ÀÚ°¡ ¸ðµâµéÀ» ¼±ÅÃÇÏ¿© ¼¹ö¿¡ Æ÷ÇÔÇÒ
±â´ÉÀ» °áÁ¤ÇÒ ¼ö ÀÖ´Â ¸ðµâÈµÈ ÇÁ·Î±×·¥ÀÌ´Ù. ¸ðµâÀº ¼¹ö°¡ ÄÄÆÄÀϵɶ§
httpd
½ÇÇàÆÄÀÏ¿¡ Á¤ÀûÀ¸·Î ÄÄÆÄÀ쵃 ¼ö ÀÖ´Ù.
¾Æ´Ï¸é ¸ðµâÀº Áß½ÉÀÌ µÇ´Â httpd
½ÇÇàÆÄÀÏ°ú º°µµ·Î
µ¿Àû°øÀ¯°´Ã¼(Dynamic Shared Objects, DSOs)·Î ÄÄÆÄÀ쵃 ¼ö ÀÖ´Ù.
DSO ¸ðµâÀº ¼¹ö°¡ ÄÄÆÄÀϵɶ§ ÄÄÆÄÀÏÇϰųª Apache Extension
Tool (apxs)À» »ç¿ëÇÏ¿© ³ªÁß¿¡
ÄÄÆÄÀÏÇÏ°í Ãß°¡ÇÒ ¼ö ÀÖ´Ù.
ÀÌ ¹®¼´Â DSO ¸ðµâ »ç¿ë¹ý°ú °ü·ÃµÈ ÀÌ·ÐÀ» ¼³¸íÇÑ´Ù.
°ü·ÃµÈ ¸ðµâ mod_so |
°ü·ÃµÈ Áö½Ã¾î LoadModule |
¾ÆÆÄÄ¡ ¸ðµâÀ» ÀоîµéÀ̱âÀ§ÇÑ DSO Áö¿øÀº ¾ÆÆÄÄ¡ Çٽɿ¡
Á¤ÀûÀ¸·Î ÄÄÆÄÀϵǾßÇÒ
mod_so.c
¶ó´Â
¸ðµâÀÌ Á¦°øÇÑ´Ù. ÀÌ´Â core.c
¸¦ Á¦¿ÜÇÏ°í
DSO°¡ µÉ ¼ö ¾ø´Â À¯ÀÏÇÑ ¸ðµâÀÌ´Ù. ½ÇÁ¦·Î ´Ù¸¥ ¸ðµç ¾ÆÆÄÄ¡ ¸ðµâÀº
°¢°¢ ¼³Ä¡ ¹®¼¿¡¼ ¼³¸íÇÑ
configure
ÀÇ --enable-module=shared
¿É¼ÇÀ» »ç¿ëÇÏ¿© DSO·Î ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù. ¸ðµâÀÌ
mod_foo.so
¿Í °°ÀÌ DSO·Î ÄÄÆÄÀϵÈÈÄ httpd.conf
ÆÄÀÏ¿¡ mod_so
ÀÇ
LoadModule
¸í·É¾î¸¦ »ç¿ëÇÏ¿© ¼¹ö ½ÃÀ۽à ȤÀº Àç½ÃÀ۽à ±× ¸ðµâÀ» ÀоîµéÀÏ
¼ö ÀÖ´Ù.
¾ÆÆÄÄ¡ ¸ðµâ(ƯÈ÷ Á¦»ïÀÇ ¸ðµâ)·Î »ç¿ëÇÒ DSO ÆÄÀÏÀ» ½±°Ô
¸¸µé±âÀ§ÇØ apxs (APache
eXtenSion)¶ó´Â »õ·Î¿î Áö¿ø ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù.
ÀÌ´Â ¾ÆÆÄÄ¡ ¼Ò½º Æ®¸® ¹Û¿¡¼ DSO·Î »ç¿ëÇÒ ¸ðµâÀ»
ÄÄÆÄÀÏÇÒ¶§ »ç¿ëÇÑ´Ù. °³³äÀº ½±´Ù. ¾ÆÆÄÄ¡¸¦ ¼³Ä¡ÇÒ¶§
configure
¿Í make install
ÀÌ
¾ÆÆÄÄ¡ C Çì´õÆÄÀÏÀ» ¼³Ä¡ÇÏ°í, DSO ÆÄÀÏÀ» ÄÄÆÄÀÏÇϱâÀ§ÇÑ
Ç÷¡Æû ƯÀ¯ÀÇ ÄÄÆÄÀÏ·¯ ¿É¼Ç°ú ¸µÄ¿ ¿É¼ÇÀ» apxs
ÇÁ·Î±×·¥¿¡ ¾´´Ù. ±×·¡¼ »ç¿ëÀÚ´Â apxs
¸¦
»ç¿ëÇÏ¿© ¾ÆÆÄÄ¡ ¹èÆ÷º» ¼Ò½º Æ®¸®¾øÀÌ, ¶Ç DSO Áö¿øÀ» À§ÇÑ Ç÷¡Æû
ƯÀ¯ÀÇ ÄÄÆÄÀÏ·¯ ¿É¼Ç¿Í ¸µÄ¿ ¿É¼Ç¿¡ ½Å°æÀ» ¾²Áö¾Ê°í ÀÚ½ÅÀÇ
¾ÆÆÄÄ¡ ¸ðµâ ¼Ò½º¸¦ ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù.
Apache 2.0ÀÇ DSO ±â´É¿¡ ´ëÇÑ Âª°í °£·«ÇÑ ¿ä¾àÀÌ´Ù:
mod_foo.c
¸¦ DSO mod_foo.so
·Î:
$ ./configure --prefix=/path/to/install --enable-foo=shared $ make install |
mod_foo.c
¸¦ DSO mod_foo.so
·Î:
$ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c --enable-foo=shared $ make install |
$ ./configure --enable-so $ make install |
mod_foo.c
¸¦ apxs¸¦
»ç¿ëÇÏ¿© ¾ÆÆÄÄ¡ ¼Ò½º Æ®¸® ¹Û¿¡¼ DSO
mod_foo.so
·Î:
$ cd /path/to/3rdparty $ apxs -c mod_foo.c $ apxs -i -a -n foo mod_foo.la |
¸ðµç °æ¿ì ÀÏ´Ü °øÀ¯ ¸ðµâÀÌ ÄÄÆÄÀϵǸé, httpd.conf
¿¡
LoadModule
Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ¾ÆÆÄÄ¡°¡ ±× ¸ðµâÀ» È°¼ºÈÇÏ°Ô ÇؾßÇÑ´Ù.
Çö´ëÀûÀÎ À¯´Ð½º·ù¿¡´Â µ¿Àû°øÀ¯°´Ã¼ (DSO)ÀÇ µ¿Àû ¸µÅ·/·ÎµùÀ̶ó°í ÇÏ¿©, Ưº°ÇÑ Çü½ÄÀÇ ½ÇÇàÄÚµå Á¶°¢À» ¸¸µé¾î ½ÇÇàÁß ½ÇÇàÇÁ·Î±×·¥ÀÇ ÁÖ¼Ò°ø°£¿¡ ÀоîµéÀÌ´Â ¸ÚÁø ±â´ÉÀÌ ÀÖ´Ù.
ÀÌ ·ÎµùÀº º¸Åë µÎ°¡Áö ¹æ¹ýÀ¸·Î °¡´ÉÇÏ´Ù. Çϳª´Â ½ÇÇàÇÁ·Î±×·¥ÀÌ
½ÃÀÛÇÒ¶§ ld.so
¶ó´Â ½Ã½ºÅÛ ÇÁ·Î±×·¥ÀÌ ·ÎµùÀ»
ÀÚµ¿À¸·Î ÇÏ´Â °æ¿ì°í, ´Ù¸¥ Çϳª´Â ½ÇÇàÁßÀÎ ÇÁ·Î±×·¥¿¡¼
dlopen()/dlsym()
½Ã½ºÅÛÄÝ·Î À¯´Ð½º ·Î´õÀÇ
½Ã½ºÅÛ ÀÎÅÍÆäÀ̽ºÀ» »ç¿ëÇÏ¿© Á÷Á¢ ·ÎµùÇÏ´Â °æ¿ì´Ù.
ù¹ø° °æ¿ì DSO´Â º¸Åë °øÀ¯¶óÀ̺귯¸®(shared libraries) ȤÀº
DSO ¶óÀ̺귯¸®¶ó°í ºÎ¸£¸ç, ÆÄÀÏÀº libfoo.so
³ª
libfoo.so.1.2
°°Àº À̸§À» °¡Áø´Ù. À̵éÀº
½Ã½ºÅÛ µð·ºÅ丮(º¸Åë /usr/lib
)¿¡ ÀÖ°í,
ÄÄÆÄÀϽà ¸µÄ¿ ¸í·É¾î¿¡ -lfoo
¸¦ ÁÖ¾î ½ÇÇàÆÄÀÏ°ú
¿¬°áµÈ´Ù. ÀÌ·¸°Ô Á÷Á¢ ½áÁØ ¶óÀ̺귯¸®´Â ½ÇÇàÆÄÀÏ¿¡ ÂüÁ¶µÇ¿©¼,
¸µÄ¿ ¿É¼Ç -R
·Î Á÷Á¢ ÁöÁ¤ÇÏ¿´°Å³ª ȯ°æº¯¼ö
LD_LIBRARY_PATH
·Î ÁöÁ¤ÇÑ °æ·ÎÀÎ /usr/lib
¿¡¼
À¯´Ð½º ·Î´õ°¡ ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ¶§ libfoo.so
¸¦
ãÀ»(resolve) ¼ö ÀÖ´Ù. ±×·¯¸é ½ÇÇàÇÁ·Î±×·¥ÀÇ (¾ÆÁ÷ ¸øãÀº)
½Éº¼(symbol)À» DSO¿¡¼ ã°ÔµÈ´Ù.
DSO´Â º¸Åë ½ÇÇàÇÁ·Î±×·¥ÀÇ ½Éº¼À» ãÁö¾Ê±â ¶§¹®¿¡ (DSO°¡
Àç»ç¿ë°¡´ÉÇÑ ÀϹÝÀûÀÎ ÄÚµåÀÇ ¶óÀ̺귯¸®À̹ǷÎ) ã±â´Â ¿©±â¼ ³¡³´Ù.
À¯´Ð½º ·Î´õ°¡ ½Éº¼ ã±â¸¦ ¿ÏÀüÈ÷ ´ã´çÇϹǷΠ½ÇÇàÇÁ·Î±×·¥ÀÌ Á÷Á¢
DSO¿¡¼ ½Éº¼À» ãÀ» ÇÊ¿ä°¡ ¾ø´Ù. (»ç½Ç ld.so
¸¦
ºÎ¸£´Â ÄÚµå´Â Á¤ÀûÀÌ ¾Æ´Ñ ¸ðµç ½ÇÇàÇÁ·Î±×·¥¿¡ ¸µÅ©µÇ´Â ½ÇÇà½Ã
½ÃÀÛÄÚµåÀÇ ÀϺδÙ.) °øÅëµÈ ¶óÀ̺귯¸® Äڵ带 µ¿ÀûÀ¸·Î ÀоîµéÀÌ´Â
ÀåÁ¡Àº ¸íÈ®ÇÏ´Ù. ¶óÀ̺귯¸® Äڵ尡 ¸ðµç ÇÁ·Î±×·¥¿¡ ÀúÀåµÇ´Â ´ë½Å
libc.so
¿Í °°Àº ½Ã½ºÅÛ ¶óÀ̺귯¸®¿¡ Çѹø¸¸ ÀúÀåµÇ±â
¶§¹®¿¡ µð½ºÅ© °ø°£ÀÌ Àý¾àµÈ´Ù.
µÎ¹ø° °æ¿ì DSO´Â º¸Åë °øÀ¯°´Ã¼(shared objects) ȤÀº
DSO ÆÄÀÏÀ̶ó°í ºÎ¸£°í, (±ÔÄ¢»ó À̸§Àº foo.so
ÀÌÁö¸¸)
ÆÄÀÏÀÇ È®ÀåÀÚ´Â ÀÚÀ¯·Ó´Ù. ÀÌ ÆÄÀϵéÀº º¸Åë ÇÁ·Î±×·¥ ÀÚü µð·ºÅ丮¿¡
À§Ä¡ÇÏ°í ½ÇÇàÇÁ·Î±×·¥¿¡ ÀÚµ¿À¸·Î ¿¬°áµÇÁö ¾Ê´Â´Ù. ´ë½Å ½ÇÇàÇÁ·Î±×·¥Àº
dlopen()
À» »ç¿ëÇÏ¿© DSO¸¦ ½ÇÇà½Ã ÁÖ¼Ò°ø°£¿¡ Á÷Á¢
Àоîµé¿©¾ß ÇÑ´Ù. À̶§ ½ÇÇàÇÁ·Î±×·¥Àº DSO¿¡¼ ½Éº¼À» ãÁö ¾Ê´Â´Ù.
´ë½Å À¯´Ð½º ·Î´õ°¡ ÀÚµ¿À¸·Î ½ÇÇàÆÄÀÏ°ú ½ÇÇàÆÄÀÏÀÌ ÀÌ¹Ì ÀоîµéÀÎ DSO
¶óÀ̺귯¸®(ƯÈ÷ Ç×»óÀÖ´Â libc.so
ÀÇ ¸ðµç ½Éº¼)¿¡¼
DSOÀÇ (¾ÆÁ÷ ¸øãÀº) ½Éº¼À» ã´Â´Ù. ±×·¡¼ DSO´Â ¸¶Ä¡ óÀ½ºÎÅÍ
½ÇÇàÇÁ·Î±×·¥¿¡ Á¤ÀûÀ¸·Î ¸µÅ©µÈ°Í°ú °°ÀÌ ½ÇÇàÆÄÀÏÀÇ ½Éº¼À»
¾Ë°ÔµÈ´Ù.
DSOÀÇ API¸¦ ÀÌ¿ëÇϱâÀ§Çؼ ¸¶Áö¸·À¸·Î ½ÇÇàÇÁ·Î±×·¥Àº
dlsym()
·Î DSO¿¡¼ ƯÁ¤ ½Éº¼À» ã¾Æ¼,
¾ÕÀ¸·Î »ç¿ëÇϱâÀ§ÇØ µð½ºÆÐÄ¡(dispatch) Ç¥ µî¿¡
ÀúÀåÇÑ´Ù. ´Ù¸¥ ¸»·Î ½ÇÇàÇÁ·Î±×·¥Àº »ç¿ëÇÒ ¸ðµç ½Çº¼À» Á÷Á¢
ã¾Æ¾ßÇÑ´Ù. ÀÌ·± ±¸Á¶ÀÇ ÀåÁ¡Àº ÇÁ·Î±×·¥ÀÇ ¼±ÅÃÀûÀÎ ÀϺÎÀ»
ÇÁ·Î±×·¥ÀÌ ÇÊ¿äÇÒ¶§±îÁö ÀоîµéÀÌÁö ¾Ê¾Æµµ (±×·¡¼
¸Þ¸ð¸®¸¦ ³¶ºñÇÏÁö ¾Ê°Ô) µÈ´Ù´Â Á¡ÀÌ´Ù. ±âº» ÇÁ·Î±×·¥ÀÇ ±â´ÉÀ»
È®ÀåÇϱâÀ§ÇØ ÇÊ¿äÇÒ¶§ ÀÌ ºÎºÐÀ» µ¿ÀûÀ¸·Î ÀоîµéÀÏ ¼ö ÀÖ´Ù.
ÀÌ·± DSO ±¸Á¶°¡ ÀÚ¿¬½º·´°Ô º¸ÀÌÁö¸¸, ÃÖ¼ÒÇÑ ¾î·Á¿î Á¡ÀÌ ÇϳªÀÖ´Ù. ÀÌ´Â ÇÁ·Î±×·¥À» È®ÀåÇϱâÀ§ÇØ DSO¸¦ »ç¿ëÇÒ¶§ DSO°¡ ½ÇÇàÇÁ·Î±×·¥ÀÇ ½Éº¼À» ã´Â ÀÏÀÌ´Ù. ¿Ö? DSO°¡ ½ÇÇàÇÁ·Î±×·¥ÀÇ ½Éº¼À» "¿ªÀ¸·Î ã´Â °Í"Àº (¶óÀ̺귯¸®´Â »ç¿ëµÇ´Â ÇÁ·Î±×·¥¿¡ ´ëÇØ ¸ð¸¥´Ù´Â) ¶óÀ̺귯¸® ¼³°è¿¡ ¹ÝÇϸç, ¸ðµç Ç÷¡Æû¿¡¼ Áö¿øµÇÁö ¾Ê°í Ç¥ÁØȵÇÁöµµ ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. ½ÇÁ¦·Î ½ÇÇàÆÄÀÏÀÇ Àü¿ª½Éº¼(global symbol)Àº ÀÚÁÖ ÀͽºÆ÷Æ®(export)µÇÁö ¾Ê±â¶§¹®¿¡ DSO°¡ »ç¿ëÇÒ ¼ö ¾ø´Ù. DSO¸¦ »ç¿ëÇÏ¿© ½ÇÇàÁß ÇÁ·Î±×·¥À» È®ÀåÇÏ·Á¸é ¸µÄ¿¿¡°Ô ¸ðµç Àü¿ª½Éº¼À» ÀͽºÆ÷Æ®Çϵµ·Ï °Á¦ÇÏ´Â °ÍÀÌ ÁÖ¿äÇÑ ÇØ°áÃ¥ÀÌ´Ù.
°øÀ¯¶óÀ̺귯¸®´Â DSO ±¸Á¶¸¦ À§ÇØ ¼³°èµÇ¾ú±â¶§¹®¿¡ ÀüÇüÀûÀÌ°í, ¿î¿µÃ¼Á¦°¡ Á¦°øÇÏ´Â °ÅÀÇ ¸ðµç Á¾·ùÀÇ ¶óÀ̺귯¸®¿¡ »ç¿ëµÈ´Ù. ¹Ý´ë·Î ¸¹Àº ÇÁ·Î±×·¥Àº ÇÁ·Î±×·¥À» È®ÀåÇϱâÀ§ÇØ °øÀ¯°´Ã¼¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù.
1998³â ½ÇÇàÁß ½ÇÁ¦·Î ±â´ÉÀ» È®ÀåÇϱâÀ§ÇØ DSO ±¸Á¶¸¦ »ç¿ëÇÑ ¼ÒÇÁÆ®¿þ¾î ÆÐÅ°Áö´Â (XS ±¸Á¶¿Í DynaLoader ¸ðµâÀ» »ç¿ëÇÑ) Perl 5, Netscape Server µîÀ¸·Î µå¹°¾ú´Ù. ¾ÆÆÄÄ¡´Â ÀÌ¹Ì ±â´ÉÀ» È®ÀåÇϱâÀ§ÇØ ¸ðµâ °³³äÀ» »ç¿ëÇß°í ¿ÜºÎ ¸ðµâÀ» ¾ÆÆÄÄ¡ Çٽɱâ´É¿¡ ¿¬°áÇϱâÀ§ÇØ ³»ºÎÀûÀ¸·Î µð½ºÆÐÄ¡¸ñ·ÏÀ» ÀÌ¿ëÇÑ Á¢±Ù¹æ¹ýÀ» »ç¿ëÇ߱⶧¹®¿¡ 1.3 ¹öÀüºÎÅÍ ¿©±â¿¡ ÇÕ·ùÇß´Ù. ±×·¡¼ ¾ÆÆÄÄ¡´Â ½ÇÇàÁß ¸ðµâÀ» ÀоîµéÀ̴µ¥ DSO¸¦ »ç¿ëÇϵµ·Ï ¿î¸íÁö¿öÁ³´Ù.
¾Õ¿¡¼ ¸»ÇÑ DSO¸¦ »ç¿ëÇÏ¸é ´ÙÀ½°ú °°Àº ÀåÁ¡ÀÌ ÀÖ´Ù:
configure
¿É¼Ç´ë½Å httpd.conf
ÀÇ LoadModule
·Î
½ÇÇàÁß¿¡ °áÇյǹǷΠ¼¹ö ÆÐÅ°Áö°¡ ½ÇÇà½Ã ´õ À¯¿¬ÇÏ´Ù. ¿¹¸¦ µé¾î
ÇѹøÀÇ ¾ÆÆÄÄ¡ ¼³Ä¡¸¸À¸·Î ´Ù¸¥ ¼¹ö(Ç¥ÁØ ¹öÀü°ú SSL ¹öÀü, ÃÖ¼ÒÈ ¹öÀü°ú
±â´ÉÃß°¡ ¹öÀü [mod_perl, PHP3] µî)¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Ù.apxs
¸¦ °¡Áö°í ¾ÆÆÄÄ¡ ¼Ò½º Æ®¸®
¹Û¿¡¼ ÀÛ¾÷ÇÏ°í apxs -i
¿Í
apachectl restart
¸í·É¾î¸¸À¸·Î ÇöÀç °³¹ßÇÑ
¸ðµâÀÇ »õ ¹öÀüÀ» ½ÇÇàÁßÀÎ ¾ÆÆÄÄ¡ ¼¹ö¿¡ ¹Ý¿µÇÒ ¼ö ÀÖ¾î¼ ´õ ½±°Ô
¾ÆÆÄÄ¡ ¸ðµâÀ» °³¹ßÇÒ ¼ö ÀÖ´Ù.DSO´Â ´ÙÀ½°ú °°Àº ´ÜÁ¡ÀÌ ÀÖ´Ù:
ld -lfoo
)¿¡
¸µÅ©ÇÒ ¼ö ¾ø´Â Ç÷¡ÆûÀÌ Àֱ⶧¹®¿¡ (¿¹¸¦ µé¾î ELF±â¹Ý Ç÷¡ÆûÀº
Áö¿øÇÏÁö¸¸ a.out±â¹Ý Ç÷¡ÆûÀº º¸Åë ÀÌ ±â´ÉÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù)
¸ðµç Á¾·ùÀÇ ¸ðµâ¿¡ DSO¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ´Ù¸¥ ¸»·Î
DSO ÆÄÀÏ·Î ÄÄÆÄÀϵǴ ¸ðµâÀº ¾ÆÆÄÄ¡ Çٽɰú ¾ÆÆÄÄ¡ ÇÙ½ÉÀÌ
»ç¿ëÇÏ´Â C ¶óÀ̺귯¸®(libc
)¿Í ´Ù¸¥ µ¿Àû/Á¤Àû
¶óÀ̺귯¸®, À§Ä¡µ¶¸³Äڵ带 ´ã°í ÀÖ´Â Á¤Àû ¶óÀ̺귯¸®
¾ÆÄ«À̺ê(libfoo.a
)ÀÇ ½Éº¼¸¸À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
´Ù¸¥ Äڵ带 »ç¿ëÇÏ´Â ¹æ¹ýÀº ¾ÆÆÄÄ¡ ÇÙ½ÉÀÌ ±×°ÍÀ» ÂüÁ¶ÇÏ´øÁö,
dlopen()
À¸·Î Á÷Á¢ Äڵ带 ÀоîµéÀÌ´Â °ÍÀÌ´Ù.