Linux下函数库管理

来源:互联网 发布:诸葛亮知天下事 编辑:程序博客网 时间:2024/06/09 17:08

Linux下函数库管理

  • 简介

    在Linux操作系统中,函数库是很重要的一个项目,因为很多软件之间都会互相使用彼此提供的函数库来进行特殊功能的运行,例如很多需要验证身份的程序都习惯利用PAM这个模块提供的验证机制来实作,而很多网络联机机制则习惯利用SSL函数来进行联机加密的机制。所以说,函数库的利用很重要。而函数库依照是否被编译到程序内部而分为动态和静态函数库。下面将分析一下动态库和静态库之间的差异。

  • 动态与静态函数库

    函数库依据使用类型分为两大类:静态函数和动态函数库。

    • 静态函数库

      • 扩展名(为.a):这类的函数库通常扩展名为libxxx.a的类型;
      • 编译行为:这类函数库在编译的时候会直接整合到执行程序当中,所以利用静态函数库编译成的文件会比较大一些;
      • 独立执行的状态:这类函数库最大的有点是编译成功的可执行文件可以独立执行,而不需要再向外部要求读取函数库的内容;
      • 升级难易度:虽然可执行文件可以独立执行,但因为函数库是直接整合到可执行文件中,因此若函数库升级时,整个可执行文件必须要重新编译才能将新版的函数库整合到程序当中。即在升级方面,只要函数库升级了,所有将此函数内容的程序都需要重新编译。
    • 动态函数库

      • 扩展名(为.so):这类的函数库通常扩展名为libxxx.so的类型;
      • 编译行为:动态函数库和静态函数库的编译行为差异挺大的。与静态函数库被整个捕捉到的程序中不同,动态函数库在编译的时候,在程序里面只有一个“指向”的位置而已。即动态函数库的内容并没有被整合到可执行文件中,而是当可执行文件要使用到函数库的机制时,程序才会去读取函数库来使用。由于可执行文件当中仅具有指向动态函数库所在的指标而已,并不包含函数库的内容,所以它的文件会比较小一些;
      • 独立执行的状态:这类函数库所编译出来的程序不能被独立执行,因为当我们使用到函数库的机制时,程序才会去读取函数库,所以函数库文件必须要存在才行,而且,函数库的所在目录也不能改变,因为我们的可执行文件里面仅有“指标”,亦即当要取用改动态函数库时,程序会主动去某个路径下读取,所以动态函数库可不能随意移动或删除,会影响很多相关程序软件;
      • 升级难易度:虽然这类的可执行文件无法独立运行,然而由于具有指向的功能,所以,当函数升级后,可执行文件根本不需要进行重新编译的行为,因为可执行文件会直接指向新的函数库文件(前提是函数库新旧版本的文件名相同)。

    目前Linux下比较倾向使用动态函数库,因为动态函数库升级方便。由于Linux系统里面的软件相关性太复杂,如果使用太多的静态函数库,那么升级某一个函数库时,都会对整个系统造成很大的冲击,因为其他相关的可执行文件也要同时重新编译。而动态链接库升级时,其他软件根本不需变动。

    函数库放在Linux系统的什么位置?绝大多数的函数库都放置在/usr/lib、lib目录下。Linux系统里面很多的函数库是由Kernel提供的,而Kernel的库放在/lib/modules里面。注意:不同版本的内核提供的函数库差异性比较大,所以Kernel 2.4.xx版本的系统不要想将内核换成2.6.xx,很容易由于函数库的不同而导致很多原本可以执行的软件无法顺利运行。

  • ldconfig与/etc/ld.so.conf

    如何增加函数库的读取性能呢?由于内存的访问速度是硬盘的好几倍,所以,如果将常用到的动态链接库先加载到内存当中(缓存,cache),如下图,这样当使用动态函数库时,就不需要从头有硬盘里面读出,从而可以增进动态函数库的读取速度。此时就需要ldconfig和/etc/ld.so.conf协助了。

    • 将动态函数库加载高速缓存当中的步骤如下:

      • 首先,必须在/etc/ld.so.conf里面写下先到读入高速缓存当中的动态函数库所在的目录,注意,是目录而不是文件
      • 其次,利用ldconfig这个可执行文件将/etc/ld.so.conf的数据读入缓存当中
      • 同时,将数据记录一份在/etc/ld.so.cache这个文件当中。

    综上,ldconfig可以用来判断动态链接库的链接信息。其使用如下:

    ldconfig [-f conf] [-C cache]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的相关函数库读入缓存当中,从而加快函数库读取的效率:1)vi /etc/ld.so.conf    在最后添加/usr/mysql/lib2)ldconfig3)ldconfig -p 显示是否添加成功

    在某些时候,可能会自行加入某些Tarball安装的动态函数库,而想要让这些动态函数库的相关链接可以被读入缓存当中,此时可以将动态函数库所在的目录名称写入/etc/ld.so.conf当中,然后执行ldconfig即可。

  • 程序的动态函数库解析:ldd

    判断某个二进制文件含有什么动态库,需利用ldd命令,具体使用如下:

    ldd [-vdr] [filename]参数  :-v:列出所有内容信息;-d:重新将数据有丢失的link点显示出来-r:将ELF有关的错误内容显示出来举例:找出/usr/bin/passwd这个文件的函数库数据ldd /usr/bin/passwd举例:找出/lib/libc.so.6这个函数的相关其他函数库ldd -v /lib/lib.so.6

    可以利用ldd来观察相关函数库之间的相关性。ldconfig命令中的-v选项可以得知某个函数库来自于哪一个软件




- 参考文献:鸟哥的Linux私房菜

原创粉丝点击