我对共享库在Linux上的工作方式不了解。我试图了解应用程序如何在Linux上运行时解析同一共享库的不同修订版。
据我了解,共享库具有三个“名称”,例如,
通过LDCONFIG安装库时,它将创建以下符号链接
现在让我们说我用以下实名libmy.so.2.0编译同一库的另一个版本。根据指南,SONAME将为libmy.so.2.0
在应用程序链接时,我将使用“ -l”标志提供的链接器名称是什么。遵循我阅读的指南(http://www.dwheeler.com/program-library/Program-Library-HOWTO/x36.htm l),它不是必须是libmy.so吗?如果是的话,两个版本的版本如何obj文件的区别?
共享对象的版本控制如下:
创建共享库时,您要给它一个真实名称和一个soname
。这些用于安装共享库(创建共享库和指向共享库的链接)。
因此,您可能会遇到以下情况:
pax> ls -al xyz*
-rw-r--r-- 1 pax paxgroup 12345 Nov 18 2009 xyz.so.1.5
lrwxrwxrwx 1 pax paxgroup 0 Nov 18 2009 xyz.so.1 -> xyz.so.1.5
lrwxrwxrwx 1 pax paxgroup 0 Nov 18 2009 xyz.so -> xyz.so.1
与xyz.so.1.5
拥有的SONAME
的xyz.so.1
。
当链接器链接到时xyz.so
,它会一直链接到xyz.so.1.5
并使用它的SONAME
of xyz.so.1
存储在可执行文件中。然后,当您运行该可执行文件时,它会尝试加载xyz.so.1
指向某个特定文件xyz.so.1.N
(不一定是1.5版)的文件。
因此,您可以安装xyz.so.1.6
和更新xyz.so.1
链接以指向该链接,而已经链接的可执行文件将使用该链接。
这种多层方法的一个优点是,您可以拥有多个同名(xyz.so.1.*
,xyz.so.2.*
)的潜在不兼容库,但是在每个主要版本中,由于它们应该兼容,因此可以自由升级它们。
链接新的可执行文件时:
xyz.so
将获得最新主要版本的最新次要版本。xyz.so.1
将获得特定主要版本的最新次要版本。xyz.so.1.2
将获得特定主要版本的特定次要版本。现在,当我们检查您的评论时,请记住最后一段:
现在让我们说我用以下实名编译同一库的另一个版本
libmy.so.2.0
。根据指南,SONAME为libmy.so.2.0
。
不,我不相信。该soname
会更可能是libmy.so.2
这样,你可以做轻微的更新到2.x
流并获得最新的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句