Почему у libc два номера версий (в Ubuntu)? - PullRequest
0 голосов
/ 24 мая 2018

Если я запускаю это в 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.6, что удивительно.Есть ли у libc [или, если быть точным, glibc] сонамы, не связанные с номерами версий?

Редактировать: , чтобы уточнить, я понимаю символическую ссылку.Что меня смущает, так это наличие двух схем нумерации.Если вы посмотрите, например, 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 сбивает с толку ...

1 Ответ

0 голосов
/ 28 мая 2018

Что меня смущает, так это существование двух схем нумерации.

До изобретения версии символов GNU любое изменение в ABI требовало , что является совершенно новымбыла введена версия библиотеки, и в системе должны были присутствовать две (или более) копии.

Описание внешней версии библиотеки описано, например, здесь .

Свведение контроля версий для каждого символа (управление версиями символов в GNU), управление версиями во внешней библиотеке стало полностью ненужным: в одной библиотеке можно поддерживать несколько ABI.

Именно поэтому libc.so.6 осталась в версии6 навсегда (конец 1990-х годов).Нет никакой причины иметь символическую ссылку вообще - библиотеку можно просто назвать libc.so.6.Однако удобно иметь символическую ссылку и указывать на текущую версию библиотеки, например, libc-2.27.so.

libstdc++.so также застрял на libstdc++.so.6, , но отличается: поддержка нескольких C ++ ABI гораздо сложнее.Таким образом, библиотека продолжает увеличивать младшую версию с каждой версией GCC (более новая версия GCC требует более новых версий libstdc++.so).

Но они не изменяют часть .so.6, потому что для этого потребуется иметь несколько libstdc++.soкопии (которые будут разделять 99% кода).

...