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.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.1libsslでは動作しませんlibssl。この事実を示すために、これらのライブラリには異なる名前があります。

おすすめ記事