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¸¦ ³ëÃâ½ÃÅ°°í´Â ÇÕ´Ï´Ù. ºÐ¸íÈ÷, Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­ ´ç½ÅÀº ±×°ÍÀÇ ÀνºÅϽº¸¦ ¸¸µé¾î¾ß ÇÏÁö¸¸, ±×°ÍÀº ½±Áö ¾Ê½À´Ï´Ù. ÇØ°á ¹æ¹ý <literal>extern "C"</literal> 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.