[% title = "Debian Packaging Manual - 共有ライブラリ" %]
[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ next ]
共有ライブラリを含むパッケージの場合、その共有ライブラリがつねに 使用可能となるように多少の注意を払って作成しなければなりません。 とりわけ、libc などのシステム運用に関わる重要な共有ライブラリの ときは特に重要です。
初めに、パッケージは、共有ライブラリを正しい名前で
インストールしなくてはなりません。例えば、パッケージ libgdbm1
は、libgdbm.so.1.7.3 を、 /usr/lib/libgdbm.so.1.7.3
としてインストールしなくては なりません。prerm や postrm
スクリプトからこれらのファイルの
名前を変更したり、再リンクしたりしてはいけません; dpkg
は、実行中のプログラムに影響がないように、
注意してファイル名の変更などの作業を実行しますし、これと
競合するような処理は,おそらく問題を起こすでしょう。
次に、パッケージは ldconfig
の作成する
共有ライブラリ用のシンボリックリンクを含まなければいけません。
例えば、libgdbm1
パッケージは、 /usr/lib/libgdbm.so.1
から libgdbm.so.1.7.3 へのシンボリックリンクを含んで
いなければいけません。これが必要なのは、dpkg
が
ライブラリをインストールしてから postinst
スクリプトで
ldconfig
が実行されるまでの間に、 ld.so
がそのライブラリを見つけることができるように
するためです。さらに、古いバージョンのパッケージ管理システムでは、
.deb ファイル中のライブラリは、それへの
シンボリックリンクが置かれるより先に置かれていることを
要求していました。これは、dpkg
が
(古いバージョンのライブラリを指すシンボリックリンクを上書きする ことによって)
新しいシンボリックリンクをインストールする時点で、
新しい共有ライブラリが既に存在していることを保証するためです。
あいにく、これはいつでも可能なことと言うわけではありませんでした。
なぜなら、それはファイルシステムのふるまいに大きく 依存するからです。ある種の
(reisefs のような) ファイルシステムは
ファイルを作る順番が問題にならないように、ファイルを 並び換えます。リリース
1.7.0 から、パッケージ作成時に dpkg
が自動的にファイルそれ自身を並び換えるように なります。
三番目に、開発版 (development) パッケージは、バージョン番号なしの
共有ライブラリへのシンボリックリンクを含んでいなければいけません。
例えば、libgdbm1-dev パッケージは、
/usr/lib/libgdm.so から libgdm.so.1.7.3 への
シンボリックリンクを含んでいなければいけません。
このシンボリックリンクが必要となるのは、パッケージを
コンパイルするときに動的にリンクするか静的にリンクするかによって、
ld
は libgdm.so か libgdm.a
しか探さないからです。
共有ライブラリを、/etc/ld.so.conf に書かれてある
ディレクトリか、ld.so
によるデフォルトの 検索ディレクトリ
(現在のところ、/usr/lib と /lib です)
のいずれかにインストールするパッケージは、 最初の引数が 'configure'
であったとき,かつそのときのみ postinst
スクリプトの中で
ldconfig
を呼ばなければなりません。しかし、パッケージを
アップグレードしようとしたときに、postrm と preinstの中で ldconfig
を呼ばないようにすることも重要です。
(インストール時、アップグレード時のパッケージ展開作業の 詳細については インストールやアップグレードでの
ファイルの展開段階の詳細, Section 6.3 を参照ください) それは、その場合には
dpkg
がインストールしている 間に使う一時的なファイルを
ldconfig
が見てしまい、
共有ライブラリリンクがその一時的なファイルを指すようにして
しまうからです。そして、dpkg
はインストールを
継続する直前に、そのリンク先を消してしまいます!
このファイルは、dpkg-shlibdeps
によって使用され、
共有ライブラリを含むパッケージを提供する場合は必須です。
それぞれの行はつぎのものから構成されます。
library-name version-or-soname dependencies ...
library-name は、共有ライブラリの名前です。 例えば、libc5 です。
version-or-soname は、ライブラリの .so ファイル名です。つまり、
ld.so
によって
認識されるライブラリ名と厳密に一致した名前を与えなければ
いけません。ふつうは、ライブラリのメジャーバージョン番号です。
dependencies は、バイナリパッケージ制御ファイル中の dependency フィールドと同じ書式です。そのパッケージに含まれる ライブラリで構築したバイナリが動作するために必要なパッケージの 詳細が記述されていなければなりません。関係性フィールドの書式, Section 8.1 をご覧になってください。
例えば、パッケージ foo が、libfoo.so.1.2.3 を含むとします。この時、ライブラリの .so ファイル名は、 libfoo.so.1 となります。そして、 マイナーバージョンが、2.3 であるような最初の パッケージのバージョンは、1.2.3-1 となります。 そこで、このパッケージの、shlibs には以下のように 書かれます。
libfoo 1 foo (>= 1.2.3-1)
特定のバージョン番号への依存関係は、古いバージョンの
共有ライブラリで新しいバイナリを実行しようとした際に、 ld.so
が出力するウォーニングを回避するのに 役立ちます。
debian/shlibs ファイルは、パッケージ化された バイナリがどの共有ライブラリに依存しているか調べる方法を 提供します。このファイルを使用する目的は、 パッケージメンテナが自分の作業を楽にすることにあります。
Debian システム上にある他の shlibs ファイルを以下に 列挙します。
/etc/dpkg/shlibs.default
/etc/dpkg/shlibs.override
/var/lib/dpkg/info/*.shlibs
debian/shlibs.local
バイナリパッケージの構築時、dpkg-shlibdeps
が
これらのファイルを使います。
dpkg-shlibdeps
は、 どのようにして働くのか ?
dpkg-shlibdeps
は、 コマンドラインから入力された
コンパイル済のバイナリ (近くリリースされる dpkg-shlibdeps
ではライブラリも) が直接 [22]
使っている共有ライブラリを調べます。
各共有ライブラリに対して、dpkg-shlibdeps
は
以下の情報を把握する必要があり、
ライブラリを含んでいるパッケージ、および
ライブラリのバージョン番号、
そのために以下のファイルを記述順に走査します。
debian/shlibs.local
/etc/dpkg/shlibs.override
/var/lib/dpkg/info/*.shlibs
/etc/dpkg/shlibs.default
/etc/dpkg/shlibs.default - dpkg のメンテナ
/var/lib/dpkg/info/package.shlibs - それぞれのパッケージメンテナ
/etc/dpkg/shlibs.override - ローカルの システム管理者
debian/shlibs.local - パッケージ開発者
shlibs.default は、dpkg
によって
管理されています。dpkg
によって提供される
shlibs.default の各エントリは、
共有ライブラリパッケージすべてが、それぞれの shlibs
ファイルを持つようになるまで、デフォルトの決定のために 置かれています。
dpkg-shlibdeps
と shlibs ファイルをどのようにして使うか ?
debian/rules ファイル中に dpkg-shlibs
の呼出しルーチンを置いてください。バイナリだけを含んだ パッケージ
(つまり、スクリプトを含まない) の場合、以下を 使用してください。
dpkg-shlibdeps debian/tmp/usr/bin/* debian/tmp/usr/sbin/*
dpkg-shlibdeps
が何も文句を言って
こなかったなら、成功です。もし、エラーやウォーニングなどが
出力されたのであれば、たぶん、それ用の debian/shlibs.local
を作成する必要が あるでしょう。
debian/shlibs ファイルを作成して、 debian/rules によってそれを制御領域に インストールしてください。
install -m644 debian/shlibs debian/tmp/DEBIAN
もし、あなたのパッケージが他のバイナリを含んでいるので あれば、上の記述を参照してください。
あなたの作ったパッケージが、自身の /var/lib/dpkg/info/*.shlibs をまだ提供していない ライブラリに依存しているとき、この問題の 一時的解決のためにこのファイルはあります。
バイナリ foo をパッケージ構築中だとします。 構築中のメッセージが、例えば以下のようになっていて、
$ ldd foo libbar.so.1 => /usr/X11R6/lib/libbar.so.1.0 libc.so.5 => /lib/libc.so.5.2.18 libX11.so.6 => /usr/X11R6/lib/libX11.so.6.0
そして、 dpkg-shlibdeps
を実行すると、 以下のようになります。
$ dpkg-shlibdeps -o foo dpkg-shlibdeps: warning: unable to find dependency information for shared library libbar (soname 1, path /usr/X11R6/lib/libbar.so.1.0, dependency field Depends) shlibs:Depends=elf-x11r6lib, libc5 (>= 5.2.18)
foo
バイナリは、libbar
共有ライブラリに依存していますが、 var/lib/dpkg/info/ にある
*.shlibs ファイルには、このライブラリを提供したパッケージの名前は
ありません。というわけで、責任をとるパッケージを 決定しましょう。
$ dpkg -S /usr/X11R6/lib/libbar.so.1.0 bar1: /usr/X11R6/lib/libbar.so.1.0 $ dpkg -s bar1 | grep Version Version: 1.0-1
どうやら、bar1
のバージョン 1.0-1 が
現在我々の使用しているものということのようです。
ここで、この問題を一時的に解決するために、自分専用の
debian/shlibs.local を作ります。以下の行を、
debian/shlibs.local 中に含めてください。
libbar 1 bar1 (>= 1.0-1)
さあ、これであなたのパッケージ構築作業はうまくいくはずです。
libbar1
のパッケージメンテナが、それ用の shlibs
ファイルを提供したときには、あなたの debian/shlibs.local
ファイルは削除してもよいです。
[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ next ]
Debian Packaging Manual
version revision 1.13, 2000-08-22ijackson@gnu.ai.mit.edu
bweaver@debian.org
schwarz@debian.org
srivasta@debian.org
J.D.Gilbey@qmw.ac.uk
debian-policy@lists.debian.org
shayase@tky3.3web.ne.jp
debian-doc@debian.or.jp