动态函数库加载的配置ldconfig与 /etc/ld.so.conf
ldconfig与 /etc/ld.so.conf在了解了动态与静态函式库,也知道我们目前的 Linux 大多是将函式库做成动态函式库之后,再来要知道的就是,那有没有办法添加函式库的读取效能?我们知道内存的存取速度是硬盘的好几倍,所以,如果我们将常用到的动态函式库先加载内存当中 (缓存, cache),如此一来,当软件要取用动态函式库时,就不需要从头由硬盘里面读出罗!这样不就可以增进动态函式库
在了解了动态与静态函式库,也知道我们目前的 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 函式库加入到缓存当中时,可以这样做:
[root@www ~]# ldconfig [-f conf] [ -C cache] [root@www ~]# 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 ? [root@www ~]# vi /etc/ld.so.conf include ld.so.conf.d/*.conf /usr/lib/mysql <==这一行新增的啦! [root@www ~]# ldconfig <==画面上不会显示任何的资讯,不要太紧张!正常的! [root@www ~]# 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 这个程序含有的动态函式库有哪些,可以这样做:
[root@www ~]# ldd [-vdr] [filename] 选项与参数: -v :列出所有内容资讯; -d :重新将数据有遗失的 link 点秀出来! -r :将 ELF 有关的错误内容秀出来! 范例一:找出 /usr/bin/passwd 这个文件的函式库数据 [root@www ~]# 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 这个函式的相关其他函式库! [root@www ~]# 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 等的版本!
更多推荐
所有评论(0)