・ライブラリの依存関係検索ツール
今年になってからの初の書き込み。。 orz
ここしばらく、x86用の環境整備と新しいバージョンが出ているパッケージの更新を平行して進めているのだけど、 gtk回りとかをイジりだすとライブラリの依存関係が複雑で、あるライブラリを更新すると、 そのライブラリを使っている複数のパッケージも合わせて更新しないといけないことがよく起きる。 その際、どのバイナリファイルがこのライブラリに依存しているかを調べるのに、いちいちfindとlddを組み合わせて使うのも面倒なので、 SQLiteの勉強を兼ねて、ある時点での依存関係情報をデータベースに書き込んで、そこから検索するようなPythonのスクリプトを書いてみた。
get_depends.py を実行すると、/sbin や /usr、/lib64 等のバイナリファイルのありそうなディレクトリをなめて、 あるバイナリが依存しているライブラリの情報をかき集めて、同じディレクトリの ./depends.sql3 というDBファイルに書き込む。
そうして作ったファイルから、query_depends.py で、バイナリが使っているライブラリを探したり、ライブラリを使っているバイナリを調べることができる。 具体的にはこんな感じ。
-b オプションでバイナリの名前の一部を指定すれば、そのバイナリが使っているライブラリを表示する(正引き)。
$ ./query_depends.py -b bash bash needs these libraries linux-vdso.so.1(none) libreadline.so.6(/lib64/libreadline.so.6) libncursesw.so.5(/lib64/libncursesw.so.5) libdl.so.2(/lib64/libdl.so.2) libc.so.6(/lib64/libc.so.6) /lib64/ld-linux-x86-64.so.2(/lib64/ld-linux-x86-64.so.2) dbus-bash-completion-helper needs these libraries linux-vdso.so.1(none) libglib-2.0.so.0(/usr/lib64/libglib-2.0.so.0) libdbus-1.so.3(/usr/lib64/libdbus-1.so.3) ...
-s オプションで、ライブラリの名前の一部を指定すれば、そのライブラリを使っているバイナリを表示する(逆引き)。
$ ./query_depends.py -s libexpat | less libexpat.so.1 used by these binaries wpa_gui(/usr/bin/wpa_gui) fc-cache(/usr/bin/fc-cache) fc-cat(/usr/bin/fc-cat) fc-list(/usr/bin/fc-list) fc-match(/usr/bin/fc-match) fc-query(/usr/bin/fc-query) ...
正引き、逆引きそれぞれ、パス名も検索対象にすることができて、正引きの場合は -p オプションを指定すれば あるディレクトリにあるバイナリファイルがそれぞれどのライブラリを使っているかを表示できる。
$ ./query_depends.py -p /usr/heimdal/lib | less /usr/heimdal/lib64/libasn1.so.8.0.0 needs these libraries linux-vdso.so.1(none) libcom_err.so.2(/lib64/libcom_err.so.2) libroken.so.18(/usr/heimdal/lib64/libroken.so.18) libcrypt.so.1(/lib64/libcrypt.so.1) ... /usr/heimdal/lib64/libeditline.so.0.0.0 needs these libraries linux-vdso.so.1(none) libncursesw.so.5(/lib64/libncursesw.so.5) libresolv.so.2(/lib64/libresolv.so.2) ...
# もともとは、-b cat とかすると一杯マッチしすぎて不便なので-p /bin/cat と、対象を限定するために入れたオプション
逆引きの場合は、-r オプションを指定すれば、あるディレクトリのライブラリそれぞれを、 どのようなバイナリが利用しているかが分かる。
$ ./query_depends.py -r /usr/heimdal/lib | less /usr/heimdal/lib64/libasn1.so.8 used by these binaries mplayer(/usr/bin/mplayer) mencoder(/usr/bin/mencoder) smbclient(/usr/bin/smbclient) net(/usr/bin/net) ... /usr/heimdal/lib64/libeditline.so.0 used by these binaries libsl.so.0.2.1(/usr/heimdal/lib64/libsl.so.0.2.1) kdigest(/usr/heimdal/libexec/kdigest) hxtool(/usr/heimdal/bin/hxtool) ...
インストールされているバイナリファイルは環境ごとに異なるので、 依存関係データベース(./depends.sql3)も環境ごとに生成する必要がある。 また、パッケージの追加や削除をデータベースファイルに連動させる方法がないので、 データベースを更新するには、古いファイルを削除して、get_depends.py スクリプトを再実行する必要がある。
# 別に削除しなくても、init_db()の中で drop table しておけばいいのか。。
主にメンテナ向けのツールと思うけど、このページに添付しておくので、興味ある人はイジってみてくだされ。