[[diary/Kojima]]

・ライブラリの依存関係検索ツール

今年になってからの初の書き込み。。 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 しておけばいいのか。。

主にメンテナ向けのツールと思うけど、このページに添付しておくので、興味ある人はイジってみてくだされ。
- インストールされているパッケージ数に依存するけど、get_depends.py はそれなりに時間がかかる(手元では5分強くらい)。また、デバッグ情報もタレ流しているので、ファイル名が大量に表示されているのでご注意あれ。 -- [[kojima]] &new{2012-02-08 (水) 00:31:24};
- このページに添付しておくので、(どこ?) -- [[尾形]] &new{2012-02-08 (水) 07:05:37};
- 日別のページを開かないと添付ファイルはないのでした。 -- [[尾形]] &new{2012-02-09 (木) 06:42:09};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS