linux 支援兩種型別的庫,每一種庫都有各自的優缺點。
靜態庫包含在編譯時靜態繫結到乙個程式的函式。動態庫則不同,它是在載入應用程式時被載入的,而且它與應用程式是在執行時繫結的。
靜態庫較適宜於較小的應用程式,因為它們只需要最小限度的函式。
而對於需要多個庫的應用程式來說,則適合使用共享庫,因為它們可以減少應用程式對記憶體(包括執行時中的磁碟占用和記憶體占用)的占用。
這是因為多個應用程式可以同時使用乙個共享庫;因此,每次只需要在記憶體上覆制乙個庫。要是靜態庫的話,每乙個執行的程式都要有乙份庫的副本。
gnu/linux 提供兩種處理共享庫的方法(每種方法都源於 sun solaris)。可以動態地將程式和共享庫鏈結並讓 linux 在執行時載入庫(如果它已經在記憶體中了,則無需再載入)。
另外一種方法是使用乙個稱為動態載入的過程,這樣程式可以有選擇地呼叫庫中的函式。
使用動態載入過程,程式可以先載入乙個特定的庫(已載入則不必),然後呼叫該庫中的某一特定函式。這是構建支援外掛程式的應用程式的乙個普遍的方法。
linux下動態庫檔案的檔名形如 lib***.so,其中so是 shared object 的縮寫,即可以共享的目標檔案。
-wl選項告訴編譯器將後面的引數傳遞給鏈結器。-soname則指定了動態庫的soname。
-wl 表示後面的引數也就是-soname,libhello.so.1直接傳給聯結器ld進行處理。
如:gcc -fpic -shared -wl,soname,libhello.so.1 -o libhello.so.1.2 hello.c
用於使用hello.c生成乙個名為libhello.so.1.2的共享庫,且該共享庫的soname為libhello.so.1。
作用soname的關鍵功能是它提供了相容性的標準,當要公升級系統中的乙個庫時,並且新庫的soname和老庫的soname一樣,用舊庫鏈結生成的程式使用新庫依然能正常執行。這個特性使得在linux下,公升級使得共享庫的程式和定位錯誤變得十分容易。
在linux中,應用程式通過使用soname,來指定所希望庫的版本,庫作者可以通過保留或改變soname來宣告,哪些版本是相容的,這使得程式設計師擺脫了共享庫版本衝突問題的困擾。
使用可以通過readelf -d來檢視每個動態庫的soname。
在程式執行期間,程式會查詢擁有 soname名字的檔案,而不是庫的檔名,換句話說,soname是庫的區分標誌。
目的主要是允許系統中多個版本的庫檔案共存,習慣上在命名庫檔案的時候通常與soname相同,
如:lib***x.so.major.minor,其中,***x是庫的名字,major是主版本號,minor 是次版本號。
一般對於不影響相容性的公升級,只修改次版本號。如果修改了主版本號,可能就不能相容以前的版本了。
所以,可以使用這種方式構建動態庫:gcc -fpic -shared -wl,soname,libhello.so.major -o libhello.so.major.minor hello.c
簡單的來說,soname指定了庫的名字,而不去管生成的是什麼名字的庫,在做鏈結時是將這個soname指定的名字加入執行檔案中,而程式執行時也是去載入soname指定的庫檔名。補:注意,這裡說鏈結時soname指定的名字加入到執行檔案(exe)中,指的是編譯生成exe時把這個名字存到了exe內部(『ldd 可執行檔案』可以看到),從而exe執行時找這個名字的檔案,但並不是指的exe的編譯鏈結動作所鏈結的目標檔名,這個目標檔名依然是簡單的libxx.so。
所以如果程式連線了新公升級的庫,只需要將這個新庫拷貝到目錄下面後,對其以soname做乙個符號鏈結就能呼叫。
如果庫公升級了,但是程式依舊使用舊的鏈結庫,那麼只需對這個將舊庫名字軟鏈結到新公升級的庫中去即可。
對於乙個新安裝到系統中的庫,有時需要執行ldconfig命令,來自動完成動態庫的更新。
總結linux系統的這種動態庫管理方式值得我們在實際專案的動態庫管理中使用,既保證了動態庫的公升級,又能得到方便地使用。
————————————————
補:在嵌入式中,為了簡化,編譯時直接以soname作為生成的檔名。so的版本資訊在**中體現。
linux 共享庫soname與realname
1 soname,可以使不同版本號的共享庫共存,保證公升級時不需要公升級程 序檔案。2 realname,共享庫檔案名字,檔案控制資訊中儲存有soname。readelf d 可檢視soname 3 ld llibfile,程式載入時會根據libfile的soname查詢依賴庫。如 soname l...
Linux下動態載入庫
七月 9th,2011 以前看到過windows下載入動態庫的例子,linux下沒有特別關注過。動態載入庫有很多好處,比如通過讀取配置檔案,按照配置資訊來為指定型別或指定目錄下的資料使用指定的動態庫方法,既實現了程式的松耦合,也方便擴充套件。在linux下動態載入庫要使用到dl庫。使用的方法記錄如下...
Linux下建立動態庫
在linux下動態庫檔案字尾為.so,其中so代表 shared object,即共享目標檔案。動態庫的特點就是在系統記憶體中,只會存在動態庫的乙個副本。例如 程式a,b允許時都需要動態庫lib.so的支援。當a程式執行時,由於系統記憶體中沒有發現lib.so庫,所以需要載入lib.so。此時b程式...