
Eu construí um pacote rpm usando rpmbuild
e o pacote tem as seguintes dependências:
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
Estou tentando construí-lo em uma máquina rodando o openSUSE. No entanto, estou recebendo o seguinte erro de dependência:
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
Minha pergunta é em relação à dependência do libssl. Tenho os seguintes objetos compartilhados existentes em meu 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
Minha pergunta é: Por que o RPM está me dando o erro se eu o libssl.so.1.1
instalei? Meu pacote RPM depende libssl.so.1.0.0
, então não deveria ser compatível? Até onde eu sei, o primeiro número define a compatibilidade da ABI entre os objetos compartilhados, portanto 1.1
deve funcionar bem com 1.0
dependency .
Finalmente, se eu executar:
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
Agora, tendo /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
Responder1
Minha pergunta é: Por que o RPM está me dando o erro se eu o
libssl.so.1.1
instalei?
Seu RPM requer libssl.so.1.0.0
, não libssl.so.1.1
(veja abaixo).
Meu pacote RPM depende
libssl.so.1.0.0
, então não deveria ser compatível? Até onde eu sei, o primeiro número define a compatibilidade da ABI entre os objetos compartilhados, portanto1.1
deve funcionar bem com1.0
dependência (corrija-me se estiver errado).
Muitos projetos usam o número principal como indicador de compatibilidade com versões anteriores, mas não é um requisito. O que é necessário é que diferentes versões de bibliotecas com o mesmo soname sejam compatíveis. É por isso que os requisitos RPM são expressos como sonames e símbolos de biblioteca ( libc.so.6
, GLIBC_2.14
): o soname indica qual biblioteca é necessária, com qual soname, e os símbolos indicam qual versão da biblioteca é necessária (ou posterior). A garantia (dos desenvolvedores da biblioteca) funciona assim: qualquer programa compilado com uma determinada versão de uma biblioteca pode ser utilizado com essa versão ou qualquer posterior, desde que o soname permaneça o mesmo; e qualquer programa compilado com um determinado conjunto de símbolos de biblioteca versionados pode ser usado com qualquer versão da biblioteca, com o mesmo soname, que também fornece todos esses símbolos de biblioteca versionados.
libssl
1.1 não é compatível com versões anteriores de 1.0; na verdade, a migração é bastante difícil. Um programa compilado em libssl
1.0 não pode ser usado com libssl
1.1. Para assinalar este facto, as bibliotecas têm nomes diferentes.