链接到具有软链接的共享库

时间:2012-03-27 02:42:14

标签: c linker

gcc c89

我只想链​​接下面的共享库。

我想知道为什么程序员创建了这么多软链接。程序员离开了公司,我只是想知道目的是什么。

lrwxrwxrwx. 1       24 Jan 11 11:23 libsofia-sip-ua.so -> libsofia-sip-ua.so.0.6.0
lrwxrwxrwx. 1       24 Jan 11 11:23 libsofia-sip-ua.so.0 -> libsofia-sip-ua.so.0.6.0
-rwxrwxr-x. 1  4728304 Jan 11 11:19 libsofia-sip-ua.so.0.6.0

如果要将库更新到更新的版本,我可以理解,您只需将其与更新版本进行软链接即可。

但为什么要创建libsofia-sip.so.0?

非常感谢任何建议,

2 个答案:

答案 0 :(得分:3)

当您使用.so选项指定要搜索/链接的库时,以-l结尾的文件名是链接器(非动态链接器)使用的文件名。链接器不知道其他后缀,也不会找到它们。当链接器打开此文件时,它会在库头的DT_SONAME字段中找到不同的名称,通常是带有单数后缀的名称。这是它将存储在新程序的动态链接标题的DT_NEEDED字段中的名称。

.so.N结尾的文件名(例如,在您的情况下为N = 0)是与库文件中的DT_SONAME对应的文件名,它代表一系列所有兼容的库版本ABI。

.so.N.X.Y结尾的文件名是当前安装的库版本的实际文件。这些可能存在多个,通常其他符号链接将设置为指向最新版本。但旧版本不会以这种方式自动覆盖,因此您可以手动加载LD_PRELOAD的旧版本,或者如果您需要降级,则替换符号链接。

答案 1 :(得分:1)

最有可能的是,图书馆的“真实姓名”是libsofia-sip-ua.so.0。这被编码到共享对象中。 libsofia-sip-ua.0.6.0名称可能只是它安装的名称。

可能是制作链接的ldconfig程序。我相信如果库文件有其他名称,它总是为嵌入名称建立一个链接。

所以可能不是程序员想要这些额外的链接。他或他的库构建工具将库文件命名为与库文件中嵌入的名称不同的名称。