動態函式庫載入的配置ldconfig與 /etc/ld.so.conf
在瞭解了動態與靜態函式庫,也知道我們目前的 Linux 大多是將函式庫做成動態函式庫之後,再來要知道的就是,那有沒有辦法新增函式庫的讀取效能?我們知道記憶體的存取速度是硬碟的好幾倍,所以,如果我們將常用到的動態函式庫先載入記憶體當中 (快取, cache),如此一來,當軟體要取用動態函式庫時,就不需要從頭由硬盤裡面讀出羅!這樣不就可以增進動態函式庫的讀取速度?沒錯,是這樣的!這個時候就需要ldconfig 與 /etc/ld.so.conf 的協助了。
如何將動態函式庫載入快取記憶體當中呢?
- 首先,我們必須要在 /etc/ld.so.conf 裡面寫下『想要讀入快取記憶體當中的動態函式庫所在的目錄
- 接下來則是利用 ldconfig 這個執行檔將 /etc/ld.so.conf 的資料讀入快取當中;
- 同時也將資料記錄一份在 /etc/ld.so.cache 這個檔案當中吶!
圖 5.2.1、使用 ldconfig 預載入動態函式庫到記憶體中
事實上, ldconfig 還可以用來判斷動態函式庫的連結資訊呢!趕緊利用 CentOS來測試看看。假設你想要將目前你係統下的 MySQL 函式庫加入到快取當中時,可以這樣做:
[[email protected] ~]# ldconfig [-f conf] [ -C cache] [[email protected] |
透過上面的動作,我們可以將 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 等的版本!