现在知道了动态与静态函数库,也知道了当前的 Linux大多是将函数库做成动态函数库,下面来讨论增加函数库读取性能的方法。我们知道,内存的访问速度是硬盘的好几倍,所以,如果将常用的动态函数库 加载到内存中(高速缓存,cache),当软件套件要采用动态函数库时,就不需要重新从硬盘里读出,这样就可以提高动态函数库的读取速度。这个时候需要ldconfig 与 /etc/ld.so.conf 的帮助。
将动态函数库加载到高速缓存(cache)中的过程如下:
1. 首先,要在 /etc/ld.so.conf中写下“想要读入高速缓存中的动态函数库所在的目录”,注意,是目录而不是文件。
2. 利用ldconfig执行文件将 /etc/ld.so.conf的数据读入高速缓存中。
3. 同时在 /etc/ld.so.cache文件中记录数据。
事实上,ldconfig还可以用来判断动态函数库的连接信息。赶紧使用Fedora Core 4来测试吧。假设要将MySQL函数库加入到高速缓存中:
- /*
- [root@linux ~]# ldconfig [-f conf] [ -C cache] [-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中,如何读入高速缓存?
- [root@linux ~]# vi /etc/ld.so.conf
- include ld.so.conf.d/*.conf
- /usr/lib/mysql <==这一行是新增的。
- [root@linux ~]# ldconfig
- # 画面上不会显示任何信息,正常。
- [root@linux ~]# ldconfig -p
- 928 libs found in cache `/etc/ld.so.cache'
- libz.so.1 (libc6) => /usr/lib/libz.so.1
- libz.so (libc6) => /usr/lib/libz.so
- ......中间省略......
透过上面 的动作,我们可以将 MySQL 的相关函式库给他读入快取当中, 这样可以加快函式库读取的效率呢!在某些时候,您可能会自行加入某些 Tarball 安装的动态函式库,而您想要让这些动态函式库的相关连结可以被读入到快取当中, 这个时候您可以将动态函式库所在的目录名称写入 /etc/ld.so.conf 当中,然后执行 ldconfig 就可以啦!
ldd:
说了这么多,那么我如何判断某个可执行的 binary 档案含有什么动态函式库呢?很简单,利用 ldd 就可以晓得了!例如我想要知道 /usr/bin/passwd 这个程式含有的动态函式库有哪些,可以这样做:
- /*
- [root@linux ~]# ldd [-vdr] [filename]
- 参数:
- -v :列出所有内容资讯;
- -d :重新将资料有遗失的 link 点秀出来!
- -r :将 ELF 有关的错误内容秀出来!
- */
- //范例:
- //范例一:找出 /usr/bin/passwd 这个档案的函式库资料
- [root@linux ~]# ldd /usr/bin/passwd
- linux-gate.so.1 => (0x00d19000)
- .......中间省略......
- libpam_misc.so.0 => /lib/libpam_misc.so.0 (0x00bd6000)
- // .......中间省略......
- /*
- # 我们前言的部分不是一直提到 passwd 有使用到 pam 的模组吗?!怎么知道?
- # 利用 ldd 察看一下这个档案,看到 libpam.so 了吧?这就是 pam 提供的函式库
- */
- //范例二:找出 /lib/libc.so.6 这个函式的相关其他函式库!
- [root@linux ~]# ldd /lib/libc.so.6
- /lib/ld-linux.so.2 (0x00bf1000)
- linux-gate.so.1 => (0x00632000)
- [root@linux ~]# ldd -v /lib/libc.so.6
- /lib/ld-linux.so.2 (0x00bf1000)
- linux-gate.so.1 => (0x00111000)
- Version information:
- /lib/libc.so.6:
- ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
- ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
- ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
未来如果 您常常升级安装 RPM 的套件时( 下一章节会介绍 ),应该常常会发现那个‘ 相依属性’的问题吧!?没错!我们可以先以 ldd 来视察‘相依函式库’之间的相关性!以先取得瞭解! 例如上面的例子中,我们检查了 libc.so.6 这个在 /lib 当中的函式库,结果发现他其实还跟 ld-linux.so.2 有关!所以我们就需要来瞭解一下,那个档案到底是什么套件的函式库呀!?使用 -v 这个参数还可以得知该函式库来自于哪一个套件!像上面的资料中,就可以得到该 libc.so.6 其实可以支援 GLIBC_2.1 等的版本!