Вероятно, это не самый чистый способ, но с помощью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
, сократит все пробелы, обрежет начальный и конечный пробелы и преобразует все оставшиеся пробелы в запятую.
Типичное ожидание в 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, которые он использует. Хотя это не рекомендуемое соглашение, оно работает. Однако в будущих версиях они переходят на семантическое управление версиями.потому что люди находят это запутанным.