以下を使用して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を使用してすべてのバージョンのライブラリで使用でき、これらすべてのバージョンのライブラリシンボルも提供します。
libssl
1.1は1.0以前と互換性がありません。実際、移行は非常に困難です。 1.0用にコンパイルされたプログラムは1.1libssl
では動作しませんlibssl
。この事実を示すために、これらのライブラリには異なる名前があります。