Как на самом деле версионируются разделяемые библиотеки в Linux?

Вероятно, это не самый чистый способ, но с помощьюawk:

awk -F= -v OFS=\= '$2 != ""{
        "printf "$2" | od -A n -t x1 | tr -s \" \"" | getline $2;
        gsub(/^ | $/,"",$2);
        gsub(/\s/, ",",$2);
}1' input

Это будет использовать =в качестве разделителя полей, и если второе поле существует, оно выполнит для него od -A n -t x1, сократит все пробелы, обрежет начальный и конечный пробелы и преобразует все оставшиеся пробелы в запятую.

2
22.04.2020, 23:08
2 ответа

Типичное ожидание в Linux состоит в том, что разделяемая библиотека имеет вид libfoo.so.N, где N — целое число. Также возможно, что он имеет формы с дополнительными целыми числами, которые могут иметь дополнительное значение в зависимости от того, какое соглашение вы используете (libtool или иным образом ). Можно использовать и другие формы, и некоторые библиотеки, такие как OpenSSL, это делают.

Частью правильной общей библиотеки в Linux является запись ELF SONAME, которая определяет имя общего объекта для двоичного файла. Например, с libz:

$ readelf -a /lib/x86_64-linux-gnu/libz.so.1 | grep SONAME
 0x000000000000000e (SONAME)             Library soname: [libz.so.1]

Вы видите, что в этом случае SONAME libz.so.1. Когда ваши двоичные файлы связываются с этой общей библиотекой, в нее будет встроен раздел NEEDED. Динамический компоновщик при разрешении разделяемых библиотек будет искать в пути поиска разделяемую библиотеку с именем, эквивалентным SONAME. Например, для Git требуются эти четыре общие библиотеки:

$ readelf -a /usr/bin/git | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libpcre2-8.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

Таким образом, на практике имеет значение то, что находится в SONAME, что эквивалентно основной версии семантически версионного фрагмента кода. Внесение несовместимых изменений в разделяемую библиотеку без изменения SONAME (обычно до следующего целочисленного значения )является серьезной ошибкой, которая приведет к тому, что на ваш проект обрушатся полчища разгневанных пользователей (и это правильно ).

Таким образом, это не имеет большого значения для частей общей библиотеки, которые не являются частью SONAME. Соглашение libtool и соглашение о семантическом управлении версиями делают первое целое число после .soчасти имени версией для несовместимых изменений, которые оба делают одно и то же. Поскольку это та часть, которая обычно находится в SONAME, для этой цели они эквивалентны.

Я упомянул, что некоторые разделяемые библиотеки делают разные вещи. Например, OpenSSL имеет libssl.so.1.1и libcrypto.so.1.1в качестве общих библиотек SONAME, которые он использует. Хотя это не рекомендуемое соглашение, оно работает. Однако в будущих версиях они переходят на семантическое управление версиями.потому что люди находят это запутанным.

4
19.03.2021, 02:26

Нашел то же, что и ты:

C:R:Aсопоставляется с(C-A).A.R

Я нашел документацию здесь , но в них не очень понятно, что это будет делать.

1
19.03.2021, 02:26

Теги

Похожие вопросы