[% title = "Debian Packaging Manual - 共有ライブラリ" %]


[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ next ]


Debian Packaging Manual
Chapter 12 - 共有ライブラリ


共有ライブラリを含むパッケージの場合、その共有ライブラリがつねに 使用可能となるように多少の注意を払って作成しなければなりません。 とりわけ、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 への シンボリックリンクを含んでいなければいけません。 このシンボリックリンクが必要となるのは、パッケージを コンパイルするときに動的にリンクするか静的にリンクするかによって、 ldlibgdm.solibgdm.a しか探さないからです。

共有ライブラリを、/etc/ld.so.conf に書かれてある ディレクトリか、ld.so によるデフォルトの 検索ディレクトリ (現在のところ、/usr/lib/lib です) のいずれかにインストールするパッケージは、 最初の引数が 'configure' であったとき,かつそのときのみ postinst スクリプトの中で ldconfig を呼ばなければなりません。しかし、パッケージを アップグレードしようとしたときに、postrm と preinstの中で ldconfig を呼ばないようにすることも重要です。 (インストール時、アップグレード時のパッケージ展開作業の 詳細については インストールやアップグレードでの ファイルの展開段階の詳細, Section 6.3 を参照ください) それは、その場合には dpkg がインストールしている 間に使う一時的なファイルを ldconfig が見てしまい、 共有ライブラリリンクがその一時的なファイルを指すようにして しまうからです。そして、dpkg はインストールを 継続する直前に、そのリンク先を消してしまいます!


12.1 shlibs ファイルの書式

このファイルは、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 が出力するウォーニングを回避するのに 役立ちます。


12.2 shlibs に関する技術情報の詳細


12.2.1 shlibs ファイルとは何か ?

debian/shlibs ファイルは、パッケージ化された バイナリがどの共有ライブラリに依存しているか調べる方法を 提供します。このファイルを使用する目的は、 パッケージメンテナが自分の作業を楽にすることにあります。

Debian システム上にある他の shlibs ファイルを以下に 列挙します。

バイナリパッケージの構築時、dpkg-shlibdeps が これらのファイルを使います。


12.2.2 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


  • 12.2.3 多くの shlibs ファイルを誰が 管理しているのか ?

    shlibs.default は、dpkg によって 管理されています。dpkg によって提供される shlibs.default の各エントリは、 共有ライブラリパッケージすべてが、それぞれの shlibs ファイルを持つようになるまで、デフォルトの決定のために 置かれています。


    12.2.4 dpkg-shlibdepsshlibs ファイルをどのようにして使うか ?


    12.2.4.1 あなたのパッケージが共有ライブラリを含んで いないとき

    debian/rules ファイル中に dpkg-shlibs の呼出しルーチンを置いてください。バイナリだけを含んだ パッケージ (つまり、スクリプトを含まない) の場合、以下を 使用してください。

           dpkg-shlibdeps debian/tmp/usr/bin/* debian/tmp/usr/sbin/*
    

    dpkg-shlibdeps が何も文句を言って こなかったなら、成功です。もし、エラーやウォーニングなどが 出力されたのであれば、たぶん、それ用の debian/shlibs.local を作成する必要が あるでしょう。


    12.2.4.2 あなたのパッケージが共有ライブラリを 含んでいるとき

    debian/shlibs ファイルを作成して、 debian/rules によってそれを制御領域に インストールしてください。

           install -m644 debian/shlibs debian/tmp/DEBIAN
    

    もし、あなたのパッケージが他のバイナリを含んでいるので あれば、上の記述を参照してください。


    12.2.5 debian/shlibs.localどのように書くのか

    あなたの作ったパッケージが、自身の /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-22

    Ian Jackson ijackson@gnu.ai.mit.edu
    校正: David A. Morris bweaver@debian.org
    メンテナー: Christian Schwarz schwarz@debian.org
    メンテナー: Manoj Srivastava srivasta@debian.org
    メンテナー: Julian Gilbey J.D.Gilbey@qmw.ac.uk
    メンテナー: The Debian Policy group debian-policy@lists.debian.org
    日本語版メンテナー: 早瀬 茂規 shayase@tky3.3web.ne.jp
    日本語版校正: Japanese Debian Documentation Project debian-doc@debian.or.jp