【问题标题】:Why does libc have two version numbers (on Ubuntu)?为什么 libc 有两个版本号(在 Ubuntu 上)?
【发布时间】:2018-05-24 17:22:57
【问题描述】:

如果我在 Docker 的 ubuntu:latest 中运行它:

root@4304dfbfa661:/# ls lib/x86_64-linux-gnu/libc* -l
-rwxr-xr-x 1 root root 1868984 Jan 15 02:51 lib/x86_64-linux-gnu/libc-2.23.so
lrwxrwxrwx 1 root root      12 Jan 15 02:51 lib/x86_64-linux-gnu/libc.so.6 -> libc-2.23.so

libc 似乎同时编号为 6 和 2-23。为什么有两个版本号?

NB libc 是(特殊的)可执行文件,运行它会给出

root@4304dfbfa661:/# ./lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.23-0ubuntu10) stable release version 2.23, by Roland McGrath et al.

因此,令人惊讶的是libc.so.6libc [或准确地说,glibc] 是否有与版本号无关的 soname?

编辑:澄清一下,我理解符号链接。让我感到困惑的是两种编号方案的存在。如果你看例如libstdc++,你会发现

lrwxrwxrwx 1 root root     19 Sep 11  2017 ./usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19
-rwxr-xr-x 1 root root 995840 Aug  1  2017 ./usr/lib64/libstdc++.so.6.0.19

foo.so.6 作为foo.so.6.0.19 的符号链接是有意义的。将foo.so.6 作为foo-2.23.so 的符号链接令人困惑......

【问题讨论】:

  • /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.23.so 表示“libc.so.6”是“libc-2.23.so”的符号链接。 ...(运行时版本始终为“libc.so.6”,无论版本如何。) ....请查看其他库:大多数都以一两个符号链接的形式存在于主库中图书馆。
  • @Knud Larsen >运行时版本始终是'libc.so.6',无论版本如何这就是我试图理解的......是什么决定了运行时版本?什么时候改变?参照。编辑为 q。
  • 因为 'libc.so.6' 是一个符号链接,例如'libc-2.23.so' 它会改变,例如当你升级操作系统时。 .... Ubuntu 18.04 示例:libc.so.6 -> libc-2.27.so
  • @Knud Larsen 是的,明白了,但是为什么 2.23 版本的编号方案与 soname 编号方案完全不同?对比只有一种编号方案的 libstdc++... MAJOR.MINOR.PATCH。
  • 约定等tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html ,,, ,,, ibm.com/developerworks/linux/library/l-dynamic-libraries/… ... 但如果你是作者,任何命名都是你的决定。甚至可以构建为libname.so,仅此而已。 Glibc : 可以问gnu.org/software/libc

标签: libc


【解决方案1】:

让我感到困惑的是两种编号方案的存在。

在 GNU 符号版本控制发明之前,对 ABI 的任何更改要求引入全新版本的库,并且系统上必须存在两个(或更多)副本。

描述了外部库版本控制,例如here.

随着每个符号版本控制(GNU 符号版本控制)的引入,外部库版本控制变得完全变得不必要:单个库中可以支持多个 ABI。

这就是为什么libc.so.6 永远(1990 年代后期)一直使用版本 6。根本没有理由使用符号链接——库可以简单地命名为libc.so.6。但是,方便 有符号链接并让它指向 current 库版本,例如libc-2.27.so.

libstdc++.so卡在libstdc++.so.6不同:维护多个 C++ ABI 更加困难。因此库会随着每个 GCC 版本不断增加次要版本(较新的 GCC 需要较新版本的 libstdc++.so)。

但他们不会更改 .so.6 部分,因为这样做需要有多个 libstdc++.so 副本(这将共享 99% 的代码)。

【讨论】:

    猜你喜欢
    • 2015-03-29
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多