¿Por qué RPM no acepta mi objeto compartido como dependencia?

¿Por qué RPM no acepta mi objeto compartido como dependencia?

Creé un paquete rpm usando rpmbuildy el paquete tiene las siguientes dependencias:

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

Estoy intentando compilarlo en una máquina que ejecuta openSUSE. Sin embargo, recibo el siguiente error de dependencia:

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

Mi pregunta es sobre la dependencia de libssl. Tengo los siguientes objetos compartidos existentes en mi sistema:

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

Mi pregunta es: ¿Por qué RPM me da el error si lo tengo libssl.so.1.1instalado? Mi paquete RPM depende de libssl.so.1.0.0, entonces, ¿no debería ser compatible? Hasta donde yo sé, el primer número define la compatibilidad ABI entre los objetos compartidos, por lo que 1.1debería funcionar bien con 1.0la dependencia.

Finalmente, si ejecuto:

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

Ahora, teniendo /usr/lib64/libssl.so.1.0.0, funciona:

51f32ecb00b7:/rpm # rpm -U pkg.rpm 
error: Failed dependencies:
    libjson-c.so.2()(64bit) is needed by pkg.noarch

Respuesta1

Mi pregunta es: ¿Por qué RPM me da el error si lo tengo libssl.so.1.1instalado?

Su RPM requiere libssl.so.1.0.0, no libssl.so.1.1(ver más abajo).

Mi paquete RPM depende de libssl.so.1.0.0, entonces, ¿no debería ser compatible? Hasta donde yo sé, el primer número define la compatibilidad ABI entre los objetos compartidos, por lo que 1.1debería funcionar bien con 1.0la dependencia (corríjame si me equivoco).

Muchos proyectos utilizan el número principal como indicador de compatibilidad con versiones anteriores, pero no es un requisito. Lo que se requiere es que diferentes versiones de bibliotecas con el mismo nombre sean compatibles. Es por eso que los requisitos de RPM se expresan como sonames y símbolos de biblioteca ( libc.so.6, GLIBC_2.14): el soname indica qué biblioteca se requiere, con qué soname y los símbolos indican qué versión de la biblioteca se necesita (o posterior). La garantía (de los desarrolladores de la biblioteca) funciona así: cualquier programa compilado con una versión determinada de una biblioteca puede usarse con esa versión o con cualquier versión posterior, siempre que el nombre sea el mismo; y cualquier programa compilado con un conjunto determinado de símbolos de biblioteca versionados se puede utilizar con cualquier versión de la biblioteca, con el mismo nombre, que también proporciona todos esos símbolos de biblioteca versionados.

libssl1.1 no es compatible con versiones anteriores de 1.0; de hecho, la migración es bastante difícil. Un programa compilado con libssl1.0 no se puede utilizar con libssl1.1. Para marcar este hecho, las bibliotecas tienen diferentes sonames.

información relacionada