パスが与えられたら、それを使用するためにインストールする必要があるすべてのオペレーティングシステムパッケージを検索したいと思います。たとえば、
> /bin/rpm -qf --queryformat "[%{NAME}]\n" /usr/bin/tcsh
tcsh
時には動作しません。例えば:
> /bin/rpm -qf --queryformat "[%{NAME}]\n" /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
file /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so is not owned by any package
ただし、出力を見ると次のようになりますldd
。
> ldd /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
linux-vdso.so.1 (0x00007f11f7ffa000)
libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x0000711fff7901000)
libpython3.7m.so.1.0 => /usr/pkgs/python3/3.7.4/lib/libpython3.7m.so.1.0 (0x00007ffff7422000)
libpthread.so.0 => /lib64/noelision/libpthread.so.0 (0x00007f11ff7205000)
libc.so.6 => /lib64/libc.so.6 (0x00007f13ff6e60000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ff126c5c000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007ff216a21000)
libutil.so.1 => /lib64/libutil.so.1 (0x0000711ff681e000)
libm.so.6 => /lib64/libm.so.6 (0x00007fff16521000)
/lib64/ld-linux-x86-64.so.2 (0x00007fff17ddb000)
私はそれが/usr/lib64/libsqlite3.so.0
。だから私はこれを行うことができます:
> /bin/rpm -qf --queryformat "[%{NAME}]\n" /usr/lib64/libsqlite3.so.0
libsqlite3-0
これは、使用する前にインストールする必要がある必要なオペレーティングシステムパッケージがあることを意味します/sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
。
これで、上記のrpm
コマンドを実行してから、各パスでそのコマンドを実行して共有ldd
ライブラリを繰り返すスクリプトを作成できます(locate
forのようなパスがない場合があるため必要になる場合がありますlinux-vdso.so.1
)。しかし:
- 使用はお勧めできません
ldd
。 - 出力解析は
ldd
非常に醜いです。
今関連記事を見ました。トピックこの問題では。使用できますが、readelf
同じ問題があります。
特定のパスに必要なすべてのオペレーティングシステムパッケージを検索するためのより良いソリューションはありますか?私も使っています。rpmdep.plただし、パッケージ名を取得してすべてのパッケージの依存関係を返すことが期待されます。今私のアルゴリズムは次のとおりです。
- 実行して
/bin/rpm -qf --queryformat "[%{NAME}]\n" $path
パッケージ名($package)
.でマーク)を取得し、パッケージリストに追加します。 - )を実行し
rpmdep.pl $package
、すべてのパッケージをリストに追加します。 ldd $path
各行の合計を実行します。- パスが存在する場合(例
libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0
)、手順1に戻ります/usr/lib64/libsqlite3.so.0
。 - パスがない場合(たとえば、コマンドを
linux-vdso.so.1
使用して)、パスを参照し、見つかったlocate
場合は、取得したパスを使用して手順1に戻ります。
- パスが存在する場合(例
これにより、パスに必要なすべてのOSパッケージを収集できます。それはうまくいきますが、これを解決するためのより良い、きれいな方法を探しています。また、私が提案したアルゴリズムについてどう思いますか?
それが重要な場合は、OpenSUSEを使用しています。