Last Updated: 2023-07-10 10:03:30 Monday
-- TOC --
Linux下动态链接库的名称和存放路径,自有一套与Windows不同的规则。
一般来说,Linux下的动态链接库,命名都按照如下规则:
lib<name>.so.x.y.z
libc和动态链接器ld的名称,没有遵守此规范。
只保留主版本号的动态链接库名称,就是所谓的SO-NAME。
lib<name>.so.x
具有SO-NAME名称的文件,一般都是一个符号链接,指向系统中(甚至是相同路径下的)主版本号相同,次版本和发行版本最大的动态链接文件。所有依赖于某个动态链接的程序,都以SO-NAME为准,进行编译链接和运行。只要主版本号不变,次版本和发型版本升级,(应该)不会导致兼容性的问题。只要主版本变化,系统中就要保存多份不同主版本号的SO-NAME符号链接文件。
SO-NAME是动态链接库的接口标识。
这是针对Linux下编译时所使用的动态链接库的名称的一个术语,比如:
$ gcc ... -labc
-labc
表示链接libabc.so.max_x这个SO-NAME指向的库文件。
一般x64系统,动态链接库的存放路径为/lib64
。
/lib
下也有一些库文件,不清楚区别是啥?/usr/lib64
和/usr/lib
只是符号链接动态链接库的搜索路径
这是很多人使用Linux时遇到的问题,运行一个程序,系统提示xxxx库找不到....崩溃...
Linux系统的动态链接器(ld-linux.so),在搜索动态链接库文件的时候,默认是按照/etc/ld.so.cache
中的数据进行查找,此文件保存了已排好序的动态链接库名字列表,此文件内包含的库文件来自所谓trusted directories(/lib64
和/lib
),还有来自/etc/ld.so.conf
文件中配置的路径。
/etc/ld.so.cache
File containing an ordered list of libraries found in the directories specified in
/etc/ld.so.conf
, as well as those found in thetrusted directories
.
当我们在Linux系统中安装了新的库文件后,如果这些库文件所在路径不在trusted directoreis中,我们需要手动将这些库文件的路径,添加到/etc/ld.so.conf
文件中去。最后,执行ldconfig
命令:
$ sudo ldconfig -v # -v means verbose
简单说下ldconfig命令的作用:
LD_LIBRARY_PATH是Linux系统下的环境变量名,类似于PATH。
这个环境变量用于在查找共享库(动态链接库)时,除了默认路径(./lib和./usr/lib)之外的其他路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/lib
即通过LD_LIBRARY_PATH增加动态链接器的搜索路径,我理解新增的路径会被优先搜索,一般都是这样。
Linux系统默认不会在当前路径搜索动态链接库!
Minor Version Rendezvous Problem
假设一个程序依赖某个SO-NAME的高y版本,但被部署到某个只有低y版本的系统中。此时,SO-NAME是OK的,但如果程序运行,会异常。
符号版本
给动态链接库中的符号也加上一个版本号,用来解决Minor Version Rendezvous Problem问题。但是这个机制貌似并没有被大多数动态链接采用,主要是glibc项目的20多个库在使用。
本文链接:https://cs.pynote.net/sf/linux/sys/202304181/
-- EOF --
-- MORE --