
Creé un paquete rpm usando rpmbuild
y 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.1
instalado? 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.1
debería funcionar bien con 1.0
la 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.1
instalado?
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 que1.1
debería funcionar bien con1.0
la 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.
libssl
1.1 no es compatible con versiones anteriores de 1.0; de hecho, la migración es bastante difícil. Un programa compilado con libssl
1.0 no se puede utilizar con libssl
1.1. Para marcar este hecho, las bibliotecas tienen diferentes sonames.