最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux動(dòng)態(tài)加載并調(diào)用動(dòng)態(tài)庫(kù)(.so)實(shí)現(xiàn)方式

 更新時(shí)間:2026年04月07日 08:56:27   作者:enjoy囂士  
本文介紹了加載動(dòng)態(tài)鏈接庫(kù)的過(guò)程以及引用計(jì)數(shù)機(jī)制,并詳細(xì)描述了頭文件中相關(guān)函數(shù)的作用,還提供了編譯動(dòng)態(tài)庫(kù)和主程序的命令,強(qiáng)調(diào)了鏈接選項(xiàng)的重要性

概念

加載動(dòng)態(tài)鏈接庫(kù),首先為共享庫(kù)分配物理內(nèi)存,然后在進(jìn)程對(duì)應(yīng)的頁(yè)表項(xiàng)中建立虛擬頁(yè)和物理頁(yè)面之間的映射。

你可以認(rèn)為系統(tǒng)中存在一種引用計(jì)數(shù)機(jī)制, 每當(dāng)一個(gè)進(jìn)程加載了共享庫(kù)(在該進(jìn)程的頁(yè)表中進(jìn)行一次映射),引用計(jì)數(shù)加一;

一個(gè)進(jìn)程顯式卸載(通過(guò)dlclose等)共享庫(kù)或進(jìn)程退出時(shí),引用計(jì)數(shù)減 一,當(dāng)減少到0時(shí),系統(tǒng)卸載共享庫(kù)。

頭文件

#include <dlfcn.h>

相關(guān)函數(shù)介紹

(1)打開(kāi)動(dòng)態(tài)鏈接庫(kù):dlopen

函數(shù)原型
void *dlopen (const char *filename, int flag);
flag:分為這兩種 
RTLD_NOW:在dlopen返回前,解析出全部沒(méi)有定義的符號(hào),解析不出來(lái)返回NULL。
RT_GLOBAL:動(dòng)態(tài)庫(kù)定義的符號(hào)可被其后打開(kāi)的其他庫(kù)解析。
RT_LOCAL:和上面相反,不能被其他庫(kù)解析。默認(rèn)。
RTLD_LAZY:暫緩決定,等有需要時(shí)再解出符號(hào)


返回值: 
打開(kāi)錯(cuò)誤返回NULL 
成功,返回庫(kù)引用 
dlopen用于打開(kāi)指定名字(filename)的動(dòng)態(tài)鏈接庫(kù)(最好文件絕對(duì)路徑),并返回操作句柄。

(2)取函數(shù)執(zhí)行地址:dlsym

函數(shù)原型
void *dlsym(void *handle, char *symbol); 
dlsym根據(jù)動(dòng)態(tài)鏈接庫(kù)操作句柄(handle)與符號(hào)(symbol),返回符號(hào)對(duì)應(yīng)的函數(shù)的執(zhí)行代碼地址。

(3)關(guān)閉動(dòng)態(tài)鏈接庫(kù):dlclose

函數(shù)原型
int dlclose (void *handle); 
returns 0 on success, and nonzero on error.
dlclose用于關(guān)閉指定句柄的動(dòng)態(tài)鏈接庫(kù),只有當(dāng)此動(dòng)態(tài)鏈接庫(kù)的使用計(jì)數(shù)為0時(shí),才會(huì)真正被系統(tǒng)卸載。

(4)動(dòng)態(tài)庫(kù)錯(cuò)誤函數(shù):dlerror

函數(shù)原型
const char *dlerror(void);
當(dāng)動(dòng)態(tài)鏈接庫(kù)操作函數(shù)執(zhí)行失敗時(shí),dlerror可以返回出錯(cuò)信息,返回值為NULL時(shí)表示操作函數(shù)執(zhí)行成功。

示例

#include <stdio.h>  
#include <dlfcn.h>  
  
int main(int argc, char **argv) {  
	void *handle;  
	double (*cosine)(double);  
	char *error;  
  
	handle = dlopen ("/tmp/libtest.so", RTLD_LAZY);  
	if (!handle) {  
		fprintf (stderr, "%s ", dlerror());  
		exit(1);  
	}  
  
	cosine = (double(*)(double))dlsym(handle, "cos");  
	if ((error = dlerror()) != NULL)  {  
		fprintf (stderr, "%s ", error);  
		exit(1);  
	}  
  
	printf ("%f ", (*cosine)(2.0));  
	dlclose(handle);  
	return 0;  
}  

編譯

編譯動(dòng)態(tài)庫(kù)命令:

g++ -o libtest.so -rdynamic -shared -fPIC test.cpp

編譯主程序命令:

g++ -o mainTest mainTest.cpp -rdynamic -ldl

