C++ dlopen mini HOWTO
Aaron
Isotton
aaron (at) isotton.com
°æÅÂ
±è
nullnull4u (at) hanmail.net
1.00
2002-06-19
AI
copyright¿Í licenseºÎºÐÀ» ¾ÕÂÊÀ¸·Î ¿Å°å´Ù.
¿ë¾î¿¡ °üÇÑ ºÎºÐÀ» Ãß°¡Çß´Ù. ¾à°£ º¯È°¡ ÀÖ¾ú´Ù.
0.97
2002-06-19
JYG
¹®Àå°ú ¹®¹ýÀ» ¾à°£ °¡´Ùµë¾ú´Ù.
0.96
2002-06-12
AI
Âü°í ¹®ÇåÀ» Ãß°¡Çß´Ù. ¿ÜºÎ ÇÔ¼ö¿Í º¯¼öµéÀÇ ¼³¸íÀ»
¼öÁ¤Çß´Ù.
0.95
2002-06-11
AI
¾ÆÁÖ ¾à°£ °³¼±.
0.9
2002-06-10
AI
ÃÊ¾È ÀÛ¼º.
dlopen API¸¦ ÀÌ¿ëÇÏ¿©
µ¿ÀûÀ¸·Î C++ ÇÔ¼ö¿Í Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.
¼Ò°³
Unix C++ ÇÁ·Î±×·¡¸Ó »çÀÌ¿¡¼ ÀÚÁÖ ¹ß»ýÇÏ´Â Áú¹®Àº
dlopenAPI¸¦ ÀÌ¿ëÇÏ¿© C++ ÇÔ¼ö¿Í
Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â ¹æ¹ý¿¡ °üÇÑ °ÍÀÔ´Ï´Ù.
»ç½Ç À̰ÍÀº Ç×»ó °£´ÜÇÑ °Í¸¸Àº ¾Æ´Ï±â ¶§¹®¿¡,¾à°£ÀÇ ¼³¸íÀÌ
ÇÊ¿äÇÕ´Ï´Ù. ÀÌ mini HOWTO¿¡¼ ±×°Í¿¡ °üÇÑ ³»¿ëÀ» ´Ù·ç°í ÀÖ½À´Ï´Ù.
ÀÌ ¹®¼¸¦ ÀÌÇØÇϱâ À§Çؼ´Â C,
C++,±×¸®°ídlopen
API ¿¡ ´ëÇØ¼ ¾î´À Á¤µµ ¾Ë°í ÀÖ¾î¾ß ÇÒ °ÍÀÔ´Ï´Ù.
ÀÌ HOWTOÀÇ ¿ø¹®Àº
http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/¿¡ ÀÖ½À´Ï´Ù.
Copyright and License
ÀÌ ¹®¼ C++ dlopen mini HOWTOÀÇ ÀúÀÛ±ÇÀº
Aaron Isotton ¿¡°Ô ÀÖ½À´Ï´Ù.
ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´Ü¿¡¼ ¹ßÇ¥ÇÑ, 1.1 ȤÀº ±× ÀÌÈÄ ¹öÀüÀÇ
GNU Free Documentation LicenseÀÇ Á¶Ç׿¡ µû¶ó
ÀÌ ¹®¼¸¦ º¹»çÇϰųª, ¹èÆ÷ ȤÀº º¯°æÇÏ´Â °ÍÀÌ Çã¿ëµË´Ï´Ù.
°æ°í(Disclaimer)
ÀÌ ¹®¼ÀÇ ³»¿ëÀ¸·Î ÀÎÇÑ Ã¥ÀÓÀº ÁöÁö ¾Ê½À´Ï´Ù.
¿©±â¿¡ ¾²¿©Áø °³³äÀ̳ª ¿¹Á¦ ±×¸®°í Á¤º¸¸¦ »ç¿ëÇÏ¿© ¹ß»ýÇÑ
¹®Á¦¿¡ ´ëÇÑ Ã¥ÀÓÀº ¸ðµÎ ´ç½ÅÀÇ Ã¥ÀÓÀÔ´Ï´Ù.
¿©±â¿¡´Â ´ç½ÅÀÇ ½Ã½ºÅÛ¿¡ ÇÇÇØ¸¦ ÁÙ ¼ö ÀÖ´Â
¿À·ù³ª ºÎÁ¤È®ÇÑ °ÍµéÀÌ ÀÖÀ»¼öµµ ÀÖ½À´Ï´Ù.
ÁÖÀÇÇÏ¿© Áֽñ⠹ٶó¸ç, Àú´Â ¿©±â¿¡ ¾î¶°ÇÑ Ã¥ÀÓµµ ÁöÁö ¾ÊÀ»
°ÍÀÔ´Ï´Ù.
¸ðµç ÀúÀÛ±ÇÀº ±¸Ã¼ÀûÀ¸·Î ¾ð±ÞÇÏÁö ¾Ê¾Ò´Ù¸é, ±×°Íµé °¢°¢ÀÇ ¼ÒÀ¯ÀÚ°¡ °¡Áö°í ÀÖ½À´Ï´Ù.
ÀÌ ¹®¼¿¡ ÀÖ´Â ¿ë¾îÀÇ »ç¿ëÀÌ ¾î´À µî·Ï»óÇ¥³ª ¼ºñ½º ¸¶Å©ÀÇ È¿·Â¿¡ ¿µÇâÀ» ³¢Ä¡´Â
°ÍÀ¸·Î °£ÁÖÇØ¼´Â ¾È µË´Ï´Ù. Ưº°ÇÑ Á¦Ç°À̳ª ºê·£µå¸¦ Áö¸íÇÏ´Â °ÍÀÌ
»óǰµîÀÇ ÃßõÀ¸·Î º¸¿©¼´Â ¾È µË´Ï´Ù.
µµ¿Í ÁֽźÐ
ÀÌ ¹®¼¿¡¼, ³ª´Â ÀÌ ºÐµé²² °¨»çÇÏ°Ô µÇ¾î ±â»Ú°Ô »ý°¢ÇÕ´Ï´Ù.
Joy Y Goodreau ¾¾joyg (at) us.ibm.com
´Â ±³Á¤¿¡ µµ¿òÀ» Áּ̽À´Ï´Ù.
D. Stimitis ¾¾stimitis (at) idcomm.com
´Â formatting °ú name mangling¿¡ ´ëÇÑ ¸î°¡Áö À̽´¸¦
ÁöÀûÇØÁּ̰í, extern "C"¿¡ ´ëÇÑ ¸î°¡Áö
³ÇØÇÑ Á¡À» ÁöÀûÇØÁּ̽À´Ï´Ù.
Feedback
ÀÌ ¹®¼¿¡ ´ëÇÑ ¹ÝÀÀÀº ¾ðÁ¦³ª ȯ¿µÀÔ´Ï´Ù.
´ç½ÅÀÌ Ãß°¡ÇßÀ¸¸é ÇÏ´Â °Í, Àǰß, ºñÆÇÀ» ´ÙÀ½ ÁÖ¼Ò·Î º¸³»Áֽñâ
¹Ù¶ø´Ï´Ù aaron@isotton.com.
ÀÌ ¹®¼¿¡¼ ¾²ÀÎ ¿ë¾îµé
dlopen API
dlclose, dlerror,
dlopen,±×¸®°í dlsym ÇÔ¼ö´Â
dlopen(3) ¸Å´º¾ó ÆäÀÌÁö¿¡¼ ¼³¸íÇϰí ÀÖ½À´Ï´Ù.
ÀÌ ±Û¿¡¼dlopen
À̶ó°í ½èÀ» ¶§´Â,
dlopenÇÔ¼ö Çϳª¸¦ ÁöĪÇÏ´Â °ÍÀ̰í,
dlopen API
¶ó°í ½èÀ» ¶§¿¡´Â,
API Àüü¸¦ ÁöĪÇÏ´Â °ÍÀÔ´Ï´Ù.
¹®Á¦
ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ¶§, ¶óÀ̺귯¸®¸¦ ÀûÀçÇØ¾ß ÇÒ ¶§°¡ °¡²û¾¿ ÀÖÀ» °ÍÀÔ´Ï´Ù.
´ç½ÅÀÌ ÇÁ·Î±×·¥¿¡ µé¾î°¡´Â Ç÷¯±×ÀÎÀ̳ª ¸ðµâÀ» ¸¸µé°í ÀÖÀ»¶§ ÀÌ·¯ÇÑ
ÀÏÀº Á¾Á¾ ¹ß»ýÇÕ´Ï´Ù.
C¾ð¾î¿¡¼, µ¿ÀûÀ¸·Î ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ´Â °ÍÀº ¸Å¿ì °£´ÜÇÕ´Ï´Ù.
(dlopen, dlsym ±×¸®°í
dlclose¸¦ È£ÃâÇÏ´Â °Í¸¸À¸·Î ÃæºÐÇÕ´Ï´Ù)
C++¿¡¼´Â ¾à°£ ´õ º¹ÀâÇÕ´Ï´Ù. C++ ¶óÀ̺귯¸®¸¦ µ¿ÀûÀ¸·Î ÀûÀçÇÏ´Â °ÍÀÌ
¾î·Á¿î ÀÌÀ¯Áß¿¡ ÀϺκÐÀºname
mangling ¶§¹®À̰í, ÀϺκÐÀº dlopen API°¡
C¸¦ ¿°µÎ¿¡ µÎ°í ¸¸µé¾îÁ³±â ¶§¹®¿¡ class¸¦ ÀûÀçÇÏ´Â Àû´çÇÑ ¹æ¹ýÀ»
Á¦°øÇÏÁö ¸øÇϱ⠶§¹®ÀÔ´Ï´Ù.
C++¿¡¼ ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¼³¸íÇϱâ Àü¿¡,
name mangling¿¡ ´ëÇØ¼ ÀÚ¼¼È÷ »ìÆìº¸°í, ¹®Á¦¸¦ ºÐ¼®ÇØ º¾½Ã´Ù.
ºñ·Ï ´ç½ÅÀÌ name mangling¿¡ °ü½ÉÀÌ ¾ø´õ¶óµµ, ³ª´Â ´ç½ÅÀÌ
±×°Í¿¡ ´ëÇÑ ¼³¸íÀ» Àб⸦ ¹Ù¶ø´Ï´Ù. ¿Ö³ÄÇÏ¸é ±×°ÍÀº ´ç½ÅÀÌ
¿Ö ¹®Á¦°¡ ¹ß»ýÇÏ°í ¾î¶»°³ ÇØ°áÇØ¾ß ÇÏ´ÂÁö¸¦ ÀÌÇØÇϴµ¥ µµ¿òÀ»
Áֱ⠶§¹®ÀÔ´Ï´Ù.
Name Mangling
¸ðµç C++ÇÁ·Î±×·¥(ȤÀº ¶óÀ̺귯¸®³ª Object ÆÄÀÏ)¿¡¼,
¸ðµç non-static ÇÔ¼ö´Â ÀÌÁø ÆÄÀÏ¿¡¼
symbol·Î Ç¥ÇöµË´Ï´Ù.
ÀÌ·¯ÇÑ symbolµéÀº ÇÁ·Î±×·¥(ȤÀº ¶óÀ̺귯¸®³ª Object ÆÄÀÏ)¿¡¼,
À¯ÀÏÇÏ°Ô ÇÔ¼ö¸¦ È®ÀÎÇÏ´Â, Ư¼öÇÑ ¹®ÀÚ¿ÀÔ´Ï´Ù.
C¿¡¼´Â, symbolÀÇ À̸§Àº ÇÔ¼öÀÇ À̸§°ú µ¿ÀÏÇÕ´Ï´Ù.
strcpy˂ symbol˼
strcpyÀÔ´Ï´Ù.
C¿¡¼´Â µÎ°³ÀÇ non-static ÇÔ¼ö°¡ °°Àº À̸§À» °¡Áú ¼ö ¾ø±â ¶§¹®¿¡ À̰ÍÀÌ °¡´ÉÇÕ´Ï´Ù.
C++Àº ¿À¹ö·ÎµùÀ» Çã¿ëÇϰí (°°Àº À̸§À» °¡ÁöÁö¸¸ ÀÎÀÚ°¡ ´Ù¸¥ ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù),
C°¡ °¡Áö°í ÀÖÁö ¾ÊÀº ¿©·¯°¡Áö Ư¡µé — Class, member function, exception specifications —
À» °¡Áö°í Àֱ⠶§¹®¿¡, ±×³É ´Ü¼øÈ÷ ÇÔ¼ö À̸§À» symbol À̸§À¸·Î ¾µ ¼ö´Â ¾ø½À´Ï´Ù.
ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ, C++¿¡¼´Â name mangling(À̸§ ¾û¸ÁÀ¸·Î ¸¸µé±â)À̶ó´Â °ÍÀ» »ç¿ëÇÕ´Ï´Ù.
À̰ÍÀº ÇÔ¼öÀ̸§°ú ¸ðµç ÇÊ¿äÇÑ Á¤º¸ ¸ðµÎ¸¦(ÀÎÀÚÀÇ Å©±â³ª °¹¼ö¿Í °°Àº) ÄÄÆÄÀÏ·¯¸¸ÀÌ ¾Ë¾Æº¼ ¼ö ÀÖ´Â
ÀÌ»óÇÑ ¹®ÀÚ¿·Î ¹Ù²ã¹ö¸³´Ï´Ù.
¿¹¸¦ µé¾î foo¶ó´Â ÇÔ¼ö°¡ ÀÖ´Ù¸é, name mangling¿¡ ÀÇÇØ
foo@4%6^·Î ¹Ù²ð °ÍÀÔ´Ï´Ù.
name mangling°ú °ü·ÃÇÏ¿© »ý±â´Â ¹®Á¦Á¡ÀÇ Çϳª´Â C++ Ç¥ÁØ (ÇöÀç´Â ISO14882)ÀÌ
±× ¹æ¹ýÀ» Á¤ÀÇÇØ ³õÁö ¾Ê¾Ò´Ù´Â Á¡ÀÔ´Ï´Ù. À̰ÍÀº ¸ðµç ÄÄÆÄÀÏ·¯µé¸¶´Ù Àڱ⸸ÀÇ ¹æ¹ý
À¸·Î name manglingÀ» ÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. ¾î¶² ÄÄÆÄÀÏ·¯´Â name mangling ¾Ë°í¸®ÁòÀÌ ¹öÀü¿¡ µû¶ó
´Ù¸£±âµµ ÇÕ´Ï´Ù. (g++ 2.x ¿Í 3.x¿¡¼ ¶Ñ·ÇÇÏ°Ô µå·¯³³´Ï´Ù.) ºñ·Ï
´ç½ÅÀÌ Æ¯Á¤ÇÑ ÄÄÆÄÀÏ·¯°¡ ¾î¶»°Ô À̸§À» ¹Ù²Ù´ÂÁö ÀÌÇØÇß´Ù°í ÇØµµ(±×·¡¼ dlsymÀ» ÅëÇØ ±× ÇÔ¼ö¸¦ ÀûÀçÇÒ ¼ö ÀÖ°Ô µÈ´Ù°í ÇØµµ),
±×°ÍÀº ¾Æ¸¶ ±× ƯÁ¤ÇÑ ÄÄÆÄÀÏ·¯¿¡¼¸¸ È¿°ú°¡ ÀÖÀ» °ÍÀ̰í, ´ÙÀ½ ¹öÀüÀÇ ÄÄÆÄÀÏ·¯¿¡¼´Â ÀÌ¹Ì »ç¿ëÇÒ ¼ö ¾øÀ»Áöµµ
¸ð¸¨´Ï´Ù.
Classes
dlopen API ÀÇ ¶Ç´Ù¸¥ ¹®Á¦´Â, À̵éÀÌÇÔ¼ö¸¦ ÀûÀçÇÏ´Â °Í¸¸À» Áö¿øÇϰí ÀÖ´Ù´Â Á¡ÀÔ´Ï´Ù.
ÇÏÁö¸¸ C++¿¡¼´Â ¶óÀ̺귯¸®°¡ Á¾Á¾ ´ç½ÅÀÌ ÇÁ·Î±×·¥¿¡¼ ¾²°íÀÚ ÇÏ´Â Class¸¦ ³ëÃâ½Ã۰í´Â ÇÕ´Ï´Ù.
ºÐ¸íÈ÷, Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ ´ç½ÅÀº ±×°ÍÀÇ ÀνºÅϽº¸¦ ¸¸µé¾î¾ß ÇÏÁö¸¸, ±×°ÍÀº ½±Áö ¾Ê½À´Ï´Ù.
ÇØ°á ¹æ¹ý
extern "C"
C++¿¡´Â extern "C"¶ó´Â, C bindingÀ¸·Î ÇÔ¼ö¸¦
Á¤ÀÇÇϴ Ưº°ÇÑ Å°¿öµå°¡ ÀÖ½À´Ï´Ù.
extern "C"·Î¼ ¼±¾ðµÈ ÇÔ¼ö´Â Có·³ ÇÔ¼öÀÇ À̸§À» symbolÀÇ À̸§À¸·Î »ç¿ëÇÕ´Ï´Ù.
ÀÌ·¯ÇÑ ÀÌÀ¯·Î, ¸â¹öÇÔ¼ö°¡ ¾Æ´Ñ ÇÔ¼öµé¸¸ÀÌ extern "C"·Î¼ ¼±¾ðµÉ ¼ö ÀÖ°í,
ÀÌ·¯ÇÑ ÇÔ¼öµéÀº ¿À¹ö·ÎµùÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù.
ÀÌ·± ½ÉÇÑ Á¦ÇÑÀÌ ÀÖÁö¸¸, extern "C"ÇÔ¼ö´Â C ÇÔ¼öó·³
dlopenÀ» ½á¼ µ¿ÀûÀ¸·Î ÀûÀçÇÒ ¼ö Àֱ⠶§¹®¿¡ ¸Å¿ì À¯¿ëÇÕ´Ï´Ù.
À̰ÍÀº extern "C"·Î ¼±¾ðµÈ ÇÔ¼ö°¡
C++ Äڵ带 Æ÷ÇÔÇÒ ¼ö ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÏ´Â °ÍÀ̾ƴմϴÙ.
ÀÌ·± ÇÔ¼ö´Â ¾î´À Á¾·ùÀÇ ÀÎÀÚ¶óµµ ¹ÞÀ» ¼ö ÀÖ°í, C++ÀÇ Æ¯Â¡À» ¾µ ¼ö ÀÖ½À´Ï´Ù.
ÇÔ¼ö¸¦ ÀûÀçÇÏ´Â ¹ý
C++¿¡¼ ÇÔ¼ö´Â dlsymÀ» ÅëÇØ Có·³ ÀûÀçµË´Ï´Ù.
´ç½ÅÀÌ ÀûÀçÇϰíÀÚ ÇÏ´Â ÇÔ¼ö´Â symbolÀÇ À̸§ÀÌ ¾û¸ÁÀ¸·Î µÇÁö
¾Êµµ·Ï(name manglingÀÌ ÀÌ·ç¾îÁöÁö ¾Êµµ·Ï),
extern "C"·Î¼ÀÇ ÀÚ°ÝÀ» °®Ãç¾ß ÇÒ °ÍÀÔ´Ï´Ù.
ÇÔ¼ö¸¦ ÀûÀçÇϱâ
main.cpp:
#include
int main() {
using std::cout;
using std::cerr;
cout << "C++ dlopen demo\n\n";
// open the library
cout << "Opening hello.so...\n";
void* handle = dlopen("./hello.so", RTLD_LAZY);
if (!handle) {
cerr << "Cannot open library: " << dlerror() << '\n';
return 1;
}
// load the symbol
cout << "Loading symbol hello...\n";
typedef void (*hello_t)();
hello_t hello = (hello_t) dlsym(handle, "hello");
if (!hello) {
cerr << "Cannot load symbol 'hello': " << dlerror() <<
'\n';
dlclose(handle);
return 1;
}
// use it to do the calculation
cout << "Calling hello...\n";
hello();
// close the library
cout << "Closing library...\n";
dlclose(handle);
}
]]>
hello.cpp:
extern "C" void hello() {
std::cout << "hello" << '\n';
}
]]>
hello¶ó´Â ÇÔ¼ö´Â hello.cpp¿¡¼ extern
"C"·Î ¼±¾ðµÇ¾ú½À´Ï´Ù. À̰ÍÀº main.cpp¿¡¼
dlsymÀ» »ç¿ëÇÏ¿© ÀûÀçÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÔ¼ö´Â extern "C"
·Î¼ÀÇ ÀÚ°ÝÀ» °®Ãß¾î¾ß ÇÕ´Ï´Ù. ±×·¸Áö ¾Ê´Ù¸é ¿ì¸®´Â hello ÇÔ¼öÀÇ symbolÀÇ À̸§À» ¾Ë ¼ö ¾øÀ»Å״ϱî¿ä.
extern "C"ÀÇ ¼±¾ð¿¡´Â µÎ°¡ÁöÀÇ ´Ù¸¥ ÇüŰ¡ ÀÖ½À´Ï´Ù:
Çϳª´Â À§¿¡¼ ½è´øextern "C"ÀÇ ¹æ¹ýÀ̰í, ¶Ç ´Ù¸¥ Çϳª´Â
extern "C" { … }ÇüÅ·ΠÁß°ýÈ£ »çÀÌ¿¡ ¼±¾ðÀÌ µé¾î°¡´Â ¹æ¹ýÀÔ´Ï´Ù.
ù¹øÂ°(inline)ÇüÅ´ extern ¿¬°á°ú C ¾ð¾î ¿¬°áÀ» °®½À´Ï´Ù.
µÎ¹øÂ° ÇüÅ´ C¾ð¾î ¿¬°á¿¡¸¸ ¿µÇâÀ» ³¢Ä¨´Ï´Ù.
µû¶ó¼ ¾Æ·¡ÀÇ µÎ °¡Áö ¼±¾ð ¹æ¹ýÀº µ¿ÀÏÇÑ °ÍÀÔ´Ï´Ù.
extern "C" int foo;
extern "C" void bar();
extern "C" {
extern int foo;
extern void bar();
}
extern°ú externÀÌ ¾Æ´Ñ
ÇÔ¼öÀÇ ¼±¾ð¿¡´Â Â÷À̰¡ ¾ø±â¶§¹®¿¡,
´ç½ÅÀÌ ¾î¶°ÇÑ º¯¼öµµ ¼±¾ðÇÏÁö ¾Ê´Â ÇÑ ¹®Á¦°¡ ¾ø½À´Ï´Ù.
´ç½ÅÀÌ º¯¼ö¸¦ ¼±¾ðÇÑ´Ù¸é,´ÙÀ½ÀÇ µÎ ¼±¾ð ¹æ¹ýÀº
°°Áö ¾Ê´Ù´Â °ÍÀ» ¸í½ÉÇØ¾ß ÇÕ´Ï´Ù.
extern "C" int foo;
extern "C" {
int foo;
}
Á» ´õ ÀÚ¼¼ÇÑ ¼³¸íÀ» ¿øÇϽøé, paragraph 7¿¡ ÁÖÀǸ¦ ±â¿ï¿©
ISO14882ÀÇ 7.5¸¦ Àо½Ã°Å³ª,
STR2000ÀÇ paragraph 9.2.4.¸¦ ÂüÁ¶ÇØÁֽʽÿÀ.
¿ÜºÎ º¯¼ö·Î ¹«¾ð°¡¸¦ Çϱâ Àü¿¡,
see alsoºÎºÐ¿¡
ÀûÇô ÀÖ´Â ¹®¼µéÀ» Á¤µ¶ÇØÁֽñ⠹ٶø´Ï´Ù.
Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â ¹ý
Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â °ÍÀº Á» ´õ ¾î·Æ½À´Ï´Ù. ¿Ö³ÄÇϸé
¿ì¸®´Â Ŭ·¡½ºÀÇÀνºÅϽº¸¦ ÇÊ¿ä·Î ÇÏÁö,
ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÇÊ¿ä·Î ÇÏ´Â°Ô ¾Æ´Ï±â ¶§¹®ÀÔ´Ï´Ù.
Ŭ·¡½º°¡ ½ÇÇàÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖÁö ¾ÊÀºµ¥´Ù°¡,(¸î¸î »óȲ¿¡¼´Â)
Ŭ·¡½ºÀÇ À̸§Á¶Â÷µµ ¾Ë ¼ö ¾ø±â ¶§¹®¿¡, ¿ì¸®´Â new
¸¦ ÀÌ¿ëÇÏ¿© Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù.
À̰ÍÀº ´ÙÇü¼º(polymorphism) À» ÅëÇØ ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù.
¿ì¸®´Â ±â¹Ý Ŭ·¡½º, °¡»óÀÇ ¸â¹ö¸¦ °¡Áö°í ÀÖ´Â
ÀÎÅÍÆäÀ̽ºÅ¬·¡½º¸¦
½ÇÇàÆÄÀϳ»¿¡ ¼±¾ðÇϰí,
½ÇÁ¦ ±¸ÇöºÎÀÇ Å¬·¡½º¸¦ ¸ðµâ
¿¡ ¼±¾ðÇÕ´Ï´Ù. ÀϹÝÀûÀ¸·Î ÀÎÅÍÆäÀ̽º Ŭ·¡½º´Â Ãß»óÀûÀÔ´Ï´Ù.
(Ŭ·¡½º°¡ ¼ø¼ö°¡»óÇÔ¼ö(pure virtual function)À»
°¡Áö°í ÀÖÀ»¶§ Ŭ·¡½º°¡ Ãß»óÀûÀ̶ó°í ÇÕ´Ï´Ù.)
Ŭ·¡½ºÀÇ µ¿ÀûÀÎ ÀûÀç´Â ÀϹÝÀûÀ¸·Î Ç÷¯±×ÀÎ
— ¸íÈ®ÇÏ°Ô Á¤ÀÇµÈ ÀÎÅÍÆäÀ̽º¸¦ º¸¿©ÁÖ¾î¾ß ÇÏ´Â
— ¿¡ ¾²À̱⠶§¹®¿¡, ¿ì¸®´Â ¾î·°Å³ª ÀÎÅÍÆäÀ̽º Ŭ·¡½º¿Í
°Å±â¼ ÆÄ»ýµÈ ±¸ÇöºÎ Ŭ·¡½º¸¦ Á¤ÀÇÇØ¾ß ÇÕ´Ï´Ù.
´ÙÀ½À¸·Î,¸ðµâ ¾È¿¡Class factory functionÀ̶ó´Â
µÎ°³ÀÇ µµ¿òÀ» ÁÖ´Â ÇÔ¼ö¸¦ Ãß°¡·Î ¼±¾ðÇØ¾ß ÇÕ´Ï´Ù.
ÀÌ ÇÔ¼ö Áß Çϳª´Â Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸¸µé°í ±×°ÍÀÇ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÏ´Â
¿ªÇÒÀ» Çϰí, ¶Ç ´Ù¸¥ ÇϳªÀÇ ÇÔ¼ö´Â factory¿¡¼ ¸¸µé¾îÁø ÇÔ¼öÀÇ
Æ÷ÀÎÅ͸¦ ¹Þ¾Æ ±×°Í(Ŭ·¡½ºÀÇ ÀνºÅϽº)¸¦ ÆÄ±«ÇÏ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù.
ÀÌ µÎ ÇÔ¼ö´Â extern "C"ÀÇ ÀÚ°ÝÀ» °¡Áö°í ÀÖ¾î¾ß
ÇÕ´Ï´Ù.
Ŭ·¡½º¸¦ ¸ðµâ¿¡¼ ¾²±â À§Çؼ,µÎ°³ÀÇ factory functionÀ»
¿ì¸®°¡ helloÇÔ¼ö¸¦ ÀûÀçÇß´ø
°Íó·³dlsymÀ» »ç¿ëÇÏ¿©
ÀûÀçÇϽʽÿÀ.±×·³ ¿ì¸®´Â ¿ì¸®°¡ ¿øÇÏ´Â ¸¸ÅÀÇ ÀνºÅϽº¸¦
»ý¼ºÇÒ¼öµµ ÀÖ°í, ÆÄ±«ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â ¹ý
¿©±â¼ ¿ì¸®´Â ÀϹÝÀûÀδٰ¢ÇüÀ»
ÀÎÅÍÆäÀ̽º·Î Çϰí, »ï°¢ÇüÀ»
±¸ÇöºÎºÐÀ¸·Î ÇÒ °ÍÀÔ´Ï´Ù.
main.cpp:
#include
int main() {
using std::cout;
using std::cerr;
// load the triangle library
void* triangle = dlopen("./triangle.so", RTLD_LAZY);
if (!triangle) {
cerr << "Cannot load library: " << dlerror() << '\n';
return 1;
}
// load the symbols
create_t* create_triangle = (create_t*) dlsym(triangle, "create");
destroy_t* destroy_triangle = (destroy_t*) dlsym(triangle, "destroy");
if (!create_triangle || !destroy_triangle) {
cerr << "Cannot load symbols: " << dlerror() << '\n';
return 1;
}
// create an instance of the class
polygon* poly = create_triangle();
// use the class
poly->set_side_length(7);
cout << "The area is: " << poly->area() << '\n';
// destroy the class
destroy_triangle(poly);
// unload the triangle library
dlclose(triangle);
}
]]>
polygon.hpp:
triangle.cpp:
class triangle : public polygon {
public:
virtual double area() const {
return side_length_ * side_length_ * sqrt(3) / 2;
}
};
// the class factories
extern "C" polygon* create() {
return new triangle;
}
extern "C" void destroy(polygon* p) {
delete p;
}
]]>
Ŭ·¡½º¸¦ ÀûÀçÇÒ¶§ ÁÖÀÇÇØ¾ß ÇÒ Á¡ÀÌ ¸î°¡Áö ÀÖ½À´Ï´Ù:
´ç½ÅÀº ÀνºÅϽº¸¦ »ý¼ºÇÏ´Â ÇÔ¼ö¿Í ÆÄ±«ÇÏ´Â ÇÔ¼ö¸¦
¸ðµÎ Á¦°øÇØ¾ß ÇÕ´Ï´Ù.
¶Ç ´ç½ÅÀÌ ÀνºÅϽº¸¦ ÆÄ±«ÇÒ¶§¿¡´Â ½ÇÇàÆÄÀÏ ³»¿¡¼
delete¸¦ ÀÌ¿ëÇØ¼ Áö¿ìÁö ¸¶½Ã°í
,Ç×»ó ¸ðµâ·Î ³Ñ°Ü¼ Áֽñ⠹ٶø´Ï´Ù.
ÀÌ´Â C++ ¿¡¼ new¿Í delete
°¡ ¿À¹ö·Îµù µÉ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. ÀÌ °æ¿ì¿¡
¼·Î ¸ÂÁö ¾Ê´Â new¿Í delete
°¡ È£ÃâµÉ ¼ö ÀÖ°í, ±×·¸°Ô µÇ¸é ¸Þ¸ð¸® ´©¼ö³ª segmentation
fault°¡ ÀϾ ¼öµµ ÀÖ½À´Ï´Ù.À̰ÍÀº ¸ðµâ°ú ½ÇÇàÆÄÀÏÀ»
¸µÅ©ÇÒ¶§ ¼·Î ´Ù¸¥ Ç¥ÁØ ¶óÀ̺귯¸®¸¦ »ç¿ëÇßÀ» °æ¿ì¿¡µµ Àû¿ëµË´Ï´Ù.
ÀÎÅÍÆäÀ̽º Ŭ·¡½ºÀÇ ¼Ò¸êÀÚ´Â ±¸ÇöºÎ Ŭ·¡½º¿¡ ¼Ò¸êÀÚ°¡
¾ø´Â°æ¿ì¸¦ Á¦¿ÜÇϰí´Â
°¡»ó(virtual)À̾î¾ß ÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é ±×°ÍÀº È£ÃâµÇÁö
¾ÊÀ» °ÍÀ̰í, ¸Þ¸ð¸® ´©¼ö³ª segmentation fault°¡ ÀϾ ¼öµµ
ÀÖ½À´Ï´Ù.
See Also
dlopen(3)ÀÇ ¸Å´º¾ó ÆäÀÌÁö¸¦ º¸½Ê½Ã¿À.
dlopenAPIÀÇ ¸ñÀû°ú ¿ëµµ¸¦ ¼³¸íÇÕ´Ï´Ù.
James Norton ¾¾°¡ Linux
Journal¿¡ ±â°íÇß´ø ±Û
Dynamic Class Loading for C++ on Linux
extern "C", »ó¼Ó, °¡»óÇÔ¼ö,
new ¿Í delete¿¡ ´ëÇØ
³ª¿ÍÀÖ´Â ´ç½ÅÀÌ Áñ°Üº¸´Â C++ reference.
Àü STR2000À» ÃßõÇÕ´Ï´Ù.
ISO14882
Program Library
HOWTO¿¡¼´Â ´ç½Å¿¡°Ô Á¤Àû, °øÀ¯,µ¿ÀûÀûÀç ¶óÀ̺귯¸®¿Í
±×·¯ÇÑ °ÍµéÀ» ¸¸µå´Â ¹æ¹ýÀ» ¼³¸íÇØ ÁÙ °ÍÀÔ´Ï´Ù.
(¹ø¿ªµÈ ¹®¼´Â
http://kldp.org/HOWTO/html/Program-Library-HOWTO/
¿¡¼ º¼ ¼ö ÀÖ´Ù.)
ISO14482 ISO/IEC 14482-1998 — The
C++ Programming Language.
http://webstore.ansi.org/¿¡¼ PDF·Î À̿밡´ÉÇÕ´Ï´Ù.
STR2000
Stroustrup
Bjarne
The C++ Programming Language, Special
Edition.
ISBN 0-201-70073-5.
Addison-Wesley.