Linux中的.so文件 是动态链接的产物
同享库理解为提供各种功能函数的集合,对外提供标准的接口
Linux中命名系统中同享库的规则
主版本号:不同的版本号之间不兼容
次版本号:增量升级 向后兼容
发行版本号:对应次版本的毛病修正和性能提升,不影响兼容性
Linux中的同享库其实不都是这样的格式
比如GLibc的同享库命名为:libc-x.y.z.so
动态链接器也是GLibc的1部份,使用ld-x.y.z.so命名
libm(数学库)等
SO-NAME机制
系统和程序中要链接的同享库的格式1般为:libname.so.x
1般是1个纸箱系统中主版本号相同、次版本号最高的同名同享库,目的是保证在兼容的条件下使用最新的版本
在可履行文件(Linux中为ELF文件)的相干字段中保存的就是SO-NAME
当同享库升级的时候,有1下两种情况:
1)主版本号不变,说明同享库只是做了增量升级(保证原来的所有都不改变,在此基础上添加新的接口),其实不影响本来的程序运行的正确性
此时,原来的版本不需要存在,所有用新的同享文件库文件替换现有的老版本(次版本号比较低的)文件,然后运行ldconfig[后文会讲]就能够了
2)主版本号改变,此时升级的时候需要保存原来的老版本的同享库(为了兼容原来以来此版本同享库的可履行程序),同时需要保存新的版本的同享库
Linux中的ldconfig
当系统中安装或更新1个同享库的时候需要更新软链接和动态链接器查找文件
所以应当及时运行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是1个环境变量,当指定某个程序的LD_LIBRARY_PATH时
动态链接器在查找同享库的时候,会首先从指定的路径开始查找