Linux中的.so文件 是動(dòng)態(tài)鏈接的產(chǎn)物
同享庫(kù)理解為提供各種功能函數(shù)的集合,對(duì)外提供標(biāo)準(zhǔn)的接口
Linux中命名系統(tǒng)中同享庫(kù)的規(guī)則
主版本號(hào):不同的版本號(hào)之間不兼容
次版本號(hào):增量升級(jí) 向后兼容
發(fā)行版本號(hào):對(duì)應(yīng)次版本的毛病修正和性能提升,不影響兼容性
Linux中的同享庫(kù)其實(shí)不都是這樣的格式
比如GLibc的同享庫(kù)命名為:libc-x.y.z.so
動(dòng)態(tài)鏈接器也是GLibc的1部份,使用ld-x.y.z.so命名
libm(數(shù)學(xué)庫(kù))等
SO-NAME機(jī)制
系統(tǒng)和程序中要鏈接的同享庫(kù)的格式1般為:libname.so.x
1般是1個(gè)紙箱系統(tǒng)中主版本號(hào)相同、次版本號(hào)最高的同名同享庫(kù),目的是保證在兼容的條件下使用最新的版本
在可履行文件(Linux中為ELF文件)的相干字段中保存的就是SO-NAME
當(dāng)同享庫(kù)升級(jí)的時(shí)候,有1下兩種情況:
1)主版本號(hào)不變,說(shuō)明同享庫(kù)只是做了增量升級(jí)(保證原來(lái)的所有都不改變,在此基礎(chǔ)上添加新的接口),其實(shí)不影響本來(lái)的程序運(yùn)行的正確性
此時(shí),原來(lái)的版本不需要存在,所有用新的同享文件庫(kù)文件替換現(xiàn)有的老版本(次版本號(hào)比較低的)文件,然后運(yùn)行l(wèi)dconfig[后文會(huì)講]就能夠了
2)主版本號(hào)改變,此時(shí)升級(jí)的時(shí)候需要保存原來(lái)的老版本的同享庫(kù)(為了兼容原來(lái)以來(lái)此版本同享庫(kù)的可履行程序),同時(shí)需要保存新的版本的同享庫(kù)
Linux中的ldconfig
當(dāng)系統(tǒng)中安裝或更新1個(gè)同享庫(kù)的時(shí)候需要更新軟鏈接和動(dòng)態(tài)鏈接器查找文件
所以應(yīng)當(dāng)及時(shí)運(yùn)行l(wèi)dconfig
ldconfig的作用就是遍歷所有的保存同享庫(kù)的目錄/lib /usr/lib等,根據(jù)實(shí)際的同享庫(kù)的版本更新軟鏈接
在GCC編譯的時(shí)使用同享庫(kù)的情勢(shì)比較簡(jiǎn)單,其實(shí)不需要拼寫SO-NAME等
gcc -o hello hello.c -lNAME
利用上面的情勢(shì)即可以鏈接到 libNAME.so.x.y.z(系統(tǒng)中的版本)
動(dòng)態(tài)鏈接器依照以下順序順次裝載或查找同享對(duì)象
1)由環(huán)境變量 LD_LIBRARY_PATH指定的路徑
2)由路徑緩存文件/etc/ld.so.cache指定的路徑
3)默許同享目錄 先/usr/lib 再/lib
其中LD_LIBRARY_PATH是1個(gè)環(huán)境變量,當(dāng)指定某個(gè)程序的LD_LIBRARY_PATH時(shí)
動(dòng)態(tài)鏈接器在查找同享庫(kù)的時(shí)候,會(huì)首先從指定的路徑開(kāi)始查找