1. 程式人生 > >動態函式庫載入的配置ldconfig與 /etc/ld.so.conf

動態函式庫載入的配置ldconfig與 /etc/ld.so.conf

ldconfig與 /etc/ld.so.conf

在瞭解了動態與靜態函式庫,也知道我們目前的 Linux 大多是將函式庫做成動態函式庫之後,再來要知道的就是,那有沒有辦法新增函式庫的讀取效能?我們知道記憶體的存取速度是硬碟的好幾倍,所以,如果我們將常用到的動態函式庫先載入記憶體當中 (快取, cache),如此一來,當軟體要取用動態函式庫時,就不需要從頭由硬盤裡面讀出羅!這樣不就可以增進動態函式庫的讀取速度?沒錯,是這樣的!這個時候就需要ldconfig 與 /etc/ld.so.conf 的協助了。

如何將動態函式庫載入快取記憶體當中呢?

  1. 首先,我們必須要在 /etc/ld.so.conf 裡面寫下『想要讀入快取記憶體當中的動態函式庫所在的目錄
    』,注意喔,是目錄而不是檔案;
  2. 接下來則是利用 ldconfig 這個執行檔將 /etc/ld.so.conf 的資料讀入快取當中;
  3. 同時也將資料記錄一份在 /etc/ld.so.cache 這個檔案當中吶!

圖 5.2.1、使用 ldconfig 預載入動態函式庫到記憶體中

事實上, ldconfig 還可以用來判斷動態函式庫的連結資訊呢!趕緊利用 CentOS來測試看看。假設你想要將目前你係統下的 MySQL 函式庫加入到快取當中時,可以這樣做:

[[email protected] ~]# ldconfig [-f conf] [ -C cache]
[[email protected]
~]# ldconfig [-p] 選項與引數: -f conf :那個 conf 指的是某個檔名稱,也就是說,使用 conf 作為 libarary 函式庫的取得路徑,而不以 /etc/ld.so.conf 為預設值 -C cache:那個 cache 指的是某個檔名稱,也就是說,使用 cache 作為快取快取 的函式庫資料,而不以 /etc/ld.so.cache 為預設值 -p :列出目前有的所有函式庫資料內容 (在 /etc/ld.so.cache 內的資料!) 範例一:假設我的 MySQL 資料庫函式庫在 /usr/lib/mysql 當中,如何讀進 cache ? [[email protected]
~]# vi /etc/ld.so.conf include ld.so.conf.d/*.conf /usr/lib/mysql <==這一行新增的啦! [[email protected] ~]# ldconfig <==畫面上不會顯示任何的資訊,不要太緊張!正常的! [[email protected] ~]# ldconfig -p 530 libs found in cache `/etc/ld.so.cache' libz.so.1 (libc6) => /usr/lib/libz.so.1 libxslt.so.1 (libc6) => /usr/lib/libxslt.so.1 ....(底下省略).... # 函式庫名稱 => 該函式庫實際路徑

透過上面的動作,我們可以將 MySQL 的相關函式庫給他讀入快取當中,這樣可以加快函式庫讀取的效率呢!在某些時候,你可能會自行加入某些 Tarball 安裝的動態函式庫,而你想要讓這些動態函式庫的相關連結可以被讀入到快取當中,這個時候你可以將動態函式庫所在的目錄名稱寫入 /etc/ld.so.conf 當中,然後執行 ldconfig 就可以啦!

小標題的圖示程式的動態函式庫解析: ldd

說了這麼多,那麼我如何判斷某個可執行的 binary 檔案含有什麼動態函式庫呢?很簡單,利用ldd 就可以曉得了!例如我想要知道 /usr/bin/passwd 這個程式含有的動態函式庫有哪些,可以這樣做:

[[email protected] ~]# ldd [-vdr] [filename]
選項與引數:
-v :列出所有內容資訊;
-d :重新將資料有遺失的 link 點秀出來!
-r :將 ELF 有關的錯誤內容秀出來!

範例一:找出 /usr/bin/passwd 這個檔案的函式庫資料
[[email protected] ~]# ldd /usr/bin/passwd
....(前面省略)....
        libaudit.so.0 => /lib/libaudit.so.0 (0x00494000)     <==SELinux
        libselinux.so.1 => /lib/libselinux.so.1 (0x00101000) <==SELinux
        libc.so.6 => /lib/libc.so.6 (0x00b99000)
        libpam.so.0 => /lib/libpam.so.0 (0x004ab000)         <==PAM 模組
....(底下省略)....
# 我們前言的部分不是一直提到 passwd 有使用到 pam 的模組嗎!怎麼知道?
# 利用 ldd 察看一下這個檔案,看到 libpam.so 了吧?這就是 pam 提供的函式庫

範例二:找出 /lib/libc.so.6 這個函式的相關其他函式庫!
[[email protected] ~]# ldd -v /lib/libc.so.6
        /lib/ld-linux.so.2 (0x00ab3000)
        linux-gate.so.1 =>  (0x00636000)

        Version information:  <==使用 -v 選項,新增顯示其他版本資訊!
        /lib/libc.so.6:
                ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
                ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
                ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2

未來如果你常常升級安裝 RPM 的軟體時 (下一章節會介紹),應該常常會發現那個『相依屬性』的問題吧!沒錯!我們可以先以ldd 來視察『相依函式庫』之間的相關性!以先取得了解!例如上面的例子中,我們檢查了 libc.so.6 這個在 /lib 當中的函式庫,結果發現他其實還跟 ld-linux.so.2 有關!所以我們就需要來了解一下,那個檔案到底是什麼軟體的函式庫呀?使用-v 這個引數還可以得知該函式庫來自於哪一個軟體!像上面的資料中,就可以得到該libc.so.6 其實可以支援 GLIBC_2.1 等的版本!