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...