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 호환성을 정의하므로 dependency 1.1와 잘 작동해야 합니다 1.0.

마지막으로 다음을 실행하면:

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 요구사항이 soname 및 라이브러리 기호( libc.so.6, GLIBC_2.14)로 표현되는 이유입니다. soname은 어떤 라이브러리가 필요한지, 어떤 soname이 필요한지를 나타내고, 기호는 필요한 라이브러리 버전(또는 그 이상)을 나타냅니다. (라이브러리 개발자의) 보증은 다음과 같이 작동합니다. 주어진 라이브러리 버전으로 컴파일된 모든 프로그램은 soname이 동일하게 유지되는 한 해당 버전이나 이후 버전에서 사용할 수 있습니다. 특정 버전의 라이브러리 기호 세트에 대해 컴파일된 모든 프로그램은 모든 버전의 라이브러리 기호도 제공하는 동일한 soname을 사용하여 모든 버전의 라이브러리에서 사용할 수 있습니다.

libssl1.1은 1.0과 이전 버전과 호환되지 않습니다. 실제로 마이그레이션은 다소 어렵습니다. 1.0 에 대해 컴파일된 프로그램은 1.1 libssl에서 사용할 수 없습니다 libssl. 이 사실을 표시하기 위해 도서관에는 다른 이름이 있습니다.

관련 정보