【php网页网盘源码】【golang框架源码分析】【网页图片飘浮源码】linux源码 dlopen
1.linux的.ko与.so文件
2.Linux cè°ç¨so
3.DelphiforLinuxä¸åºç¨å
±äº«å¯¹è±¡åº
linux的.ko与.so文件
在Linux系统中,.ko文件代表内核对象文件(Kernel Object),它是将内核功能移动至内核之外,需要时插入内核,php网页网盘源码不需要时卸载的一种方式。这种设计有两大优势:一是golang框架源码分析可以减小内核体积,二是使用方便。加载内核模块可通过两种方法实现:直接使用insmod命令执行加载操作,或先将模块拷贝至特定目录(基于内核版本的/lib/module/#uname-r#/),接着运行depmod生成依赖关系文件,最后调用modprobe进行加载。加载驱动模块后,通过lsmod命令查看已加载模块列表,网页图片飘浮源码使用rmmod命令卸载。与.so文件相比,.ko文件专门用于内核扩展功能。创建eth交易源码
.so文件则与C语言的动态链接库(Dynamic Link Library)相关联。在C语言编程中,动态库调用有两种主要方式:一种类似静态库调用,自动seo网站源码即通过头文件直接调用库中函数,程序启动时加载库文件;另一种则是通过dlopen和dlsym函数动态加载库,无需直接调用头文件,程序执行到指定位置时加载库文件。这种方式下,不需要在编译时指定库文件位置和名称,但在代码中需使用dlopen加载库,并使用dlsym根据符号查找函数地址。这两种方式各有优势,可根据项目需求灵活选择。
Linux cè°ç¨so
å®ä¾ä»£ç ï¼soTest.cï¼ï¼
1 #include <stdio.h>
2 #include <dlfcn.h>
3
4 int main(int argc, char *argv[]){
5 void * libm_handle = NULL;
6 float (*cosf_method)(float);
7 char *errorInfo;
8 float result;
9
// dlopen å½æ°è¿ä¼èªå¨è§£æå ±äº«åºä¸çä¾èµé¡¹ãè¿æ ·ï¼å¦ææ¨æå¼äºä¸ä¸ªä¾èµäºå ¶ä»å ±äº«åºç对象ï¼å®å°±ä¼èªå¨å è½½å®ä»¬ã
// å½æ°è¿åä¸ä¸ªå¥æï¼è¯¥å¥æç¨äºåç»ç API è°ç¨
libm_handle = dlopen("libm.so", RTLD_LAZY );
// å¦æè¿å NULL å¥æï¼è¡¨ç¤ºæ æ³æ¾å°å¯¹è±¡æ件ï¼è¿ç¨ç»æãå¦åçè¯ï¼å°ä¼å¾å°å¯¹è±¡çä¸ä¸ªå¥æï¼å¯ä»¥è¿ä¸æ¥è¯¢é®å¯¹è±¡
if (!libm_handle){
// å¦æè¿å NULL å¥æ,éè¿dlerroræ¹æ³å¯ä»¥åå¾æ æ³è®¿é®å¯¹è±¡çåå
printf("Open Error:%s.\n",dlerror());
return 0;
}
// ä½¿ç¨ dlsym å½æ°ï¼å°è¯è§£ææ°æå¼ç对象æ件ä¸ç符å·ãæ¨å°ä¼å¾å°ä¸ä¸ªææçæå该符å·çæéï¼æè æ¯å¾å°ä¸ä¸ª NULL 并è¿åä¸ä¸ªé误
cosf_method = dlsym(libm_handle,"cosf");
errorInfo = dlerror();// è°ç¨dlerroræ¹æ³ï¼è¿åé误信æ¯çåæ¶ï¼å åä¸çé误信æ¯è¢«æ¸ 空
if (errorInfo != NULL){
printf("Dlsym Error:%s.\n",errorInfo);
return 0;
}
// æ§è¡âcosfâæ¹æ³
result = (*cosf_method)(0.0);
printf("result = %f.\n",result);
// è°ç¨ ELF 对象ä¸çç®æ å½æ°åï¼éè¿è°ç¨ dlclose æ¥å ³é对å®ç访é®
dlclose(libm_handle);
return 0;
}
å¨è¿ä¸ªä¾åä¸ä¸»è¦æ¯è°ç¨äº math åºï¼libm.soï¼ä¸çâcosfâå½æ°ï¼dlopenå½æ°ç第äºä¸ªåæ°è¡¨ç¤ºå è½½åºæ件ç模å¼ï¼ä¸»è¦æ两ç§ï¼RTLD_LAZY æç¼å³å®ï¼çæéè¦æ¶å解åºç¬¦å·ï¼RTLD_NOW ç«å³å³å®ï¼è¿åå解é¤æææªå³å®ç符å·ãå¦å¤è®°å¾å¼ç¨å å«APIç头æ件â#include <dlfcn.h>âï¼^_^ï¼ã
DelphiforLinuxä¸åºç¨å ±äº«å¯¹è±¡åº
æ¬æç¨éä¿ææçè¯è¨ä»ç»Linuxå¹³å°ä¸å ±äº«å¯¹è±¡åºï¼SOï¼çåºæ¬æ¦å¿µå主è¦ä¼ç¹ éè¿åæå¨Delphi for Linuxä¸åºç¨SOä¸å¨Delphi for Windowsä¸åºç¨DLLçå¼å 以ç¼ç¨å®ä¾è®²è¿°äºLinuxå¹³å°çSOåºæ件çç»æ SOåºæ件çå½æ°éè½½ ç¹æ®ç¼è¯æ令 éç¨Delphi for Linuxå建SOçç¼ç¨è§å 使ç¨åçLinuxç³»ç»è®¾ç½® 以åå¨Delphi for Linuxä¸ç¨éå¼ææ¾å¼é¾æ¥æ¹æ³è£ å ¥å使ç¨SOå½æ°çåºæ¬æ¹æ³ ç»éªåæå·§ 并对åºç¨SOå¯è½åºç°çé®é¢è¿è¡äºæ¢è®¨ååæ ããããå ±äº«å¯¹è±¡åºåºæ¬æ¦å¿µããDelphi for Linuxæ¯Borlandå ¬å¸æ¨åºçåºäºLinuxå¹³å°ç é¢å对象çå¯è§åå¼åå·¥å · æ¯ç®åLinuxå¹³å°ä¸å¾å¥½çåºç¨å¼åå·¥å · Delphi for Linuxä¹ç§°Kylix 大家ç¨Kylixå¼åLinuxåºç¨ç¨åºæ¶ å¯è½ä½¿ç¨è¿Linuxæä½ç³»ç»æ¬èº«å¸¦ç大éSOæ件 SOæ¯ä¸ç§ç¹æ®çè¿è¡æ件 å å«è¥å¹²æ¹æ³ 对象åèµæº å®ä¸è½ç´æ¥è¿è¡ ä½å¯ä»¥è¢«Kylixåºç¨ç¨åºæå ¶å®å¯æ§è¡æ件å¨æè°ç¨ SOæ件æ©å±å为 so ç¼è¯åæºæ件æ©å±å为 dpr æ¬ææ举ä¾ååå¨Red Hat Linux åKylix ç¯å¢ä¸è°è¯ç¼è¯éè¿ å¹¶å¯æ£å¸¸è¿è¡ ããããå¾ æ¯Kylix主ç¨åºä¸SOåºçå±æ¬¡å ³ç³»å¾ ä»ä¸å¯çåºä½¿ç¨SOåºæ以ä¸å 个ä¼ç¹ ãã ãã å¾ Kylix主ç¨åºä¸SOåºçå±æ¬¡å ³ç³»å¾ ããããâ å¤ä¸ªKylixç¨åºæå®çå¤ä¸ªåå æ件å¯éè¿æ¥å£å ±ç¨ä¸ä¸ªSOåºæ件 å¦ä¸æ¹é¢ æä¸ä¸ªKylixç¨åº å¯éè¿å¤ä¸ªæ¥å£ä½¿ç¨å¤ä¸ªSOåºæ件 è¿æ · SOåæä¸ç§å¯å ±ç¨çèµæº å®ç°çæ£ç èµæºå ±äº« 大大缩å°äºKylixåºç¨ç¨åºçæ§è¡ä»£ç å¢å¼ºäºè½¯ä»¶çå¯éç¨æ§ ããããâ å°SOæ件ä½ä¸ºKylixåºç¨ç¨åºçå ¬å ±è°ç¨æ¨¡åè®¾è®¡æ¶ ç±äºå ¶ç¬ç«äºåºç¨ç¨åº 软件å级æ¶åªéä¿®æ¹SOåºæ件åç¼è¯SO æ éæ´æ¹åéç¼è¯Kylixåºç¨ä¸»ç¨åº ããããâ ä¸ä» å¯ä½¿ç¨Kylixç¼åSOåº è¿å¯ä½¿ç¨CæC++ç常ç¨è¯è¨æ¥ç¼å åªè¦éµå¾ªç¹å®çæ¥å£è§è ããããå ±äº«å¯¹è±¡åºçå建ãã SOåºæ件çææããããSOåºæ件åKylixæ ååå æ件çå é¨ç»æåºæ¬ç¸å ä¹æ声æ å®ç°ååå§åé¨å åºå«ä¹ä¸å¨äºSOåºåªæ¯å ¶å®ç¨åºå¯ä»¥è°ç¨çæ¹æ³(å æ¬å½æ°åè¿ç¨)éå åºå«ä¹äºåºç¨åºä»¥libraryå ³é®åèéprojectå¼å¤´å¯å¨å ¶é¡¹ç®æ件 åºç¨åºå å«æexportsè¯å¥ å ¶ååºè¦åå¤é¨æä¾ç导åºå½æ°åè¿ç¨ ä¸é¢æ¯SOåºæ件代ç çç®åä¾å ç¨ä»¥è¯´æå ¶ææ ããããlibrary MyFirstSO ããusesãããSysUtils classes { Delphi for Windows ä¸å¼ç¨ç±»åºä¸ºWindows }ããfunction Add (A Char B Char) Integer cdecl overload ããbeginãããResult := Ord (A) + Ord (B) ããend ããfunction Add (A Integer B Integer) Integer cdecl overload ããbeginãããResult := A + B ããend ããfunction Double (N Integer) Integer cdeclããbeginãããResult := N * ããend;ããexportsãããAdd (A Integer B Integer) ãããAdd (A Char B Char) name AddChar ãããDouble ãããã SOåºæ件ä¸çå½æ°éè½½ããããSOåºä¹å¯ä»¥ä½¿ç¨éè½½å½æ°ï¼å³å¤ä¸ªå½æ°ä½¿ç¨ç¸åå称 ä¸ååæ°ï¼ 使ç¨æ¶éå¨éè½½çå½æ°å£°æåæ ä¸overloadæ令 Kylixå¯ä»¥ç¨åå称导åºä¸ä¸ªéè½½å½æ° å¨exportsä»å¥ä¸è¡¨ç¤ºå ¶åæ°è¡¨ è¥è¦å¯¼åºå¤ä¸ªéè½½å½æ° åè¦å¨exportsä»å¥ä¸ç¨nameåå¥æå®ä¸åå称 以åºå«éè½½ è¿å¯ä»ä¸é¢çä¾åMyFirstSOä¸çåº Addæ¯éè½½å½æ° 为è°ç¨æ¶åºå ä¸ä¸ªç¨åå½æ°å£°æAddå¯¼åº å¦ä¸ä¸ªç¨AddCharå¯¼åº ãããã SOåºçç¹æ®ç¼è¯æ令ããããç¼è¯åçæçSOåºè¿è¡æ件使ç¨libåç¼å soæ©å±å èèå°å®é å½åè§åä¸çæ¬åæ¯æ符å·é¾ Kylixå¨Object Pascalè¯è¨ä¸å¼å ¥äºå 个ç¹æ®ç¼è¯æ令 è¿äºå¨Delphiä¸æ²¡æä»ä¹æä¹ åºæºæ件MyFirstSO dprç¼è¯å产ççæ§è¡æ件为libMyFirstSO so ããããâ $SOPREFIX æ¹åå称åç¼ é»è®¤ä¸ºlibï¼æ£å¸¸åºï¼æbplï¼Kylixå ï¼ ç¨åç¼åºå«ä¸¤ç§åºæ¯å 为Linuxçåºç¨åä¸æ©å±ï¼ soï¼ ããããâ $SOSUFFIX å¨åºåä¸æ©å±åä¹é´å¢å ææ¬ æå®çæ¬æå ¶å®ä¿¡æ¯ ããããâ $SOVERSION å¨æ©å±åä¹åå¢å çæ¬å· ããããâ $SONAME 表示ç¸å ³ç¬¦å·é¾å ç±ç¼è¯å¨èªå¨çæ ããããä¾å¦ ä¸å代ç çæåºlibsimple so å符å·é¾libsimple so ããããlibrary simple ããusesããSysUtils Classes ãã//å½æ°å®ä¹çç¥ãã{ $SOVERSIONã }ãã{ $SONAMEã libsimple so }ããããå ±äº«å¯¹è±¡åºç使ç¨ããKylixåºç¨ç¨åºä½¿ç¨SOåºæ¶ å¯ä»¥éç¨ä¸¤ç§æ¹å¼ ä¸ç§æ¯éå¼é¾æ¥ï¼Implicit linkingï¼ ä¹ç§°éæè£ å ¥ å¦ä¸ç§æ¯æ¾å¼é¾æ¥ï¼Explicit Linkingï¼ ä¹ç§°å¨æè£ å ¥ ä¸é¢åå«ä»ç»è¿ä¸¤ç§é¾æ¥æ¹å¼ç使ç¨æ¹æ³ æå·§åå°çªä½å¯¹è±¡æ¾å ¥SOåºçææ¯ ãããã 使ç¨åçç³»ç»è®¾ç½®ããããèªå®ä¹SOåºå»ºå¥½å Kylixåºç¨ç¨åºè°ç¨æ¶ä¼æ¥é è¿æ¯å 为Kylixæ¾ä¸å°æ°å»ºåº å¿ é¡»å¯¹ç³»ç»è¿è¡ç¸å ³è®¾ç½® è¿ä¸å¨Delphi for Windowsä¸ä½¿ç¨DLLåºä¸å DLLåºå»ºå¥½ååªéå°ç¼è¯åçDLLæ件æ¾å°Delphi主ç¨åºç®å½ä¸å³å¯ä½¿ç¨ æä½æ¥éª¤å¦ä¸ ããããâ å°ç¼è¯å¥½çSOåºæ件æ¾å°Linuxç³»ç»åºç®å½/libæ/usr/libä¸ æè å¨Linuxç³»ç»åºè·¯å¾shellåéLD_LIBRARY_PATHä¸å å ¥èªå®ä¹SOåºæ件æå¨è·¯å¾ ããããâ å¨æ ¹ç¨æ·ï¼rootï¼ä¸ ç¨ldconfigå½ä»¤å·æ°åºç¼å²åº ããããâ 对Kylixæ§è¡æ件使ç¨lddå½ä»¤ æ¥ç该ç¨åºæå ³èçSOåº ãããã éå¼é¾æ¥ããããéå¼é¾æ¥æ¯æå¨åºç¨ç¨åºå¼å§æ§è¡æ¶å°±å°SOåºæ件å è½½å°åºç¨ç¨åºä¸ å®ç°éå¼é¾æ¥å¹¶ä¸é¾ åªéå¨åºç¨ç¨åºä¸å å ¥åºå½æ°ç声æè¯å¥ååºçexternalå®ä¹ä»å¥ ååºå½æ°å¯ä»¥åä¸è¬å±é¨å½æ°ä¸æ ·ä½¿ç¨ æ¯å¦ è¦ä½¿ç¨libMyFirstSO soä¸çAddå½æ° ååªè¦å¨åºç¨ç¨åºä¸å¢å ä¸é¢è¯å¥ ããããfunction Add (A Integer B Integer) Integer cdecl ããããexternal libMyFirstSO so ãããã æ¾å¼é¾æ¥ããããæ¾å¼é¾æ¥æ¯åºç¨ç¨åºå¨æ§è¡è¿ç¨ä¸å¯æ ¹æ®å®é éè¦éæ¶å è½½SOåºæ件 ä¹å¯ä»¥éæ¶å¸è½½SOåºæ件 è¿å¯å¨è¿è¡æ¶è¿è¡SOåºçåæ¢ èè¿äºæ¯éå¼é¾æ¥æ æ³åå°ç ä¸éå¼é¾æ¥ç¸æ¯ æ¾å¼é¾æ¥å ·ææ´å¤§ççµæ´»æ§ ããããå¨Kylixä¸ è¦å¨æè£ å ¥åºåè°ç¨å¯¼åºå½æ°å¯ä»¥ç¨Delphi仿ç代ç æèªç¶Linuxæ¹æ³ ä¸é¢åå«ä»ç»è¿ä¸¤ç§æ¹æ³ ãããã( )ç¨Delphi仿ç代ç å¨æè£ å ¥ããããå¨Windowsä¸å¨æè£ å ¥DLLæ¯ç¨Windows APIå½æ°âLoadLibraryæDelphiæä¾çSafeLoadLibraryå½æ°å®æç æ¾å°åºå ç¨åºè°ç¨Windows APIå½æ°âGetProcAddressæç´¢DLL导åºå½æ° è¥æ¾å°å¹é åè¿åæ请æ±å½æ°æé 并å°è¿ä¸ªå½æ°æé转æ¢æéå½ç±»ååè°ç¨ 使ç¨å®åè°ç¨FreeLibrary ä»å åä¸éæ¾åº ããããKylixä¸ä½¿ç¨Pascal RTL仿çå½æ°å®ç°SOåºå¨æè£ å ¥ ä¸é¢çä¾ååªååºKylixåºç¨ç¨åºä¸ä¸å¨æé¾æ¥ç¸å ³é¨å èéå®æ´Kylixåå æ件代ç ããããunit DynaForm;ããinterfaceããusesããSysUtils Classes Qcontrols Qforms ããtypeãããTForm = class(TForm)ããButton : TButton;ããprocedure Button Click(Sender: TObject);ããend;ããvarãForm TForm ããimplementationãã{ $R * XFM}ããtypeãTComputeInteger = function (x Integer y Integer) Integer cdecl ãã//è°ç¨åºå½æ°æ¥å£ç±»åå®ä¹ããprocedure TForm Button Click(Sender TObject) ããvar Handle Thandle ããCompute TputeInteger ããbeginãããHandle:ï¼LoadLibrary( libMyFirstSO so ) //å¨æè£ å ¥åºãããif Handle<> then //æ¾å°åºãããbeginããCompute:ï¼TputeInteger(GetProcAddress(Handle Add ) ãã//æç´¢åºå½æ°Add 并è¿åå½æ°æéããif Assigned(Compute) thenããã ShowMessage(IntToStr(Compute( )) //使ç¨åºå½æ°ããFreeLibrary(Handle) //éæ¾åºãããendãããelseããShowMessage( Library not found ) ããend ãããã( )ç¨Linuxèªç¶ä»£ç å¨æè£ å ¥ããããä¹å¯ä»¥ä½¿ç¨Libcç³»ç»åå ä¸çä½çº§Linuxå½æ° è¿æ ·å¯ä½¿ç¨æ´å¤åæ° æ´å¥½å°æ§å¶ç³»ç» 使ç¨çLinuxå½æ°åå«ä¸ºdlopen(æå¼å¹¶è£ å ¥åºå½æ°) dlsym(æç´¢åºå½æ°) dlclose(éæ¾åº) å æ¤ ä¸ä¾ä¸è°ç¨åºç代ç å为 ããããprocedure TForm Button Click(Sender TObject) ããvar Handle Pointer ããCompute TputeInteger ããbeginãããHandle:ï¼dlopen( libMyFirstSO so ) //å¨æè£ å ¥åºãããif Handle<>nil then //æ¾å°åºãããbeginããCompute:ï¼TputeInteger(dlsym(Handle Add ) ãã//æç´¢åºå½æ°Add 并è¿åå½æ°æéããif Assigned(Compute) thenããã ShowMessage(IntToStr(Compute( )) //使ç¨åºå½æ°ããdlclose(Handle) //éæ¾åºãããendãããelseããShowMessage( Library not found ) ããend ãããã( )SOåºä¸çªä½å¯¹è±¡ç使ç¨ããããé¤äºå å«å½æ°åè¿ç¨çåºä¹å¤ è¿å¯ä»¥å°Kylix建ç«ççªä½æ¾å¨å ±äº«å¯¹è±¡ä¸ è¿å¯ä»¥æ¯å¯¹è¯æ¡æå ¶å®çªä½ ããããçææ°çåºå¯¹è±¡ä¹å åªè¦å¨åºæºæ件ç声æé¨åå¢å 对çªä½åå æ件 lishixinzhi/Article/program/Delphi//