
При исследовании двоичного файла C++ я обнаружил, что libstdc++.so.6
он динамически связан с libm.so.6
и libc.so.6
:
$ ldd /lib/x86_64-linux-gnu/libstdc++.so.6
linux-vdso.so.1 (0x00007ffcb737b000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd3b2295000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd3b1c00000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd3b2396000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd3b2275000)
У меня есть вопросы:
Что
6
означает в названии? Я изначально думал, что это версия glibc, но версия —2.35
, что не имеет отношения к6
.$ strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_2.3 GLIBC_2.3 ... GLIBC_2.35
Почему этот суффикс
6
так популярен?Есть ли график
libc.so.7
выхода?
решение1
Суффикс 6 используется по историческим причинам, подробно описанным вman libc
на Linux. По сути, в Linux использовалась форк библиотеки GNU C; она выпустила основные версии с 2 по 5. Версия 5 использовала ELF и была опубликована с общей библиотекой soname libc.so.5
. Когда версия 2 библиотеки GNU C была выпущена на Linux, она использовала общую библиотеку soname, libc.so.6
чтобы избежать путаницы с более ранними библиотеками.
Связанные библиотеки используют тот же суффикс. Некоторые архитектуры используют немного другой суффикс; например, библиотека GNU C на Alpha и Itanium — libc.so.6.1
.
Библиотека GNU C имеет прочную историю обратной совместимости и использует множество различных механизмов для поддержки внесения существенных изменений без нарушения старых двоичных файлов (включая версионные символы). Новое soname ( libc.so.7
) будет использоваться только в случае, если критически важное изменение, которое нельзя было бы смягчить, было бы абсолютно необходимо, поэтому маловероятно, что мы увидим его в ближайшее время.
решение2
Это ABI (Двоичный интерфейс приложения) версия.
Он увеличивается только при внесении критических изменений, чего теперь настоятельно не следует делать libc
, поэтому большинство дистрибутивов работают libc.so.6
уже некоторое время.
В целом, это позволяет нескольким несовместимым версиям библиотеки существовать в системе одновременно, поддерживая различные приложения, созданные для разных версий.
Например, Ubuntu 18.04 предоставляет libcurl.so.3
(через пакет libcurl3
) и libcurl.so.4
(через пакет libcurl4
), оба построены на основе cURL версии 7.58.0.