和luster學習在Linux建立庫函式(2)(轉)

subid發表於2007-08-16
和luster學習在Linux建立庫函式(2)(轉)[@more@]
3. 共享函式庫

共享函式庫中的函式是在當一個可執行程式在啟動的時候被載入。如果一個共享函式庫正常安裝,所有的程式在重新執行的時候都可以自動載入最新的函式庫中的函式。對於Linux系統還有更多的可以實現的功能:

o 升級了函式庫但是仍然允許程式使用老版本的函式庫。
o 當執行某個特定程式的時候可以覆蓋某個特定的庫或者庫中指定的函式。
o 可以在庫函式被使用的過程中修改這些函式庫。

3.1. 一些約定

如果你要編寫的共享函式庫支援所有有用的特性,你在編寫的過程中必須遵循一系列約定。你必須理解庫的不同的名字間的區別,例如它的“soname”和“real name”之間的區別和它們是如何相互作用的。你同樣還要知道你應該把這些庫函式放在你檔案系統的什麼位置等等。下面我們具體看看這些問題。

3.1.1. 共享庫的命名

每個共享函式庫都有個特殊的名字,稱作“soname”。Soname名字命名必須以“lib”作為字首,然後是函式庫的名字,然後是“.so”,最後是版本號資訊。不過有個特例,就是非常底層的C庫函式都不是以lib開頭這樣命名的。

每個共享函式庫都有一個真正的名字(“real name”),它是包含真正庫函式程式碼的檔案。真名有一個主版本號,和一個發行版本號。最後一個發行版本號是可選的,可以沒有。主版本號和發行版本號使你可以知道你到底是安裝了什麼版本的庫函式。
另外,還有一個名字是編譯器編譯的時候需要的函式庫的名字,這個名字就是簡單的soname名字,而不包含任何版本號資訊。

管理共享函式庫的關鍵是區分好這些名字。當可執行程式需要在自己的程式中列出這些他們需要的共享庫函式的時候,它只要用soname就可以了;反過來,當你要建立一個新的共享函式庫的時候,你要指定一個特定的檔名,其中包含很細節的版本資訊。當你安裝一個新版本的函式庫的時候,你只要先將這些函式庫檔案複製到一些特定的目錄中,執行ldconfig這個實用就可以。Ldconfig檢查已經存在的庫檔案,然後建立soname的符號連結到真正的函式庫,同時設定/etc/ld.so.cache這個緩衝檔案。這個我們稍後再討論。

Ldconfig並不設定連結的名字,通常的做法是在安裝過程中完成這個連結名字的建立,一般來說這個符號連結就簡單的指向最新的soname或者最新版本的函式庫檔案。最好把這個符號連結指向soname,因為通常當你升級你的庫函式的後,你就可以自動使用新版本的函式庫勒。

我們來舉例看看:

/usr/lib/libreadline.so.3 是一個完全的完整的soname,ldconfig可以設定一個符號連結到其他某個真正的函式庫檔案,例如是/usr/lib/libreadline.so.3.0。同時還必須有一個連結名字,例如/usr/lib/libreadline.so 就是一個符號連結指向/usr/lib/libreadline.so.3。

待續

luster(luster@linuxaid.com.cn,hwang@ustc.edu)
2001-8-17

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10796304/viewspace-962577/,如需轉載,請註明出處,否則將追究法律責任。

相關文章