相容性
相容更新:所有更新只是在原有的基礎上新增或修改一些內容,所有介面都保持不變。
不相容更新:改變了原有的介面,使用該共享庫原有介面的程式可能不能正常執行。
導致不相容的有以下幾種情況: 命名
規則如下:
libname.so.x.y.z
glibc並沒有遵守這個規則,而是libc-x.y.z.soso-name
採用so-name的命名機制來記錄共享庫的依賴關係,每個共享庫都有乙個對應的so-name,這個so-name即共享庫的檔名去掉次版本號和發布版本號,保留主版本號。
在linux系統中,系統會為每個共享庫在他的目錄建立乙個跟so-name相同的並且指向它的軟鏈結
glibc還是不符合這個規則,例如它的so-name是libc.so.6,而對應的共享庫一般是libc-2.6.1.so建立so-name為名字的軟鏈結的目的是,所有依賴某個共享庫的模組,在編譯、鏈結和執行時,都使用so-name,而不是詳細的版本號。
so-name儲存在.dynamic
段中,可使用readelf -d
檢視
ldconfig
命令
用途主要是在預設搜尋目錄/lib和/usr/lib以及動態庫配置檔案/etc/ld.so.conf內所列的目錄下,搜尋出可共享的動態鏈結庫(格式如lib*.so*),進而建立出動態裝入程式(ld.so)所需的連線和快取檔案。快取檔案預設為/etc/ld.so.cache,此檔案儲存已排好序的動態鏈結庫名字列表,為了讓動態鏈結庫為系統所共享,需執行動態鏈結庫的管理命令ldconfig,此執行程式存放在/sbin目錄下。
ldconfig通常在系統啟動時執行,而當使用者安裝了乙個新的動態鏈結庫時,就需要手工執行這個命令。
其引數不過多介紹,一般預設執行即可,其最終目的就是根據動態庫的so-name建立對應的軟鏈結和快取檔案,注意點:
符號版本
在動態鏈結時,只進行了主版本號的判斷,即只判斷so-name,但是次版本只向後相容,若依賴高的次版本的程式執行在低的次版本號的共享庫系統時,可能產生缺少某些符號的錯誤,這種次版本號交會問題,使用符號版本機制。
簡單說就是讓每個匯入和匯出的符號都有乙個相關聯的版本號,類似於符號的名稱修飾
linux下對於符號版本機制並沒有廣泛應用,是要在glibc軟體包中的共享庫,比如我們能在程式中看到glibc_2.4等字眼就是
動態鏈結器會在/lib,/usr/lib和/etc/ld.so.conf檔案中指定的目錄下查詢共享庫,而每次遍歷是很耗時的,所以使用ldconfig命令(前面提到過,且該命令在系統啟動時會自動執行),在/etc/ld.so.cache中建立了乙個so-name的快取,這樣動態鏈結器就可以直接從中查詢,若還是找不到還會遍歷/lib和/usr/lib
動態庫執行時搜尋路徑順序:
編譯目標**時指定的動態庫搜尋路徑(-r引數)
環境變數ld_library_path指定的動態庫搜尋路徑
快取檔案/etc/ld.so.cache中指定的路徑
預設的動態庫搜尋路徑/usr/lib
預設的動態庫搜尋路徑/lib
不過ld_library_path的設定作用是全域性的,過多的使用可能會影響到其他應用程式的執行,所以多用在除錯。(ld_library_path 的缺陷和使用準則,可以參考《why ld_library_path is bad》 )。通常情況下推薦還是使用gcc的-r或-rpath選項來在編譯時就指定庫的查詢路徑,並且該庫的路徑資訊儲存在可執行檔案中,執行時它會直接到該路徑查詢庫,避免了使用ld_library_path環境變數查詢
ld_library_path也會影響gcc編譯時鏈結庫的路徑,即-l引數,順序位於-l所指定的目錄之後(沒有-l選項當然也會搜尋)使用-shared和-fpic引數,作用前面已經介紹過了,另外還有乙個引數是-wl,可將指定的引數傳遞給鏈結器,例如:
-wl,-soname,mysoname
可以指定該共享庫的so-name,
若沒有指定,則該共享庫預設就沒有so-name,ldconfig命令就無法為其建立軟鏈結
Linux共享庫組織
1.版本組織 linux共享庫版本組織主要分為共享庫版本和符號版本 1 共享庫版本 共享庫採用x.y.z的方式標識共享庫版本,x為主版本號,y為次版本號,z為發布版本號 當主版本號發生變化時,代表共享庫版本發生了不相容的變化,如函式簽名變化 介面資料結構變化 函式行為變化等 當次版本號發生變化時,代...
Linux中共享庫(so)的幾個名稱及相關用法
本文主要介紹在linux作業系統中,同乙個共享庫 so 的幾個名稱,以及這幾個名稱的應用場景。本文從共享庫 so 的版本控制角度來講述。本文會以 curl 共享庫 libcurl 為例,來展開講述。首先在此說明,so有三個名字,如下 realname是so的真實名稱,如編譯安裝curl軟體後,生成的...
共享庫的高階特性
一般用於實現外掛程式功能,可通過呼叫函式來載入 解除安裝共享庫。可以查詢共享庫中函式名 變數名所對應的指標。include void dlopen const char libfilename,int flags 開啟共享庫 int dlclose void handle 關閉共享庫 const c...