Por que o RPM não aceita meu objeto compartilhado como dependência?

Por que o RPM não aceita meu objeto compartilhado como dependência?

Eu construí um pacote rpm usando rpmbuilde 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.1instalei? 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.1deve funcionar bem com 1.0dependency .

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.1instalei?

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, portanto 1.1deve funcionar bem com 1.0dependê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.

libssl1.1 não é compatível com versões anteriores de 1.0; na verdade, a migração é bastante difícil. Um programa compilado em libssl1.0 não pode ser usado com libssl1.1. Para assinalar este facto, as bibliotecas têm nomes diferentes.

informação relacionada