Linux共享庫 so檔案的命名和動態鏈結

2021-12-29 20:29:01 字數 1343 閱讀 1454

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時

動態鏈結器在查詢共享庫的時候,會首先從指定的路徑開始查詢

makefile 使用共享庫檔案so

環境 vmware workstation centos 6.4 x86 64 說明 2 gcc在鏈結的時候要加 l引數和 l引數 l後面跟的共享庫檔案的名字 如 共享庫檔案的名字如果是libmyso.so,那麼在寫的時候,就要把前面的lib和後面的.so去掉,得到myso。4 l 告訴gcc共享庫...

Linux下的動態共享庫 so 開發呼叫

翻譯並根據實際情況進行了小小修改,僅關注linux下動態共享庫 dynamic shared library so 的開發.inttest1 inttest2 include stdio.h inttest1 inttest2 intmain 在 的目錄下執行如下命令 如果你不是ubuntu系統,請...

linux下構建 共享函式庫( so)

在linux上用c建立共享庫so 1 建立math1.c,在命令列中輸入 nano math1.c int add int x,int y 2 編譯生成共享庫libmath1.so gcc fpic shared olibmath1.so math1.c 3 建立測試程式testmath.c,在命令...