有關linux庫函數

    前次系統升級,出現一些意想不到的問題,煩惱了我很久,系統升級之後重啓,然後提示各種找到以.so結尾的文件,後來查詢得知,是因爲linux系統升級後,函數庫沒有更新,造成很多服務啓動出錯。爲了以後不再出現這樣的問題特對linux函數庫作點分析:linux庫函數分爲靜態庫和動態庫兩種。

1. 靜態函數庫  

    這類庫的名字一般是libxxx.a;利用靜態函數庫編譯成的文件比較大,因爲整個 函數庫的所有數據都會被整合進目標代碼中,他的優點就顯而易見了,即編譯後的執行程序不需要外部的函數庫支持,因爲所有使用的函數都已經被編譯進去了。當然這也會成爲他的缺點,因爲如果靜態函數庫改變了,那麼你的程序必須重新編譯。  

2. 動態函數庫  

    這類庫的名字一般是libxxx.so;相對於靜態函數庫,動態函數庫在編譯的時候 並沒有被編譯進目標代碼中,你的程序執行到相關函數時才調用該函數庫裏的相應函數,因此動態函數庫所產生的可執行文件比較小。由於函數庫沒有被整合進你的程序,而是程序運行時動態的申請並調用,所以程序的運行環境中必須提供相應的庫。動態函數庫的改變並不影響你的程序,所以動態函數庫的升級比較方便。 
linux系統有幾個重要的目錄存放相應的函數庫,如/lib /usr/lib。

3.動態庫加載過程

 

    將動態函數庫加載到高速緩存的過程如下:

  • 首先,要在/etc/ld.so.conf中寫下“想要讀入高速緩存中的動態函數庫所在的目錄”,注意是目錄而不是文件

  • 利用ldconf執行文件將/etc/ld.so.conf的數據讀入高速緩存中

  • 同時在/etc/ld.so.cache文件中記錄數據
    下面我們已mysql爲例,做個示範
    #vi /etc/ld.so.conf
    include ld.so.conf.d/*.conf
    /usr/lib/mysq

4.查看ELF文件依賴的庫

ldd不要對不信任的ELF文件用,因爲它隱含了對某些環境變量的改變。

ldd demo_use:查看可執行文件demo_use依賴的庫。

ldd libhello.so:查看庫libhello.so依賴的庫。

 

5.動態函數庫更新

    這個纔是我開頭提到的問題的解決方案,因爲升級後要重新指定庫的連接,所以函數庫是比較麻煩的。我們知道,升級函數庫時必須使用新的版本的。但是我們對共享庫進行操作的時候就要特別小心了。絕不能簡單地將新文件拷到一個目錄下,然後刪除舊的文件(我之前就是這樣做的,在困惑中待了很長時間)。因爲有可能舊的函數庫正在爲某個程序所使用。我們必須保證每個程序都能夠正確地找到動態庫。簡單的將,當我們將新版本的動態庫文件放到指定目錄下以後,使用ln命令來完成:

ln –sf /usr/lib/libdb.so.new("new"指新的版本號) /usr/lib/libdb.so.old("old"是原有的文件) ;

比如:/usr/lib/libdb.so.2原來指向的文件是/usr/llib/libdb.so.2.0.1,現在有一個新文件 /usr/lib/libdb.so.2.78.1,我們可以這樣處理:ln –sf /usr/lib/libdb.so.2.78.1 /usr/lib/libdb.so.2 ;

然後,我們才能將/usr/lib/libdb.so.2.0.1文件進行刪除。

(完)

 


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章