我对共享库在 linux 上的工作方式一窍不通。我正在尝试了解应用程序如何在 linux 上运行时解析同一共享库的不同版本。
据我了解,一个共享库有三个“名字”,例如,
当您通过 LDCONFIG 安装库时,它将创建以下符号链接(symbolic link)
现在假设我使用以下实名编译同一库的另一个版本, 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
拥有 xyz.so.1
的 SONAME
。
当链接器链接到 xyz.so
时,它会一直跟随链接到 xyz.so.1.5
并使用它的 SONAME
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
链接的人将获得特定主要版本的特定次要版本。在我们检查您的评论时,请记住最后一段:
Now lets say I compile another version of the same library with the following real-name,
libmy.so.2.0
. The SONAME by guidelines would belibmy.so.2.0
.
不,我不这么认为。 soname
更可能是 libmy.so.2
以便您可以对 2.x
流进行小幅更新并获得最新行为。
https://stackoverflow.com/questions/3839756/