Linux下的動態鏈結庫 so檔案的使用

2021-06-21 13:57:19 字數 2005 閱讀 5583

大家都知道,在windows系統中有很多的動態鏈結庫(以.dll為字尾的檔案,dll即dynamic link library)。這種動態鏈結庫,和靜態函式庫不同,它裡面的函式並不是執行程式本身的一部分,而是根據執行程式需要按需裝入,同時其執行**可在多個執行程式間共享,節省了空間,提高了效率,具備很高的靈活性,得到越來越多程式設計師和使用者的青睞。那麼,在linux系統中有無這樣的函式庫呢? 答案是肯定的,linux的動態鏈結庫不僅有,而且為數不少。在/lib目錄下,就有許多以.so作字尾的檔案,這就是linux系統應用的動態鏈結庫,只不過與windows叫法不同,它叫so,即shared object,共享物件。

生成動態鏈結庫:  如:

gcc  -fpic -shared -o example.so  example1.c example2.c   

-fpic 使輸出的物件模組是按照可重定位位址方式生成的。

-shared指定把對應的原始檔生成對應的動態鏈結庫檔案libstr.so檔案。 

linux下使用動態鏈結庫,源程式需要包含dlfcn.h標頭檔案,此檔案定義了呼叫動態鏈結庫的函式的原型。下面詳細說明一下這些函式。

3.1.1 dlerror

原型:const

char*dlerror(void);  

作用:當動態鏈結庫操作函式執行失敗時,dlerror可以返回出錯資訊,返回值為null時表示操作函式執行成功。

3.1.2 dlopen

原型:void*dlopen (const

char*filename,intflag);  

作用:dlopen用於開啟指定名字(filename)的動態鏈結庫,並返回操作控制代碼。

引數說明:

filename: so檔名.如果名字不以/開頭,則非絕對路徑名,將按下列先後順序查詢該檔案。

(1) 使用者環境變數中的ld_library值;

(2) 動態鏈結緩衝檔案/etc/ld.so.cache

(3) 目錄/lib,/usr/lib.

flag:表示在什麼時候解決未定義的符號(呼叫)。取值有兩個:

1) rtld_lazy : 表明在動態鏈結庫的函式**執行時解決。

2) rtld_now : 表明在dlopen返回前就解決所有未定義的符號,一旦未解決,dlopen將返回錯誤。

dlopen呼叫失敗時,將返回null值,否則返回的是操作控制代碼。

3.1.3 dlsym

原型:void*dlsym(void*handle,char*symbol);  

作用:dlsym根據動態鏈結庫操作控制代碼(handle)與符號(symbol),返回符號對應的函式的執行**位址。由此位址,可以帶引數執行相應的函式。

舉例:voidhandle =null;  

void(*add)(intx,inty);  

handle =dlopen("***.so"

,rtld_lazy);  

if(!handler)   

add=dlsym(handle,"add"

);   

if(add)  

add(89,369);  

dlclose(handle);  

3.1.4 dlclose

原型:intdlclose (void*handle);  

作用:dlclose用於關閉指定控制代碼的動態鏈結庫,只有當此動態鏈結庫的使用計數為0時,才會真正被系統解除安裝。

**:

Linux 動態鏈結庫 so 的使用

1.背景 庫 就是已經編寫好的,後續可以直接使用的 c 靜態庫 會合入到最終生成的程式,使得結果檔案比較大。優點是不再有任何依賴。c 動態庫 動態庫,乙個檔案可以多個 同時使用記憶體中只有乙份,節省記憶體,可以隨主 一起編譯。缺點是需要標頭檔案。說 庫就是除了main函式之外的其他 都可以組成庫。2...

linux下檢視動態鏈結庫so檔案的依賴的相關組建

我們很多c程式在windows下是以dll形式展現的,在linux則是以so 形式展現的。windows一般不會因為編譯dll檔案的編譯器版本不同而出先dll檔案不能執行。但是linux下,不同版本核心的linux下編譯的c程式,在其他版本的linux下就容易出現無法執行的問題。主要可能是支援程式的...

linux下檢視動態鏈結庫so檔案的依賴的相關元件

我們很多c程式在windows下是以dll形式展現的,在linux則是以so 形式展現的。windows一般不會因為編譯dll檔案的編譯器版本不同而出先dll檔案不能執行。但是linux下,不同版本核心的linux下編譯的c程式,在其他版本的linux下就容易出現無法執行的問題。主要可能是支援程式的...