所谓程序库可以理解为被多个Linux软件项目重复使用的代码集,它可以简化编程,实现代码的重复使用,而且它们往往经过了许多调试的测试,因此更加稳定。 Linux下的库分为动态库和静态库两大类,它们的差别仅仅是在程序执行时动态加载还是在编译时静态加载的。
Linux的库一般是在/lib或者/usr/lib目录下,而lib是library的缩写,它主要存放系统的链接库文件,没有该目录则系统无法正常运行。而/lib目录则是存储着程序运行时使用的共享库,通过共享库,许多程序可以重复使用相同的代码,并且这些库可以存储在一个公共的位置上,能够减小程序的大小。
因为在Linux下在绝大多数情况下都是使用C语言,而在Linux下最常用的C语言编译器是gcc,它的全称是GNU Compiler Collection,而且GCC是直接建立在内核基础上的,是Linux操作系统外层的图形界面开发工具(Qt、GTK++)和网络应用开发工具的基础和过渡。
而Glibc则是GNU的C语言库,它不需要修改就可以使用,截至Red Hat9.0,使用的Glibc版本是2.3.2.库的命名比较简单,第一个特点就是所有的库都以lib开头,gcc命令会在-l选项所指定的文件名前面自动加入lib,第二个特点就是以.a结尾的为静态库,而以.so结尾的是动态库。默认情况下,gcc在链接时优先使用共享库,只有当共享库不存在时才考虑使用静态库。
库的编号格式为library_name.major_num.minor_num.pathch_num,比如libgdbm.so.0.1.2,其中libgdbm是库名,而0是主版本号,1是次版本号,0是补丁级别号,也可以叫做发行号。而libgdbm.so.0.1.2所在的目录是/usr/lib,而且它是ELF格式的文件,也就是Executable and Linking Format,运行时由系统将其装入内存开始执行。
而ELF主要有三种类型:
(1)适用连接的可重定位文件,也就是Relocatable File,它可以与其他目标文件一起创建可执行文件和共享目标文件。
(2)适用于执行的可执行文件,也就是Executable File,它用于提供程序的进程映像,加载到内存执行。
(3)共享目标文件,也就是Shared Object File,连接器可以将它与其他可重定位文件和共享目标文件连接成其它的目标文件,动态连接器有可以将它与可执行文件和其他共享目标文件结合起来创建一个进程映像。
ldd是Library Dependency Display的缩写,它的作用是显示一个可执行程序必须使用的共享库,
它的命令格式是:ldd [选项] 文件名 ,
其中参数-d执行重定位并报告丢失的函数,
而-r执行对函数和数据对象的重定位,并报告丢失的函数和数据对象。
比如我们要查看perl的使用的共享库,我们可以使用ldd /usr/bin/perl这个命令。
ldconfig的命令的作用是决定位于目录/usr/lib和/lib下的共享库所需的运行连接,这些链接保存在的Libs保存在/etc/ld.so.conf文件中,搜索出可以共享的动态链接库,格式比如lib.*和so.*,进而创建出动态装入程序ld.so所需的连接和缓存文件,缓存文件默认为/etc/ld.so.cache,此文件保存已经排好序的动态链接库名字列表。
ldconfig的命令格式是ldconfig [选项] [libs] ,
其中参数-v或者--verbose是将显示正在扫描的目录、搜索到的动态链接库,以及它所创建的连接的名字,
其中参数-f指定动态链接库的配置文件,默认的配置文件是/etc/ld.so.conf,
其中参数-C是指定生成的缓存文件,系统默认的是/etc/ld.so.cache,文件存放已经排好序的可共享的动态链接库的列表
其中参数-p或者--print-cache是打印出当前缓存文件保存的所有共享库的名字
其中参数-r改变应用程序的根目录
其中参数-n为进扫描指定的目录,不扫描默认目录(/lib、/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录
运行没有选项的ldconfig命令时,用于更新高速缓冲文件,这个命令主要用于告诉缓冲DNS服务器,告诉缓冲DNS服务器的远离是提供查询的历史记录,并且利用这些记录来提高查询的效率
当某个查询是第一次被发送到高速缓冲DNS服务器时,高速缓冲DNS服务器就将此查询记录的整个过程记录下来,在一定的时期内用它来回答所有相同的查询,从而减少整个DNS系统的负担并且提高查询速度
如果用户想知道系统中有哪些动态链接库的时候,可以使用ldconfig -p来输出所有的动态链接库列表。