wintelx 2015-03-06
Linux中的.so文件 是动态链接的产物
共享库理解为提供各种功能函数的集合,对外提供标准的接口
Linux中命名系统中共享库的规则
主版本号:不同的版本号之间不兼容
次版本号:增量升级 向后兼容
发行版本号:对应次版本的错误修正和性能提升,不影响兼容性
Linux中的共享库并不都是这样的格式
比如GLibc的共享库命名为:libc-x.y.z.so
动态链接器也是GLibc的一部分,使用ld-x.y.z.so命名
libm(数学库)等
SO-NAME机制
系统和程序中要链接的共享库的格式一般为:libname.so.x
一般是一个纸箱系统中主版本号相同、次版本号最高的同名共享库,目的是保证在兼容的前提下使用最新的版本
在可执行文件(Linux中为ELF文件)的相关字段中保存的就是SO-NAME
当共享库升级的时候,有一下两种情况:
1)主版本号不变,说明共享库只是做了增量升级(保证原来的所有都不改变,在此基础上添加新的接口),并不影响原先的程序运行的正确性
此时,原来的版本不需要存在,所有用新的共享文件库文件替换现有的老版本(次版本号比较低的)文件,然后运行ldconfig[后文会讲]就可以了
2)主版本号改变,此时升级的时候需要保留原来的老版本的共享库(为了兼容原来以来此版本共享库的可执行程序),同时需要保存新的版本的共享库
Linux中的ldconfig
当系统中安装或者更新一个共享库的时候需要更新软链接和动态链接器查找文件
所以应该及时运行ldconfig
ldconfig的作用就是遍历所有的保存共享库的目录/lib /usr/lib等,根据实际的共享库的版本更新软链接
在GCC编译的时使用共享库的形式比较简单,并不需要拼写SO-NAME等
gcc -o hello hello.c -lNAME
利用上面的形式便可以链接到 libNAME.so.x.y.z(系统中的版本)
动态链接器按照下列顺序依次装载或者查找共享对象
1)由环境变量 LD_LIBRARY_PATH指定的路径
2)由路径缓存文件/etc/ld.so.cache指定的路径
3)默认共享目录 先/usr/lib 再/lib
其中LD_LIBRARY_PATH是一个环境变量,当指定某个程序的LD_LIBRARY_PATH时
动态链接器在查找共享库的时候,会首先从指定的路径开始查找