linux - 应用程序如何在运行时解析为不同版本的共享库?

我对共享库在 linux 上的工作方式一窍不通。我正在尝试了解应用程序如何在 linux 上运行时解析同一共享库的不同版本。

据我了解,一个共享库有三个“名字”,例如,

  1. libmy.so.1.2(实名即实际的obj文件)
  2. libmy.so.1(SONAME,嵌入在实际的 obj 文件中)
  3. libmy.so(链接器名称,在链接时提供给链接器并嵌入在可执行文件中)

当您通过 LDCONFIG 安装库时,它将创建以下符号链接(symbolic link)

  • (2) => (1)
  • (3) => (2)

现在假设我使用以下实名编译同一库的另一个版本, 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.1SONAME

当链接器链接到 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 be libmy.so.2.0.

不,我不这么认为。 soname 更可能是 libmy.so.2 以便您可以对 2.x 流进行小幅更新并获得最新行为。

https://stackoverflow.com/questions/3839756/

相关文章:

linux - 使用 'sudo apt-get install build-essentials'

linux - RealUID,保存的 UID,有效的 UID。这是怎么回事?

linux - 需要对 Linux bash 内置 exec 命令行为的解释

linux - 如何制作和应用SVN补丁?

linux - 如何排除 tar 的绝对路径?

linux - 如何找出哪个进程正在消耗 "wait CPU"(即 I/O 阻塞)

linux - vagrant up 时等待机器启动时超时

linux - 让 Tk 看起来像一个原生 Linux 应用程序

linux - 当我在脚本中使用它时,无法关闭带有 echo "^]"的 scpi(telnet)

python - 如何在 Linux 上使用 Python 检查进程是否仍在运行?