2021-05-12 14:32:11
Linux共用庫.so檔案的命名和動態連結
Linux中的.so檔案 是動態連結的產物
共用庫理解為提供各種功能函數的集合,對外提供標準的介面
Linux中命名系統中共用庫的規則
主版本號:不同的版本號之間不相容
次版本號:增量升級 向後相容
發行版本號:對應次版本的錯誤修正和效能提升,不影響相容性
Linux中的共用庫並不都是這樣的格式
比如GLibc的共用庫命名為:libc-x.y.z.so
動態連結器也是GLibc的一部分,使用ld-x.y.z.so命名
libm(數學庫)等
SO-NAME機制
系統和程式中要連結的共用庫的格式一般為:libname.so.x
一般是一個紙箱系統中主版本號相同、次版本號最高的同名共用庫,目的是保證在相容的前提下使用最新的版本
在可執行檔案(Linux中為ELF檔案)的相關欄位中儲存的就是SO-NAME
當共用庫升級的時候,有一下兩種情況:
1)主版本號不變,說明共用庫只是做了增量升級(保證原來的所有都不改變,在此基礎上新增新的介面),並不影響原先的程式執行的正確性
此時,原來的版本不需要存在,所有用新的共用檔案庫檔案替換現有的老版本(次版本號比較低的)檔案,然後執行ldconfig[後文會講]就可以了
2)主版本號改變,此時升級的時候需要保留原來的老版本的共用庫(為了相容原來以來此版本共用庫的可執行程式),同時需要儲存新的版本的共用庫
Linux中的ldconfig
當系統中安裝或者更新一個共用庫的時候需要更新軟連結和動態連結器查詢檔案
所以應該及時執行ldconfig
ldconfig的作用就是遍歷所有的儲存共用庫的目錄/lib /usr/lib等,根據實際的共用庫的版本更新軟連結
在GCC編譯的時使用共用庫的形式比較簡單,並不需要拼寫SO-NAME等
gcc -o hello hello.c -lNAME
利用上面的形式便可以連結到 libNAME.so.x.y.z(系統中的版本)
動態連結器按照下列順序依次裝載或者查詢共用物件
1)由環境變數 LD_LIBRARY_PATH指定的路徑
2)由路徑快取檔案/etc/ld.so.cache指定的路徑
3)預設共用目錄 先/usr/lib 再/lib
其中LD_LIBRARY_PATH是一個環境變數,當指定某個程式的LD_LIBRARY_PATH時
動態連結器在查詢共用庫的時候,會首先從指定的路徑開始查詢
相關文章