¡¶´êÔèGay¡¤2020¡¤com-Ãâ·ÑÔĶÁС˵ÎÞµ¯´°È«±¾Ãâ·ÑÔĶÁ...¡·¾çÇé¼ò½é£º[1]ÖлªÒ½Ñ§»áÑÛ¿ÆÑ§·Ö»áÑÛÍâÉËѧ×é. ÖйúÑÛÄÚÒìÎïÉËÕïÁÆ×¨¼Ò¹²Ê¶£¨2021Ä꣩[J]. ÖлªÑÛ¿ÆÔÓÖ¾,2021,57(11)£º819-824.´êÔèGay¡¤2020¡¤com-Ãâ·ÑÔĶÁС˵ÎÞµ¯´°È«±¾Ãâ·ÑÔĶÁ...ÉÙÅ®Èíµ¹ÏÂÀ´·½Ô´ÊÖ±Û¿ìËÙÒ»À̽«ÆäÀ¹Ñü¼ÐסÒþÁ۹ƴ߶¯ÆðÀ´ËûÁ©µÄÉíÓ°ÏûÊÅÔÚÔ´¦Linux¿â¿´·¨¶¯Ì¬¿âºÍ¾²Ì¬¿âµÄÖÆ×÷ÔõÑùÒÆÖ²µÚÈý·½¿â2020-10-30 13:37¡¤Ò»¿ÚLinuxÒ»¡¢Ê²Ã´ÊÇ¿âÔÚwindowsƽ̨ºÍlinuxƽ̨϶¼´ó×Ú±£´æ×Å¿âÒ»Ñùƽ³£ÊÇÈí¼þ×÷ÕßΪÁËÐû²¼Àû±ã¡¢Ìæ»»Àû±ã»ò¶þ´Î¿ª·¢Ä¿µÄ¶øÐû²¼µÄÒ»×é¿ÉÒÔµ¥¶ÀÓëÓ¦ÓóÌÐò¾ÙÐÐcompile time»òruntimeÁ´½ÓµÄ¶þ½øÖÆ¿ÉÖØ¶¨Î»Ä¿µÄÂëÎļþʵÖÊÉÏÀ´Ëµ¿âÊÇÒ»ÖÖ¿ÉÖ´ÐдúÂëµÄ¶þ½øÖÆÐÎʽÕâ¸öÎļþ¿ÉÒÔÔÚ±àÒëʱÓɱàÒëÆ÷Ö±½ÓÁ´½Óµ½¿ÉÖ´ÐгÌÐòÖÐÒ²¿ÉÒÔÔÚÔËÐÐʱÓɲÙ×÷ϵͳµÄruntime enviromentƾ֤ÐèÒª¶¯Ì¬¼ÓÔØµ½ÄÚ´æÖÐÒ»×é¿â¾ÍÐγÉÁËÒ»¸öÐû²¼°üËäÈ»ÏêϸÐû²¼¼¸¶à¸ö¿âÍêÈ«ÓÉ¿âÌṩÉÌ×Ô¼º¾öÒéÓÉÓÚwindowsºÍlinuxµÄʵÖʲî±ðÒò´Ë¶þÕß¿âµÄ¶þ½øÖÆÊDz»¼æÈݵÄÏÖʵÖÐÿ¸ö³ÌÐò¶¼ÒªÒÀÀµÐí¶à»ù´¡µÄµ×²ã¿â²»¿ÉÄÜÿСÎÒ˽¼ÒµÄ´úÂë¶¼´ÓÁã×îÏÈÒò´Ë¿âµÄ±£´æÒâÒå·ÇͬѰ³£¹²Ïí¿âµÄÀûÒæÊDzî±ðµÄÓ¦ÓóÌÐòÈôÊÇŲÓÃÏàͬµÄ¿âÄÇôÔÚÄÚ´æÀïÖ»ÐèÒªÓÐÒ»·Ý¸Ã¹²Ïí¿âµÄʵÀý±¾ÎĽöÌÖÂÛlinuxϵĿâ¶þ¡¢¿âµÄ·ÖÀà¿âÓÐÁ½ÖÖ£º¾²Ì¬¿âºÍ¹²Ïí¿â£¨¶¯Ì¬¿â£©win32ƽ̨Ͼ²Ì¬¿âͨ³£ºó׺Ϊ.lib¶¯Ì¬¿âΪ.dll £»linuxƽ̨Ͼ²Ì¬¿âͨ³£ºó׺Ϊ.a¶¯Ì¬¿âΪ.so ´ÓʵÖÊÉÏÀ´ËµÓÉͳһ¶Î³ÌÐò±àÒë³öÀ´µÄ¾²Ì¬¿âºÍ¶¯Ì¬¿âÔÚ¹¦Ð§ÉÏÊÇûÓÐÇø±ðµÄ²î±ðÖ®´¦½ö½öÔÚÓÚÆäÃû×ÖÉÏÒ²¾ÍÊǾ²Ì¬ºÍ¶¯Ì¬¶þÕß¾ùÒÔÎļþµÄÐÎʽ±£´æÆäʵÖÊÉÏÊÇÒ»ÖÖ¿ÉÖ´ÐдúÂëµÄ¶þ½øÖÆÃûÌÿÉÒÔ±»ÔØÈëÄÚ´æÖÐÖ´ÐÐ ÎÞÂÛÊǶ¯Ì¬Á´½Ó¿âÕվɾ²Ì¬Á´½Ó¿âËüÃÇÎÞ·ÇÊÇÏòÆäŲÓÃÕßÌṩ±äÁ¿¡¢º¯ÊýºÍÀà1. ¾²Ì¬¿âËùν¾²Ì¬¿â¾ÍÊÇÔÚ¾²Ì¬±àÒëʱÓɱàÒëÆ÷µ½Ö¸¶¨Ä¿Â¼Ñ°ÕÒ²¢ÇÒ¾ÙÐÐÁ´½ÓÒ»µ©Á´½ÓÍê³É×îÖյĿÉÖ´ÐгÌÐòÖоͰüÀ¨Á˸ÿâÎļþÖеÄËùÓÐÓÐÓÃÐÅÏ¢°üÀ¨´úÂë¶Î¡¢Êý¾Ý¶ÎµÈ2. ¶¯Ì¬¿âËùν¶¯Ì¬¿â¾ÍÊÇÔÚÓ¦ÓóÌÐòÔËÐÐʱÓɲÙ×÷ϵͳƾ֤ӦÓóÌÐòµÄÇëÇó¶¯Ì¬µ½Ö¸¶¨Ä¿Â¼ÏÂѰÕÒ²¢×°ÔØÈëÄÚ´æÖÐͬʱÐèÒª¾ÙÐеØÖ·Öض¨Ïò3. Çø±ðÎÒÃÇÒÔ±àÒëÁ´½Ó¡¢ÔØÈëʱ¿ÌÁ½µãÀ´ÌÖÂÛ¾²Ì¬¿âºÍ¶¯Ì¬¿âµÄÇø±ð±àÒëÁ´½Ó¾²Ì¬Á´½Ó¿âÔÚ³ÌÐò±àÒëʱ»á±»Á´½Óµ½Ä¿µÄ´úÂëÖÐÄ¿µÄ³ÌÐòÔËÐÐʱ½«²»ÔÙÐèÒª¸Ä¶¯Ì¬¿âÒÆÖ²Àû±ãÌå»ý½Ï´óÆÌÕſռäºÍ×ÊÔ´ÓÉÓÚËùÓÐÏà¹ØµÄ¹¤¾ßÎļþÓëÇ£Éæµ½¿â¶¼±»Á´½ÓºÏ³ÉÒ»¸ö¿ÉÖ´ÐÐÎļþÕâÑùµ¼Ö¿ÉÖ´ÐÐÎļþµÄÌå»ý½Ï´ó¶¯Ì¬¿âÔÚ³ÌÐò±àÒëʱ²¢²»»á±»Á´½Óµ½Ä¿µÄ´úÂëÖжøÊÇÔÚ³ÌÐòÔËÐÐʱ²Å±»ÔØÈëÓÉÓÚ¿ÉÖ´ÐÐÎļþÌå»ý½ÏСÓÐÁ˶¯Ì¬¿â³ÌÐòµÄÉý¼¶»áÏà¶Ô½ÏÁ¿¼òÆÓºÃ±Èij¸ö¶¯Ì¬¿âÉý¼¶ÁËÖ»ÐèÒªÌæ»»Õâ¸ö¶¯Ì¬¿âµÄÎļþ¶ø²»ÐèÒªÈ¥Ìæ»»¿ÉÖ´ÐÐÎļþµ«Òª×¢ÖصÄÊÇ¿ÉÖ´ÐгÌÐòÔÚÔËÐÐʱÐèÒªÄÜÕÒµ½¶¯Ì¬¿âÎļþ¿ÉÖ´ÐÐÎļþʱ¶¯Ì¬¿âµÄŲÓÃÕß³ÌÐò´úÂëºÍ¿âÔØÈëʱ¿Ì¶þÕߵIJî±ðµãÔÚÓÚ´úÂë±»ÔØÈëµÄʱ¿Ì²î±ð ¾²Ì¬¿âµÄ´úÂëÔÚ±àÒëÀú³ÌÖÐÒѾ±»ÔØÈë¿ÉÖ´ÐгÌÐòÒò´ËÌå»ý½Ï´ó ¹²Ïí¿âµÄ´úÂëÊÇÔÚ¿ÉÖ´ÐгÌÐòÔËÐÐʱ²ÅÔØÈëÄÚ´æµÄÔÚ±àÒëÀú³ÌÖнö¼òÆÓµÄÒýÓÃÒò´Ë´úÂëÌå»ý½ÏС4. ÓÅÈõµãÏà¹ØÓÚ¶¯Ì¬¿â¾²Ì¬¿âµÄÓŵãÔÚÓÚÖ±½Ó±»Á´½Ó½ø¿ÉÖ´ÐгÌÐòÖÐÖ®ºó¸Ã¿ÉÖ´ÐгÌÐò¾Í²»ÔÙÒÀÀµÓÚÔËÐÐÇéÐεÄÉèÖÃÁË£¨ËäÈ»ÈÔÈ»»áÒÀÀµÓÚ CPUÖ¸ÁºÍ²Ù×÷ϵͳ֧³ÖµÄ¿ÉÖ´ÐÐÎļþÃûÌõÈÓ²ÐÔÏÞÖÆ£©¶ø¶¯Ì¬¿âµÄÓŵãÔÚÓÚÓû§ÉõÖÁ¿ÉÒÔÔÚ³ÌÐòÔËÐÐÊ±ËæÊ±Ìæ»»¸Ã¶¯Ì¬¿âÕâ¾Í×é³ÉÁ˶¯Ì¬²å¼þϵͳµÄ»ù´¡ÏêϸʹÓþ²Ì¬¿âºÍ¶¯Ì¬¿âÓɳÌÐòԱƾ֤ÐèÒª×Ô¼º¾öÒéÁíÍâÐèҪ˵Ã÷µÄÒ»µãÊǴӵײãʵÏÖÉ϶¯Ì¬¿âµÄЧÂÊ¿ÉÄÜ»á±È¾²Ì¬¿âÉÔ²îÒ»µãµã×¢ÖØÕâÀïÓÃÁË¿ÉÄܶþ×ÖÏêϸ²î²»²î»¹µÃ¿´Ð´³ÌÐòµÄÈËÖ®ÒÔÊÇ¿ÉÄÜ»á²îÖ÷ÒªÔµ¹ÊÔÓÉÔÚÓÚ³ÌÐò×ÜÎÞ·¨Ö±½ÓŲÓö¯Ì¬¿âÖеĺ¯Êý·ûºÅ¶øÖ»ÄÜͨ¹ýŲÓòÙ×÷ϵͳµÄruntime enviroment½Ó¿ÚÀ´¶¯Ì¬ÔØÈëij¸öº¯Êý·ûºÅͬʱ»ñµÃ¸Ãº¯Êý·ûºÅÔÚÄÚ´æÖеĵØÖ·½«ÆäÉúÑÄΪº¯ÊýÖ¸Õë¾ÙÐÐŲÓÃÕâ¾ÍÔÚº¯ÊýŲÓÃʱÔöÌíÁËÒ»´Î¼ä½ÓѰַµÄÀú³ÌÈý¡¢¿âÎļþµÄÖÆ×÷1. ¿âÎļþÃüÃû¾²Ì¬¿âµÄÃû×ÖÒ»Ñùƽ³£Îªlibxxxx.aÆäÖÐxxxxÊǸÃlibµÄÃû³Æ£» ¶¯Ì¬¿âµÄÃû×ÖÒ»Ñùƽ³£Îªlibxxxx.so.x.y.z¼ÄÒåÈçÏÂͼËùʾ£º2. ÖÆ×÷¿âÎļþ³£ÓòÎÊýÊ×ÏÈÐèÒªÏàʶgcc±àÒë¿âÒªÓõ½Ò»Ð©²ÎÊýºÜÖ÷Òª²ÎÊý ¼ÄÒå -shared Ö¸¶¨ÌìÉú¶¯Ì¬Á´½Ó¿â -static Ö¸¶¨ÌìÉú¾²Ì¬Á´½Ó¿â -fPIC ÌåÏÖ±àÒëΪλÖÃ×ÔÁ¦µÄ´úÂëÓÃÓÚ±àÒë¹²Ïí¿âÄ¿µÄÎļþÐèÒª½¨Éè³ÉλÖÃÎÞ¹ØÂë¿´·¨ÉϾÍÊÇÔÚ¿ÉÖ´ÐгÌÐò×°ÔØËüÃǵÄʱ¼äËüÃÇ¿ÉÒÔ·ÅÔÚ¿ÉÖ´ÐгÌÐòµÄÄÚ´æÀïµÄÈκεط½ -L ÌåÏÖÒªÅþÁ¬µÄ¿âÔÚÄ¿½ñĿ¼ÖÐ -l Ö¸¶¨Á´½ÓʱÐèÒªµÄ¶¯Ì¬¿â±àÒëÆ÷²éÕÒ¶¯Ì¬ÅþÁ¬¿âʱÓÐÒþº¬µÄÃüÃû¹æÔò¼´ÔÚ¸ø³öµÄÃû×ÖÇ°Ãæ¼ÓÉÏlibºóÃæ¼ÓÉÏ.soÀ´È·¶¨¿âµÄÃû³Æ -Wall ÌìÉúËùÓÐÖÒÑÔÐÅÏ¢ -ggdb ´ËÑ¡Ï¾¡¿ÉÄܵÄÌìÉúgdbµÄ¿ÉÒÔʹÓõĵ÷ÊÔÐÅÏ¢ -g ±àÒëÆ÷ÔÚ±àÒëµÄʱ¼ä±¬·¢µ÷ÊÔÐÅÏ¢ -c Ö»¼¤»îÔ¤´¦Öóͷ£¡¢±àÒëºÍ»ã±à,Ò²¾ÍÊǰѳÌÐò×ö³ÉÄ¿µÄÎļþ(.oÎļþ) -Wl,options °Ñ²ÎÊý(options)ת´ï¸øÁ´½ÓÆ÷ldÈôÊÇoptionsÖÐÐÄÓжººÅ,¾Í½«options·Ö³É¶à¸öÑ¡Ïî,È»ºóת´ï¸øÁ´½Ó³ÌÐò3. ¿âÔ´Îļþ¼Ù¶¨ÎÒÃÇÒª½«ÒÔÏÂÁ½¸öÎļþÖÆ×÷³É¿âÎļþ add.cint add(int x,int y){ return x+y;}int sub(int x,int y){ return x-y;}add.hint add(int x,int y);int sub(int x,int y);4. ÖÆ×÷¾²Ì¬¿â²¢Ê¹ÓÃÐèÒª°Ñ add.c ±àÒë³É.oÎļþgcc -c add.cʹÓà ar ÏÂÁîÌìÉú¾²Ì¬¿âlibadd.aar -rc libadd.a add.o ×ñÕÕ¾²Ì¬¿âÃüÃûµÄ¹æÔò lib + Ãû×Ö + .aʹÓþ²Ì¬¿â ÒªÊÇÓþ²Ì¬¿âlibadd.aÖ»ÐèÒª°üÀ¨add.h,¾Í¿ÉÒÔʹÓú¯Êýadd()¡¢sub()#include #include "add.h"void main(){ printf("add(5,4) is %d\n",add(5,4)); printf("sub(5,4) is %d\n",sub(5,4));}¾²Ì¬¿âµÄÎļþ¿ÉÒÔ·ÅÔÚí§ÒâµÄλÖñàÒëʱֻÐèÒªÕÒµ½¸Ã¿âÎļþ¼´¿Égcc test.c -o run libadd.a¿âºÍÍ·ÎļþÈôÊÇÔÚÆäËûĿ¼ÏÂʹÓÃÒ»ÏÂÏÂÁî±àÒ룺gcc -c -I /home/xxxx/include test.c //¼ÙÉètest.cҪʹÓöÔÓ¦µÄ¾²Ì¬¿âgcc -o test -L /home/xxxxx/lib test.o libadd.a»òÕßgcc -c -I /home/xxxx/include -L /home/xxxxx/lib libadd.a test.c1£©. ͨ¹ý-I(ÊÇ´ói)Ö¸¶¨¶ÔÓ¦µÄÍ·Îļþ 2£©. ͨ¹ý-LÖÆ¶©¿âÎļþµÄ·¾¶,libadd.a¾ÍÊÇÒªÓõľ²Ì¬¿â 3£©. ÔÚtest.cÖÐÒª°üÀ¨¾²Ì¬¿âµÄÍ·Îļþ5. ÖÆ×÷¶¯Ì¬¿â²¢Ê¹ÓðÑadd.c±àÒë³É¶¯Ì¬Á´½Ó¿âlibadd.sogcc -fPIC -o libadd.o -c add.cgcc -shared -o libadd.so libadd.oÒ²¿ÉÒÔÖ±½ÓʹÓÃÒ»ÌõÏÂÁîgcc -fPIC -shared -o libadd.so add.c¶¯Ì¬¿âµÄ×°Öà ͨ³£¶¯Ì¬¿â¿½±´µ½/libϼ´¿É£ºsudo cp libadd.so /libʹÓö¯Ì¬¿â#include #include "add.h"void main(){ printf("add(5,4) is %d\n",add(5,4)); printf("sub(5,4) is %d\n",sub(5,4));}±àÒ붯̬¿â£ºgcc static -o run -ladd×¢ÖØÊÓ²ì±àÒëʱ¶¯Ì¬¿âµÄÃû×ÖÓë¿âÎļþ¶ÔÓ¦¹ØÏµlibadd.so<--------->-laddÈ¥µô .so, lib¼ò»¯³ÉlÆäËû×Öĸ±£´æ6. ¶¯Ì¬¼ÓÔØµÄº¯Êý¿âDynamically Loaded (DL) Libraries¶¯Ì¬¼ÓÔØµÄº¯Êý¿âDynamically loaded (DL) librariesÊÇÒ»ÀຯÊý¿âËü¿ÉÒÔÔÚ³ÌÐòÔËÐÐÀú³ÌÖеÄÈκÎʱ¼ä¼ÓÔØËüÃÇÌØÊâÊʺÏÔÚº¯ÊýÖмÓÔØÒ»Ð©Ä£¿éºÍpluginÀ©Õ¹Ä£¿éµÄ³¡ºÏÓÉÓÚËü¿ÉÒÔÔÚµ±³ÌÐòÐèҪij¸öpluginÄ£¿éʱ²Å¶¯Ì¬µÄ¼ÓÔØLinuxϵͳÏÂDLº¯Êý¿âÓëÆäËûº¯Êý¿âÔÚÃûÌÃÉÏûÓÐÌØÊâµÄÇø±ðËüÃǽ¨ÉèµÄʱ¼äÊDZê×¼µÄobjectÃûÌÃÖ÷ÒªµÄÇø±ð¾ÍÊÇÕâЩº¯Êý¿â²»ÊÇÔÚ³ÌÐòÁ´½ÓµÄʱ¼ä»òÕ߯ô¶¯µÄʱ¼ä¼ÓÔØ¶øÊÇͨ¹ýÒ»¸öAPIÀ´·¿ªÒ»¸öº¯Êý¿âѰÕÒ·ûºÅ±í´¦Öóͷ£¹ýʧºÍ¹Ø±Õº¯Êý¿âͨ³£CÓïÑÔÇéÐÎÏÂÐèÒª°üÀ¨Õâ¸öÍ·Îļþdlopen()dlopenº¯Êý·¿ªÒ»¸öº¯Êý¿âÈ»ºóΪºóÃæµÄʹÓÃ×ö×¼±¸CÓïÑÔÔÐÍÊÇ£º void * dlopen(const char *filename, int flag); ²ÎÊýfilenameÈôÊÇÎļþÃûfilenameÊÇÒÔ/¿ªÍ·Ò²¾ÍÊÇʹÓþø¶Ô·¾¶ÄÇôdlopne¾ÍÖ±½ÓʹÓÃËü¶ø²»È¥²éÕÒijЩÇéÐαäÁ¿»òÕßϵͳÉèÖõĺ¯Êý¿âËùÔÚµÄĿ¼Á˲»È»dlopen£¨£©¾Í»áƾ֤ÏÂÃæµÄÐò´Î²éÕÒº¯Êý¿âÎļþ£º1. ÇéÐαäÁ¿LD_LIBRARYÖ¸Ã÷µÄ·¾¶2. /etc/ld.so.cacheÖеĺ¯Êý¿âÁбí3. /libĿ¼Ȼºó/usr/libһЩºÜÀϵÄa.outµÄloaderÔòÊǽÓÄÉÏà·´µÄÐò´ÎÒ²¾ÍÊÇÏȲé /usr/libÈ»ºóÊÇ/libflagµÄÖµ±ØÐèÊÇRTLD_LAZY»òÕßRTLD_NOWRTLD_LAZYµÄÒâ˼ÊÇresolve undefined symbols as code from the dynamic library is executed¶øRTLD_NOWµÄ¼ÄÒåÊÇresolve all undefined symbols before dlopen() returns and fail if this cannot be done'·µ»ØÖµdlopen£¨£©º¯ÊýµÄ·µ»ØÖµÊÇÒ»¸ö¾ä±úÈ»ºóºóÃæµÄº¯Êý¾Íͨ¹ýʹÓÃÕâ¸ö¾ä±úÀ´×ö½øÒ»²½µÄ²Ù×÷ÈôÊÇ·¿ªÊ§°Üdlopen()¾Í·µ»ØÒ»¸öNULLÈôÊÇÒ»¸öº¯Êý¿â±»¶à´Î·¿ªËü»á·µ»ØÍ¬ÑùµÄ¾ä±ú ÈôÊÇÓкü¸¸öº¯Êý¿âËüÃÇÖ®¼äÓÐһЩÒÀÀµ¹ØÏµµÄ»°ÀýÈçXÒÀÀµYÄÇôÄã¾ÍÒªÏȼÓÔØÄÇЩ±»ÒÀÀµµÄº¯Êý ÀýÈçÏȼÓÔØYÈ»ºó¼ÓÔØXdlerror()ͨ¹ýŲÓÃdlerror()º¯ÊýÎÒÃÇ¿ÉÒÔ»ñµÃ×îºóÒ»´ÎŲÓÃdlopen()dlsym()»òÕßdlclose£¨£©µÄ¹ýʧÐÅÏ¢dlsym()ÈôÊÇÄã¼ÓÔØÁËÒ»¸öDLº¯Êý¿â¶ø²»È¥Ê¹ÓÃËäÈ»ÊDz»¿ÉÄܵÄÁËʹÓÃÒ»¸öDLº¯Êý¿âµÄ×îÖ÷ÒªµÄÒ»¸öº¯Êý¾ÍÊÇdlsym()Õâ¸öº¯ÊýÔÚÒ»¸öÒѾ·¿ªµÄº¯Êý¿âÄÚÀï²éÕÒ¸ø¶¨µÄ·ûºÅÕâ¸öº¯ÊýÈçϽç˵£º void * dlsym(void *handle, char *symbol);²ÎÊýhandle¾ÍÊÇÓÉdlopen·¿ªºó·µ»ØµÄ¾ä±úsymbolÊÇÒ»¸öÒÔNIL×îºóµÄ×Ö·û´®¹¦Ð§£ºÈôÊÇdlsym()º¯ÊýûÓÐÕÒµ½ÐèÒª²éÕÒµÄsymbolÔò·µ»ØNULLÈôÊÇÄãÖªµÀij¸ösymbolµÄÖµ²»¿ÉÄÜÊÇNULL»òÕß0ÄÇô¾ÍºÜºÃÄã¾Í¿ÉÒÔÆ¾Ö¤Õâ¸ö·µ»ØÐ§¹ûÅжϲéÕÒµÄsymbolÊÇ·ñ±£´æÁË£»²»¹ýÈôÊÇij¸ösymbolµÄÖµ¾ÍÊÇNULLÄÇôÕâ¸öÅжϾÍÓÐÎÊÌâÁ˱ê×¼µÄÅжÏÒªÁìÊÇÏÈŲÓÃdlerror()ɨ³ýÒÔǰ¿ÉÄܱ£´æµÄ¹ýʧȻºóŲÓÃdlsym£¨£©À´»á¼ûÒ»¸ösymbolÈ»ºóÔÙŲÓÃdlerror£¨£©À´ÅжÏÊÇ·ñ·ºÆðÁ˹ýʧdlclose()dlopen()º¯ÊýµÄ·´Àú³Ì¾ÍÊÇdlclose£¨£©º¯Êýdlclose£¨£©º¯ÊýÓÃÁ¦¹Ø±ÕÒ»¸öDLº¯Êý¿â Dlº¯Êý¿âά³ÖÒ»¸ö×ÊԴʹÓõļÆÊýÆ÷µ±Å²ÓÃdlcloseµÄʱ¼ä¾Í°ÑÕâ¸ö¼ÆÊýÆ÷µÄ¼ÆÊý¼õÒ»ÈôÊǼÆÊýÆ÷Ϊ0ÔòÕæÕýµÄÊͷŵôÕæÕýÊͷŵÄʱ¼äÈôÊǺ¯Êý¿âÄÚÀïÓÐ_fini()Õâ¸öº¯ÊýÔò×Ô¶¯Å²ÓÃ_fini£¨£©Õâ¸öº¯Êý×öһЩÐëÒªµÄ´¦Öóͷ£ Dlclose£¨£©·µ»Ø0ÌåÏÖÀֳɯäËû·Ç0ÖµÌåÏÖ¹ýʧ¾ÙÀý#include #include void main(){ int (*add)(int x,int y); int (*sub)(int x,int y); void *libptr; libptr=dlopen("./libadd.so",RTLD_LAZY); //¼ÓÔØ¶¯Ì¬¿â add=dlsym(libptr,"add"); //»ñÈ¡º¯ÊýµØÖ· sub=dlsym(libptr,"sub"); printf("add(5,4) is %d\n",add(5,4)); printf("sub(5,4) is %d\n",sub(5,4)); dlclose(libptr);}ËÄ¡¢¿âµÄÁ½¸öÉó²éÏÂÁîÉó²éÒÀÀµ¿âÏÂÁîlddʹÓÃlddÏÂÁî¿ÉÒÔÉó²éÒ»¸ö¿ÉÖ´ÐгÌÐòÒÀÀµÄÄЩ¿âÕâ¸öÏÂÁîºÜÊÇÓÐÓÃÏÖʵÊÂÇéÖо³£»áÒ»Ö±ÖÖÖÖ¿â¶øÓÐЩ³ÌÐòµÄÖ´ÐÐÐèÒªÒÀÀµºÃ¼¸ÖÖ¿âÖÖÖÖ¿âµÄ°æ±¾ÓÖÐí¶àÀúÊ·°æ±¾¾³£»á·ºÆð¿â²»¼æÈݵÄÇéÐÎÎÒÃÇÐèҪƾ֤ÏÖÕæÏàÐÎÊʵ±µÄ½µµÍ°æ±¾»òÕßÉý¼¶°æ±¾ÀýÈ磺¿ÉÒÔ¿´µ½Ï߳̿âlibpthread-2.23.soÒÀÀµÓÚlibc¿âºÍld-linux¿ânmnm¹¤¾ß¿ÉÒÔ´òÓ¡³ö¿âÖеÄÉæ¼°µ½µÄËùÓзûºÅ,ÏÂÃæÊÇÎÒÃÇÉó²éÎÒÃǽ¨ÉèµÄ¶¯Ì¬¿âlibadd.a£ºnmÎå¡¢¿âµÄ×°ÖÃÔÚÐÂ×°ÖÃÒ»¸ö¿âÖ®ºóÔõÑùÈÃϵͳÄܹ»ÕÒµ½ËûÓÐÒÔϼ¸ÖÖÒªÁ죺1. ¿½±´µ½/lib»òÕß/usr/libÏÂÈôÊÇ×°ÖÃÔÚ/lib»òÕß/usr/libÏÂÄÇôldĬÈÏÄܹ»ÕÒµ½ÎÞÐèÆäËû²Ù×÷ ÈôÊÇ×°ÖÃÔÚÆäËûĿ¼ÐèÒª½«ÆäÌí¼Óµ½/etc/ld.so.cacheÎļþÖа취ÈçÏÂ2.ͨ¹ýÉèÖÃÎļþ/etc/profileÓÀÊÀÉúЧµÄÇéÐαäÁ¿ÉèÖñà¼/etc/profile¼´¿É vi /etc/profileÔÚÎļþÀïĩβ¼ÓÉ϶ÔÓ¦µÄÇéÐαäÁ¿ÐÅÏ¢¶¯Ì¬¿âÇéÐαäÁ¿ÉèÖãºexport LD_LIBRARY_PATH=/home/peng/mylib//home/peng/mylib/Ö¸µÄÊǶ¯Ì¬¿âÎļþ¼ÐËùÔÚλÖü´.soµÈÎļþÔÚ/home/peng/mylib/ϱà¼Íê³ÉÉúÑı༲¢Í˳ö; ʹÉèÖü´Ê±ÉúЧ£ºsource /etc/profile3./etc/ld.so.conf±à¼/etc/ld.so.confÎļþ¼ÓÈë¿âÎļþËùÔÚĿ¼µÄ·¾¶vim /etc/ld.so.confÔÚÄÚÀïÌí¼Ó¶¯Ì¬¿âËùÔÚ·¾¶¼´¿ÉÀýÈç/usr/local/lib/ÔËÐÐldconfig¸ÃÏÂÁî»áÖØÐÞ/etc/ld.so.cacheÎļþÆß¡¢³£¼û¿âµÄÒÆÖ²1.jpeg¿â,ÓÃÓÚjpegͼÏñ´¦Öóͷ£ÏÂÔØµØÖ·£ºhttp://www.ijg.org/files/½âѹtar xvzf jpegsrc.v6b.tar.gzcd jpeg-6bÌìÉúMakefile./configure --host=arm-linux-gnueabihf --prefix=$PWD/temp_install±àÒë ×°Öà make make install×¢ÖØÕâ¸ö¿âµÄ×°ÖóÌÐòÓÐBUG,²»»á×Ô¶¯½¨ÉèÐû²¼µÄlib,include,manµÈ,Òò´ËÒªÊÖ¹¤½¨Éè,Òª²»ÏÈ°ÑÆäËü¿â×öºÃ,ÔÙ×°ÖÃÕâ¸ö¿â mkdir -p /home/peng/jpeg-6b/temp_install/include mkdir -p /home/peng/jpeg-6b/temp_install/lib mkdir -p /home/peng/jpeg-6b/temp_install/man/man1 ¸ü¶àLinux֪ʶÇë¹Ø×¢ Ò»¿ÚLinux
¡¶´êÔèGay¡¤2020¡¤com-Ãâ·ÑÔĶÁС˵ÎÞµ¯´°È«±¾Ãâ·ÑÔĶÁ...¡·ÊÓÆµËµÃ÷£ºÓຼ³ÇͶ¼¯ÍŽ«È«Á¦ÒÔ¸°UÅÌÖаüÀ¨ÁË¿õê͵ÄÒÅÖö×ÖÀïÐмä³äÂúÁ˾øÍûºÍ±¯·ßËûÔÚÒÅÖöÖÐÏêϸÐÎòÁË×Ô¼ºµÄÐÄ·Àú³ÌÒÔ¼°µ¼ÖÂÕâÒ»±¯¾çµÄÖÖÖÖÔµ¹ÊÔÓÉ
»¤Ê¿Ð¡æ¤Å¤ÄóµÄÕ¾ÔÚÕÅСǿÉíǰÍû×ÅÔ¶´¦µÄǧ¶àÃûÕ¾ÔÚÔµØÒ»¶¯²»¶¯Èçµ¾²ÝÈËÒ»ÑùµÄÅ®ÈËÕÅСǿ¼«²»ÄÍÐĵÄ˵µÀ£º¡î¡î¡î¾Þз×ù¡ª¡ªÒëÕߣº»Ã¾õ
ÊÇÊÇÓÐÀÍÁîÀÉÁ˰¢ÀïÔÆÅÌÕâ»Ø¿ÉÕæÊÇÆÈÇлðÁǵØÃ¦ÉÏÁËÒ»Ìý˵ÄÇÇå¾²Îó²îµÄʶùËûÃÇÁ¢Âí¾ÍÐж¯ÁËÆðÀ´Ê²Ã´ÈÈÐÞ¸´¡¢½ôÆÈ²¹¶¡Ò»¹ÉÄÔ¶ùÈ«ÉÏÁ˾ÍΪÁ˸ø´ó»ï¶ù³Ô¿Å¶¨ÐÄÍèÕâËÙÂʼòÖ±±ÈÔÛÃÇÇÀºì°ü»¹¿ìÄØ