ソースコード・リテラシーのススメ

第17回 バイナリパッケージを読む

この記事を読むのに必要な時間:およそ 4 分

バイナリパッケージ展開の実例

取り出したバイナリファイルは必要なライブラリが揃っていないと動きませんので,まずは lddで必要なライブラリを調べてみましょう。

たとえば,以下の例はrpm.livna.orgのFedora 9用のレポジトリから入手した xv パッケージ(xv-3.10a.jumbopatch.20070520-5.lvn9.i386.rpm)を展開し,必要なライブラリを確認している例です。

$ rpm2cpio xv-3.10a.jumbopatch.20070520-5.lvn9.i386.rpm | cpio -ivd 
CPIO archive found!
./usr/bin/bggen
./usr/bin/vdcomp
./usr/bin/xcmap
./usr/bin/xv
...
2188 blocks
$ ldd ./usr/bin/xv
linux-gate.so.1 =>  (0xffffe000)
libtiff.so.3 => /usr/lib/libtiff.so.3 (0xb7f65000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0xb7f46000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb7f24000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7f11000)
libjasper.so.1 => not found
libX11.so.6 => /usr/X11/lib/libX11.so.6 (0xb7e2b000)
...

lddでxvに必要なライブラリを調べたところ,libjasperというライブラリが見つかりませんでした。libjasperというのはどういうライブラリか知らなかったのでGoogleで調べたところ,jpeg2000形式の画像を表示するためのライブラリだそうです。

話のタネのつもりで,libjasperはDebian sarge用のバイナリパッケージを試してみましょう。

$ ar xv libjasper-1.701-1_1.701.0-2_i386.deb 
x - debian-binary
x - control.tar.gz
x - data.tar.gz
$ tar xvf data.tar.gz
./
./usr/
./usr/lib/
./usr/lib/libjasper-1.701.so.1.0.0
./usr/share/
...

新しく展開したライブラリが見つかるように,LD_LIBRARY_PATH環境変数を設定します。

$ setenv LD_LIBRARY_PATH `pwd`/usr/lib
$ env | grep -i LIBRARY
LD_LIBRARY_PATH=/home/kojima/Xv/usr/lib

手元ではtcshを使っているからsetenvで環境変数を指定していますが,bashならばexport LD_LIBRARY_PATH=`pwd`/usr/libになります。なお`pwd`は現在のワーキングディレクトリを絶対パスに変換する指定で,この部分を./usr/libと相対パスで指定してしまうと,別のディレクトリに移動したらライブラリが見つからなくなります。

さて,これでxvは動くでしょうか?

$ ./usr/bin/xv
./usr/bin/xv: error while loading shared libraries: libjasper.so.1: cannot open shared object file: No such file or directory

残念,まだlibjasperが見つからない旨のエラーになってしまいました。エラーメッセージをよく見ると,インストールしたライブラリはlibjasper-1.701.so.1なのに,xvが要求しているライブラリはlibjasper.so.1です。この程度のバージョンの不一致はシンボリックリンクで解決するかも知れません。

$ cd usr/lib
$ ln -sf libjasper-1.701.so.1 libjasper.so.1
$ ../usr/bin/xv

図1 rpmから取り出したxvの起動画面

図1 rpmから取り出したxvの起動画面

タイトルバーに表示されているように,ようやくFedora 9用のxvを動かすことができました。

この例では何とかなりましたが,ライブラリによってはバージョンのわずかな違いでも提供する機能が異なっていたり,新しいバージョンの glibc の機能を要求したりして動かせないことがあるので注意が必要です。

今回は手動でパッケージの中身を取り出して直接操作しましたが,異なるパッケージ間の相互変換をするalienというツールも開発されているので,必要に応じて試してみるのもいいでしょう。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたのが,いつの間にかミイラ取りがミイラになってOSSを仕事にするようになってしまいました。最近はスペシャリスト養成を目的とした専門職大学院で教壇に立ったりもしています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html