动态链接库的名称和路径(ldconfig命令)

Last Updated: 2023-07-10 10:03:30 Monday

-- TOC --

Linux下动态链接库的名称和存放路径,自有一套与Windows不同的规则。

名称

一般来说,Linux下的动态链接库,命名都按照如下规则:

lib<name>.so.x.y.z

libc和动态链接器ld的名称,没有遵守此规范。

SO-NAME

只保留主版本号的动态链接库名称,就是所谓的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

动态链接库的搜索路径

这是很多人使用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 the trusted directories.

当我们在Linux系统中安装了新的库文件后,如果这些库文件所在路径不在trusted directoreis中,我们需要手动将这些库文件的路径,添加到/etc/ld.so.conf文件中去。最后,执行ldconfig命令:

$ sudo ldconfig -v  # -v means verbose

简单说下ldconfig命令的作用:

LD_LIBRARY_PATH环境变量

LD_LIBRARY_PATH是Linux系统下的环境变量名,类似于PATH。

这个环境变量用于在查找共享库(动态链接库)时,除了默认路径(./lib和./usr/lib)之外的其他路径。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/lib

即通过LD_LIBRARY_PATH增加动态链接器的搜索路径,我理解新增的路径会被优先搜索,一般都是这样。

Linux系统默认不会在当前路径搜索动态链接库!

次版本Rendezvous问题

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 --