Linux 靜態庫 共享庫 動態庫 讀書筆記

2021-05-22 13:09:17 字數 1841 閱讀 9468

靜態函式庫是在程式執行前就加入到目標程式中去了;而共享函式庫則是在程式啟動的時候載入到程式中,它可以被不同的程式共享;動態載入函式庫則可以在程式執行的任何時候動態的載入。

靜態函式庫實際上就是簡單的乙個普通的目標檔案的集合,一般來說習慣用「.a」作為檔案的字尾。可以用ar這個程式來產生靜態函式庫檔案。

靜態庫函式允許程式設計師把程式link起來而不用重新編譯**,節省了重新編譯**的時間

理論上說,使用elf格式的靜態庫函式生成的**可以比使用共享函式庫(或者動態函式庫)的程式執行速度上快一些,大概1-5%。

建立乙個靜態函式庫檔案,或者往乙個已經存在地靜態函式庫檔案新增新的目標**,可以用下面的命令:

ar rcs my_library.a file1.o file2.o

共享函式庫中的函式是在當乙個可執行程式在啟動的時候被載入。

每個共享函式庫都有個特殊的名字,稱作「soname」。soname名字命名必須以「lib」作為字首,然後是函式庫的名字,然後是「.so」,最後是版本號資訊。不過有個特例,就是非常底層的c庫函式都不是以lib開頭這樣命名的。

一旦你有乙個共享函式庫,你還需要安裝它。其實簡單的方法就是拷貝你的庫檔案到指定的標準的目錄(例如/usr/lib),然後執行ldconfig。

我們可以通過執行ldd來看某個程式使用的共享函式庫。ldd ./owb

linux系統下,dl函式庫與其他函式庫在格式上沒有特殊的區別,我們前面提到過,它們建立的時候是標準的object格式。主要的區別就是這些函式庫不是在程式鏈結的時候或者啟動的時候載入,而是通過乙個api來開啟乙個函式庫,尋找符號表,處理錯誤和關閉函式庫

一種方法是使用glibc函式庫中的對動態載入模組的支援,它使用一些潛在的動態載入函式庫介面使得它們可以誇平台使用。

另外乙個方法是使用libltdl,是gnu libtool的一部分,可以進一步參考corba相關資料。

dlopen函式開啟乙個函式庫然後為後面的使用做準備

dlerror()函式,我們可以獲得最後一次呼叫dlopen(),dlsym(),或者dlclose()的錯誤資訊

dlsym(),這個函式在乙個已經開啟的函式庫裡面查詢給定的符號

標準的判斷方法是先 呼叫dlerror(),清除以前可能存在的錯誤,然後呼叫dlsym()來訪問乙個symbol,然後再呼叫dlerror()來判斷是否出現了錯誤。

dlclose()函式用力關閉乙個dl函式庫。

nm命令可以列出乙個函式庫檔案中的符號表

符號的型別是以乙個字母的形式顯示的,小寫字母表示這個符號是本地(local)的,而大寫字母則表示這個符號是全域性的(global,externel)。

一般來說,型別有一下幾種:t、d、b、u、w。各自的含義如下:t表示在**段中定義的一般變數符號;d表示時初始化過的資料段;b表示初始化的資料段;u表示沒有定義的,在這個庫裡面使用了,但是在其他庫中定義的符號;w,weak的縮寫,表示如果其他函式庫中也有對這個符號的定義,則其他符號的定義可以覆蓋這個定義。

可以用mn的「-o」選項和grep命令來查詢庫的名字。-o選項使得顯示的每一行都有這個函式庫檔名。

nm -o /lib/* /usr/lib/* /usr/lib/*/* /usr/local/lib/* 2> /dev/null | grep 'cos$'

如果你正在編譯的系統想很方便的移植到其他作業系統下,你可以使用gnu libtool來建立和安裝這個函式庫。

一旦你完全測試完畢了,就可以用strip去刪除一些不需要的符號了。strip命令可以使你很方便的控制刪除什麼符號,而保留什麼符號。另外的方法就是使用gnu ld的選項「-s」和「-s」;「-s」會刪除一些debugger的符號,而「-s」則是將所有的符號資訊都刪除。通常我們可以在gcc中加這樣的引數「-wl,-s」和「-wl,-s」來達到這個目的。

Linux 靜態庫與動態(共享)庫

不論是在linux還是windows下程式設計,我們都會用到庫,有自身帶的標準庫,也有我們自己寫的庫,庫就是預先編譯好的的方法的集合。linux中的庫可以分為兩種,靜態庫和動態庫,動態庫也稱為共享庫。在linux中,庫名稱都以lib開始,靜態庫名為 lib a,動態庫名為 lib so。靜態庫和動態...

靜態庫,共享庫,動態載入庫

一 靜態庫 1.概念 靜態庫就是一些目標檔案的集合,以.a結尾。靜態庫在程式鏈結的時候使用,鏈結器會將程式中使用 到函式的 從庫檔案中拷貝到應用程式中。一旦鏈結完成,在執行程式的時候就不需要靜態庫了。由於每個使用靜態庫的應用程式都需要拷貝所用函式的 所以靜態鏈結的檔案會比較大。2.建立與應用 首先建...

linux下的共享庫(動態庫)和靜態庫

linux下的共享庫 動態庫 和靜態庫 1.什麼是庫 在windows平台和linux平台下都大量存在著庫。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。由於windows和linux的本質不同,因此二者庫的二進位制是不相容的。本文僅限於介紹linux下的庫。2.庫的種類 ...