歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux共享庫.so文件的命名和動態鏈接

Linux共享庫.so文件的命名和動態鏈接

日期:2017/2/28 14:22:02   编辑:Linux教程

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時
動態鏈接器在查找共享庫的時候,會首先從指定的路徑開始查找

Copyright © Linux教程網 All Rights Reserved