为什么 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.0dependency 。

最后,如果我运行:

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 要求被表示为 sonames 和库符号(libc.so.6, GLIBC_2.14):soname 指示需要哪个库,使用哪个 soname,符号指示需要哪个版本的库(或更高版本)。 (来自库开发人员的)保证是这样工作的:任何使用给定版本的库编译的程序都可以与该版本或任何更高版本一起使用,只要 soname 保持不变;并且针对给定的一组版本化库符号编译的任何程序都可以与任何版本的库一起使用,具有相同的soname,它也提供所有这些版本化库符号。

libssl1.1 不向后兼容 1.0;事实上迁移是相当困难的。针对 1.0 编译的程序libssl不能用于libssl1.1。为了标记这一事实,这些库具有不同的名称。

相关内容