注意要加-ldl 和 -rdynamic 鏈接選項(xiàng)

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 開(kāi)啟Selinux遇到的坑及解決

    開(kāi)啟Selinux遇到的坑及解決

    這篇文章主要介紹了開(kāi)啟Selinux遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 使用云服務(wù)器在CentOS系統(tǒng)中安裝.NET6.0

    使用云服務(wù)器在CentOS系統(tǒng)中安裝.NET6.0

    這篇文章介紹了使用云服務(wù)器在CentOS系統(tǒng)中安裝.NET6.0的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • foreman ubuntu16 快速安裝

    foreman ubuntu16 快速安裝

    foreman ubuntu16快速安裝,非常實(shí)用的方法,小編覺(jué)得很不錯(cuò),分享給大家,希望對(duì)大家有幫助
    2018-09-09
  • Nginx啟動(dòng)SSL功能,并進(jìn)行功能優(yōu)化詳細(xì)介紹

    Nginx啟動(dòng)SSL功能,并進(jìn)行功能優(yōu)化詳細(xì)介紹

    這篇文章主要介紹了Nginx啟動(dòng)SSL功能,并進(jìn)行功能優(yōu)化詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Linux中使用nfs共享存儲(chǔ)的方式

    Linux中使用nfs共享存儲(chǔ)的方式

    NFS是一種基于TCP/IP傳輸?shù)木W(wǎng)絡(luò)文件系統(tǒng)協(xié)議,通過(guò)使用NFS協(xié)議,客戶機(jī)可以像訪問(wèn)本地目錄一樣訪問(wèn)遠(yuǎn)程服務(wù)器中的共享資源,本文給大家介紹Linux中使用nfs共享存儲(chǔ)的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Apache為mysql以及自己的項(xiàng)目設(shè)置虛擬路徑

    Apache為mysql以及自己的項(xiàng)目設(shè)置虛擬路徑

    Apache為mysql以及自己的項(xiàng)目設(shè)置虛擬路徑
    2009-12-12
  • CentOS 7 搭建ntp時(shí)鐘服務(wù)器的步驟詳解

    CentOS 7 搭建ntp時(shí)鐘服務(wù)器的步驟詳解

    架設(shè)NTP服務(wù)器,是個(gè)相對(duì)比較簡(jiǎn)單的事情, 架設(shè)NTP服務(wù)器目的就是使各個(gè)工作站的時(shí)間統(tǒng)一,下面這篇文章主要給大家介紹了CentOS 7中搭建ntp時(shí)鐘服務(wù)器的步驟,需要的朋友可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-01-01
  • 詳解CentOS如何使用NTP同步時(shí)間服務(wù)器

    詳解CentOS如何使用NTP同步時(shí)間服務(wù)器

    在Linux系統(tǒng)中,時(shí)間同步對(duì)于各種應(yīng)用是非常關(guān)鍵的,例如,系統(tǒng)日志和許多監(jiān)控應(yīng)用程序都需要在多個(gè)服務(wù)器之間保持時(shí)間同步,NTP協(xié)議是一種常見(jiàn)的協(xié)議,它使得您可以在系統(tǒng)之間同步時(shí)間,下面我們將詳細(xì)討論CentOS如何使用NTP同步時(shí)間服務(wù)器,需要的朋友可以參考下
    2023-11-11
  • ubuntu服務(wù)器環(huán)境下安裝python的方法

    ubuntu服務(wù)器環(huán)境下安裝python的方法

    這篇文章主要介紹了ubuntu服務(wù)器環(huán)境下安裝python的方法,簡(jiǎn)單分析了Ubuntu環(huán)境下安裝Python的相關(guān)步驟、命令、與操作注意事項(xiàng),需要的朋友可以參考下
    2018-03-03
  • CentOS7部署Flask(Apache、mod_wsgi、Python36、venv)

    CentOS7部署Flask(Apache、mod_wsgi、Python36、venv)

    這篇文章主要介紹了CentOS7部署Flask(Apache、mod_wsgi、Python36、venv),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01

最新評(píng)論

凤冈县| 新建县| 榆林市| 隆德县| 天津市| 康定县| 苏尼特左旗| 临沂市| 镇江市| 新竹县| 大英县| 涞源县| 大余县| 海兴县| 青冈县| 嘉荫县| 永仁县| 黄大仙区| 白玉县| 闻喜县| 海兴县| 盱眙县| 扎赉特旗| 南汇区| 盘锦市| 金坛市| 鄂尔多斯市| 南城县| 沽源县| 留坝县| 弋阳县| 烟台市| 安福县| 怀柔区| 武鸣县| 田阳县| 肇源县| 敦化市| 台东市| 海丰县| 洛南县|