
Я собрал пакет rpm с помощью rpmbuild
, и у пакета есть следующие зависимости:
51f32ecb00b7:/rpm # rpm -qpR pkg.rpm
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.5)(64bit)
libc.so.6(GLIBC_2.7)(64bit)
libcrypto.so.1.0.0()(64bit)
libcurl.so.4()(64bit)
libdl.so.2()(64bit)
libdl.so.2(GLIBC_2.2.5)(64bit)
libjson-c.so.2()(64bit)
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libpthread.so.0(GLIBC_2.3.2)(64bit)
libssl.so.1.0.0()(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
Я пытаюсь собрать его на машине с openSUSE. Однако я получаю следующую ошибку зависимости:
51f32ecb00b7:/rpm # rpm -U pkg.rpm
error: Failed dependencies:
libcrypto.so.1.0.0()(64bit) is needed by pkg.noarch
libjson-c.so.2()(64bit) is needed by pkg.noarch
libssl.so.1.0.0()(64bit) is needed by pkg.noarch
Мой вопрос касается зависимости libssl. В моей системе существуют следующие общие объекты:
51f32ecb00b7:/rpm # find / | grep libssl*.so
/lib64/libss.so.2
/lib64/libss.so.2.0
/usr/lib64/libss.so.2
/usr/lib64/libss.so.2.0
/usr/lib64/libssl.so.1.1
Мой вопрос: Почему RPM выдает мне ошибку, если я установил libssl.so.1.1
? Мой пакет RPM зависит от libssl.so.1.0.0
, так что он не должен быть совместим? Насколько я знаю, первое число определяет совместимость ABI между общими объектами, так что 1.1
должно работать нормально с 1.0
зависимостью .
Наконец, если я запущу:
51f32ecb00b7:/rpm # zypper install libopenssl1_0_0
51f32ecb00b7:/rpm # find / | grep libssl*.so
/lib64/libss.so.2
/lib64/libss.so.2.0
/usr/lib64/libss.so.2
/usr/lib64/libss.so.2.0
/usr/lib64/libssl.so.1.1
/usr/lib64/libssl.so.1.0.0
Теперь, имея /usr/lib64/libssl.so.1.0.0
, это работает:
51f32ecb00b7:/rpm # rpm -U pkg.rpm
error: Failed dependencies:
libjson-c.so.2()(64bit) is needed by pkg.noarch
решение1
У меня вопрос: почему RPM выдает ошибку, если я его
libssl.so.1.1
установил?
Вашему RPM требуется libssl.so.1.0.0
, а не libssl.so.1.1
(см. ниже).
Мой пакет RPM зависит от
libssl.so.1.0.0
, так что разве он не должен быть совместим? Насколько мне известно, первое число определяет совместимость ABI между общими объектами, так что1.1
должно работать нормально с1.0
зависимостью (поправьте меня, если я ошибаюсь).
Многие проекты используют основной номер в качестве индикатора обратной совместимости, но это не обязательное требование. Требуется, чтобы разные версии библиотек с одинаковым soname были совместимы. Вот почему требования RPM выражаются в виде soname и библиотечных символов ( , libc.so.6
) GLIBC_2.14
: soname указывает, какая библиотека требуется, с каким soname, а символы указывают, какая версия библиотеки требуется (или более поздняя). Гарантия (от разработчиков библиотеки) работает следующим образом: любая программа, скомпилированная с заданной версией библиотеки, может использоваться с этой версией или любой более поздней, пока soname остается прежним; и любая программа, скомпилированная с заданным набором версионных библиотечных символов, может использоваться с любой версией библиотеки с тем же soname, которая также предоставляет все эти версионные библиотечные символы.
libssl
1.1 не имеет обратной совместимости с 1.0; на самом деле миграция довольно сложна. Программа, скомпилированная для libssl
1.0, не может использоваться с libssl
1.1. Чтобы отметить этот факт, библиотеки имеют разные sonames.