Linux共享庫組織

2021-06-06 10:02:19 字數 1637 閱讀 5273

1.

版本組織

linux共享庫版本組織主要分為共享庫版本和符號版本:

1) 共享庫版本:

共享庫採用x.y.z的方式標識共享庫版本,x為主版本號,y為次版本號,z為發布版本號;

當主版本號發生變化時,代表共享庫版本發生了不相容的變化,如函式簽名變化、介面資料結構變化、函式行為變化等;

當次版本號發生變化時,代表共享庫版本增加了新特性,但已有的函式、資料結構等保持相容;

當發布版本號發生變化時,代表共享庫版本修正了bug,或改進了效能。

因此,如果應用程式使用的共享庫的主版本發生了變化,應用程式可能會無法執行;如果僅是次版本號或發布版本號公升級,則應用程式不會受影響。

應用程式依賴的共享庫的主版本號相同,但次版本號偏低,則應用程式可能可以執行,也有可能不能執行,這取決於應用程式是否使用了新版本中增加提供的介面或資料結構。

因為在執行應用程式時,作業系統如果發現共享庫的次版本號偏低,可能採用不允許程式執行的策略,但實際上應用程式可能根本就沒有使用較高次版本號中的介面。

為了解決此問題引入了符號版本。

2)符號版本:

符號版本,即對於每乙個符號都有乙個版本號。共享庫在發布時,標識出了每個符號的最新版本號。如:

vers_1.2

vers_1.1

func2的符號版本為1.2,而func1的符號版本為1.1。

在生成應用程式時,將會在應用程式檔案中根據使用到的符號記錄需要的符號版本。在使用動態鏈結庫時,如果發現符號版本低於應用程式要求的版本,將無法執行。

另外,上圖中的global和local關鍵字的作用時用於標識動態庫中哪些符號是全域性的,哪些是共享庫的內部符號。對於共享庫內部符號,則不允許應用程式使用。

2.so-name

應用程式需要指定依賴的共享庫,因為相同主版本號的共享庫是向後相容的,因此不需要指定共享庫的完整版本,而只需要指定它的主版本。

共享庫的名稱加上它的主版本號,就構成了共享庫的so-name,比如libc.so.1.5.3,它的so-name為libc.so.1。

在通過libconfig安裝共享庫時,會為共享庫建立乙個軟鏈結檔案,並以它的so-name命名。比如上例中,就會生成乙個libc.so.1的鏈結檔案,指向libc.so.1.5.3檔案。

3.共享庫的路徑

共享庫檔案通常放在下面三個路徑中的乙個:

/lib: 存放系統最關鍵和基礎的共享庫,比如動態鏈結器,c執行庫等。這些庫主要是/bin和/sbin下的程式要用到的庫,還有系統啟動時需要的庫;

/usr/lib:存放非系統執行時需要的關鍵的共享庫,主要是開發時需要的共享庫檔案;

/usr/local/lib:存放與作業系統無關的共享庫,如第三方執行時庫。比如在安裝python時,python需要的共享庫檔案就會在/usr/local/lib/python下。

4.共享庫的查詢

應用程式在載入時,會到共享庫的存放路徑下查詢共享庫檔案。查詢的順序為: 1)

ld_library_path中指定的路徑 2)

/etc/ld.so.cache中指定的路徑

再通過ldconfig安裝共享庫時,ldconfig會自動在/etc/ld.so.cache中加入安裝的共享庫。這個檔案主要是為了提高共享庫檔案的查詢速度。 3)

預設共享庫目錄,先/usr/lib再/lib

lLinux中共享庫的組織

相容性 相容更新 所有更新只是在原有的基礎上新增或修改一些內容,所有介面都保持不變。不相容更新 改變了原有的介面,使用該共享庫原有介面的程式可能不能正常執行。導致不相容的有以下幾種情況 命名 規則如下 libname.so.x.y.z glibc並沒有遵守這個規則,而是libc x.y.z.so s...

Linux 靜態庫與共享庫

可以把 多個編譯好的目標檔案 打包成為乙個檔案,就是庫檔案。庫檔案有兩種 靜態庫 a 和共享庫 so 靜態庫和共享庫區別 靜態庫是 函式的歸檔,在使用時,複製函式的 區到最終的檔案中。共享庫是 函式的歸檔,在使用時,把函式在共享庫中的位址拿到最終的檔案中。靜態庫的效率稍高一點,但占用空間非常大,而且...

Linux 靜態庫與共享庫

一 靜態庫和共享庫 1 靜態庫 a 2 共享庫 so或.sa 二 生成 1 生成共享庫 編譯選項 shared 表示生成共享庫格式 fpic 產生位置無關碼 position independent code 庫名規則 lib 版本號 so 示例 gcc shared fpic test.o o l...