Почему RPM не принимает мой общий объект как зависимость?

Почему RPM не принимает мой общий объект как зависимость?

Я собрал пакет 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, которая также предоставляет все эти версионные библиотечные символы.

libssl1.1 не имеет обратной совместимости с 1.0; на самом деле миграция довольно сложна. Программа, скомпилированная для libssl1.0, не может использоваться с libssl1.1. Чтобы отметить этот факт, библиотеки имеют разные sonames.

Связанный контент