dpkg-shlibdeps -
共有ライブラリの substvar
依存関係を生成する
dpkg-shlibdeps [
option...] [
-e]
executable
[
option...]
dpkg-shlibdeps
は、引数として与えられた実行バイナリと共有ライブラリとの依存関係を算出する。依存関係は変数ファイル
debian/substvars に
shlibs:dependency-field
という名前の変数として追加される。
dependency-field
は依存関係にあるフィールド名であり、それ以外の
shlibs:
からはじまる変数はファイルから削除される。
dpkg-shlibdeps
には依存関係情報を生成する情報源として
symbols ファイルおよび
shlibs ファイルの 2
つを使用する。
dpkg-shlibdeps
は、解析する各バイナリについてリンクするライブラリの一覧を確認した上で、各ライブラリを、
symbols
ファイルもしくは
shlibs
ファイル
(前者が存在しないか、debian/shlibs.local
に適切な依存関係が含まれている場合)
から検索する。両ファイルともに、ライブラリのパッケージによって提供され、各々
/var/lib/dpkg/info/
package.
symbols および
/var/lib/dpkg/info/
package.
shlibs
に存在する。パッケージ名は
2
段階で識別される。最初にシステムにあるライブラリが検索され
(
ld.so
が使用するのと同じディレクトリが検索される)、ついで
dpkg -S library-file
を用いてライブラリを提供するパッケージが検索される。
シンボルファイル¶
シンボルファイルにはライブラリがエクスポートしている各シンボルに関する最小の依存関係を提供するための詳細な依存関係情報が含まれる。スクリプトは、ライブラリパッケージに関連付けられたシンボルファイルを検索する際に、ファイルを確認する
(最初にマッチしたものが使われる):
- debian/*/DEBIAN/symbols
- dpkg-gensymbols(1)
を実行した現在のビルド処理によって生成される共有ライブラリの情報。これらはライブラリがパッケージのビルドツリー内で見つかった場合のみ使われる。ビルドツリー内のシンボルファイルは、その他のバイナリパッケージのシンボルファイルに優先する。
- /etc/dpkg/symbols/package.symbols.arch
- /etc/dpkg/symbols/package.symbols
- システム全体に上書き適用される共有ライブラリの依存関係情報。arch
は現在のシステムのアーキテクチャを示す
( dpkg-architecture -qDEB_HOST_ARCH
により取得される)。
- “dpkg-query --control-path package
symbols” の出力
- パッケージの提供する共有ライブラリの依存関係情報。--admindir
により上書きされない限り、これらのファイルは
/var/lib/dpkg に存在する。
バイナリが使用するシンボルをスキャンしている際、
dpkg-shlibdeps
は、各ライブラリが必要としている
(最大の)
最小バージョンを記憶する。これにより、処理が完了した際に、使用する各ライブラリ毎に最小の依存関係を書き出すことが可能となる
(
symbols
ファイルの情報が適切である場合)。
安全を確保するための手段として、シンボルファイルは
Build-Depends-Package
というメタ情報フィールドを提供することができる。
dpkg-shlibdeps は、ここから
Build-Depends
フィールドにあるパッケージが必要とする最小バージョンを取得する。この最小バージョンがシンボルを検索して算出された最小バージョンより大きい場合、シンボルファイルで指定したバージョンが使用される。
shlibs ファイル¶
shlibs
ファイルは、ライブラリに直接
(シンボルを参照することなしに)
依存関係を設定する。これは時として必要以上に強力な場合もあるが、非常に安全かつ簡単に扱うことができる。
ライブラリの依存関係は、幾つかのパスから検索される。対象のライブラリに対して最初に情報を提供したファイルの情報が用いられる。
- debian/shlibs.local
- パッケージのみに上書き適用される共有ライブラリの依存関係情報
- /etc/dpkg/shlibs.override
- システム全体に上書き適用される共有ライブラリの依存関係情報
- debian/*/DEBIAN/shlibs
- dpkg-shlibdeps
を起動した現在のビルド処理によって生成された共有ライブラリの情報。これらはライブラリがパッケージのビルドツリー内で見つかった場合のみ使われる。ビルドツリー内の
shlibs
ファイルはその他のバイナリパッケージの
shlibs
ファイルに優先する。
- “dpkg-query --control-path package
shlibs” の出力
- パッケージの提供する共有ライブラリの依存関係情報。--admindir
により上書きされない限り、これらのファイルは
/var/lib/dpkg に存在する。
- /etc/dpkg/shlibs.default
- システム全体に影響するデフォルトの共有ライブラリの依存関係情報
展開された依存関係は直接適用される
(重複が確認されたり、別のより強い依存関係が確認されたりしたためフィルタされる場合を除く)。
オプション¶
dpkg-shlibdeps
は、オプションでない引数を、
-eexecutable
で指定された場合と同じく実行ファイル名として解釈する。
- -eexecutable
- executable
が必要とする共有ライブラリのための依存関係を含める。
- -ddependency-field
- 制御ファイルの依存関係のためのフィールド
dependency-field
に依存関係を追加する
(このフィールドに記載した依存関係は
shlibs:dependency-field
変数に設定される。
-ddependency-field
オプションは、次の
-ddependency-field
が現れるまで、このオプションに続くすべての実行ファイルに適用される。
dependency-field
のデフォルトは Depends
である。
Pre-Depends, Depends, Recommends, Enhances,
Suggests
といった依存関係に関連するフィールドに、同一の
(代替パッケージを含む)
依存関係のエントリが現れた場合、
dpkg-shlibdeps
は自動的にもっとも重要な依存関係を示すもの以外、すべてのフィールドから該当する依存関係を自動的に削除する。
- -pvarname-prefix
- 変数名を shlibs:
から始まる代わりに
varname-prefix:
から始める。同様に、(
shlibs:ではなく)
varname-prefix:
から始まる既存の変数が変数ファイルから削除される。
- -O
- 変数の設定を、変数ファイル
(デフォルトは debian/substvars)
に追加する代わりに標準出力に出力する。
- -ttype
- 指定されたパッケージ形式にタグ付けされた共有ライブラリの依存情報を優先的に用いる。タグ付けされた情報が利用できなかった場合はタグ付けされていない情報が用いられる。デフォルトのパッケージ形式は
"deb"
である。共有ライブラリの依存関係情報は、パッケージ形式の名称、コロン、空白文字を名前の先頭につけることで、パッケージ形式にタグ付けされる。
- -Llocal-shlibs-file
- debian/shlibs.local
の代わりに local-shlibs-file
から上書きする共有ライブラリの依存関係情報を読み取る。
- -Tsubstvars-file
- 変数を substvars-file
に書き込む。デフォルトは
debian/substvars である。
- -v
- 冗長モードを有効にする。dpkg-shlibdeps
の動作を示すためのメッセージが数多く表示される。
- -xpackage
- package
で指定したパッケージを生成された依存関係から除外する。これは
ELF バイナリ
(実行ファイルやライブラリのプラグイン)
を提供するパッケージが同じパッケージに含まれるライブラリを使用することによる自己依存関係を避ける際に有用である。このオプションを複数回設定することで、複数のパッケージを除外することができる。
- -Spackage-build-dir
- ライブラリを探索する際に、最初に
package-build-dir
内を探索する。これは、ソースパッケージが
flavor
を交えながら同じライブラリを何度もビルドする際に、指定されたバイナリパッケージからの依存関係を取得したいといった場合に有用である。このオプションは複数回設定することができる。その場合、ここで指定した以外のバイナリパッケージの格納されたディレクトリを探索する前に、指定された順にディレクトリが探索される。
- --ignore-missing-info
- 共有ライブラリが依存関係情報を提供しなかった際に失敗と見なさない。このオプションの使用は推奨しない。すべてのライブラリは、たとえ他のパッケージによって使用されていない場合であっても、依存関係情報を(shlibs
ファイルまたはシンボルファイルによって)
提供すべきであるためである。
- --warnings=value
- value は dpkg-shlibdeps
によって出力される一連の警告をビットフィールドとして定義したものである。ビット
0 (value=1) は "symbol sym used by binary found
in none of the libraries"
という警告を、ビット
1 (value=2) は "package could avoid a useless dependency"
という警告を、ビット
2 (value=4) は " binary should not be linked against
library"
という警告を有効にする。デフォルトの
value は 3
であり、最初の 2
つの警告がデフォルトで有効になり、最後の
1 つは無効となる。
value を 7
にすることで、すべての警告を有効にできる。
- --admindir=dir
- dpkg
データベースの位置を変更する。デフォルトの位置は
/var/lib/dpkg である。
- -?, --help
- 利用方法を表示して終了する。
- --version
- バージョン情報を表示して終了する。
dpkg-shlibdeps
が生成されたパッケージの各バイナリが使用する一連のシンボルを解析する際に、様々なケースで警告が発生する。これにより、パッケージの改良につながるヒントを得ることができる。多くの場合、こうした改良はアップストリームのソースに直接影響する。重要度の高いものから順に、発生しうる様々な警告を以下に示す:
- symbol sym used by binary
found in none of the libraries.
- これは、シンボルがバイナリにリンクされたライブラリ内で見つからなかったことを示す。binary
はほとんどの場合ライブラリであり、ビルド処理の中で別のライブラリにリンクされる必要がある
(リンカの -llibrary
オプション)。
- binary contains an unresolvable reference to
symbol sym: it's probably a plugin
- これは、シンボルがバイナリにリンクされたライブラリ内で見つからなかったことを示す。binary
はほとんどの場合プラグインであり、シンボルは恐らくプラグインをロードするプログラムによって提供される。プラグインには
SONAME
を持たせないのがセオリーだが、このバイナリはそれを持っているため、プラグインかどうかを明確に判別することができていない。ただし、このバイナリは一般的なディレクトリに配置されていないため、通常の共有ライブラリではないことがほぼ断定できている。バイナリが実際にプラグインであった場合は、この警告は無視すればよい。ただし、バイナリが実際にはライブラリである可能性もある。その場合、リンクするプログラムは
RPATH
を用いて、動的ローダにライブラリを発見させる。後者の場合、このライブラリは機能不全であり、修正が必要である。
- package could avoid a useless dependency if
binary was not linked against library (it uses
none of the library's symbols)
- library
にリンクされた binaries
は、ライブラリによって提供されているシンボルをまったく使用していない。
binaries
に列挙されたすべてのバイナリを修正することで、このライブラリへの依存関係を外すことができる可能性がある
(実際に使用される別のライブラリによって、同じ依存関係が生成されている場合を除く)。
- package could avoid a useless dependency if
binaries were not linked against library (they
uses none of the library's symbols)
- 前述の警告と同一であるが、複数のバイナリが対象となっている。
- binary should not be linked against
library (it uses none of the library's symbols)
- binary
は不要なライブラリにリンクされている。これは問題ではないが、このライブラリをバイナリにリンクしないことで、若干のパフォーマンス向上が見込まれる。この警告は前述したものと同じ情報を提示しているが、解析したバイナリ全体に対するチェックではなく、個別のライブラリに対するチェックとなっている。
エラー¶
dpkg-shlibdeps
は、バイナリによって使用される公開ライブラリを発見できない場合や、ライブラリに依存関係の情報
(shlibs
ファイルやシンボルファイル)
が存在しない場合エラーとなる。公開ライブラリは
SONAME があり、(libsomething.so.
X
という形態で)
バージョン管理されている。(プラグインのような)
非公開ライブラリは
SONAME
を持つべきではなく、バージョン管理も不要である。
- couldn't find library library-soname
needed by binary (its RPATH is
'rpath')
- binary が library-soname
で呼び出されるライブラリを使用しているが、
dpkg-shlibdeps
はライブラリを発見できない。
dpkg-shlibdeps
は以下の順でライブラリを確認するディレクトリの一覧を作成する:
バイナリの RPATH
に設定されたディレクトリ、/etc/ld.so.conf
に設定されたディレクトリ、LD_LIBRARY_PATH
環境変数に設定されたディレクトリ、標準のディレクトリ
(/lib, /usr/lib, /lib32, /usr/lib32, /lib64,
/usr/lib64)。作成後、解析されているバイナリに関するパッケージのビルドツリー、-S
コマンドラインオプションで指定されたパッケージビルドツリー、同じく
DEBIAN/shlibs もしくは DEBIAN/symbols
ファイルに含まれるもの、最後にルートディレクトリ内にある、先ほどのディレクトリの一覧をチェックする。これらのディレクトリでライブラリが発見できない場合、エラーとなる。
発見できないライブラリが同じパッケージの非公開ディレクトリにある場合、ディレクトリを
LD_LIBRARY_PATH
に追加するとよい。ライブラリがビルドされる別のバイナリパッケージに存在している場合、このパッケージの
shlibs/symbols
ファイルをあらかじめ作成した上で、それが非公開ディレクトリに配置される場合は、LD_LIBRARY_PATH
に適切なディレクトリを含めておけばよい。
- no dependency information found for
library-file (used by binary).
- binary
が必要とするライブラリは、
dpkg-shlibdeps によって library-file
内で発見されているが、
dpkg-shlibdeps
は該当ライブラリについての依存関係情報を発見できていない。依存関係を発見するために、
dpkg-shlibdeps は dpkg -S library-file
によって Debian
パッケージをライブラリに対応付け、さらに
/var/lib/dpkg/info
や様々なパッケージのビルドツリー
(debian/*/DEBIAN/) にある shlibs や symbols
ファイルのチェックを実施している。
このエラーはライブラリパッケージの
shlibs や symbols
ファイルに問題があるか、ファイル自体が存在しない場合に発生する。これは、ライブラリが同じソースパッケージからビルドされているが、shlibs
ファイルが未生成
(この場合 debian/rules
ファイルを修正して、
dpkg-shlibdeps 実行前に shlibs
ファイルを生成するようにする必要がある)
の場合にも発生する。RPATH
に問題があり、ライブラリが正規化されていないパス名で発見され
(例えば、/usr/lib/libssl.so.0.9.8
ではなく、/usr/lib/openoffice.org/../lib/libssl.so.0.9.8
のような形で)、そのライブラリがどのパッケージにも対応付けられない場合にも発生する。この場合、
dpkg-shlibdeps は ( realpath(3)
を用いて)
正規名を確認するが、常に成功するとは限らない。問題を発生させないために、バイナリの
RPATH
を常に整理しておくことが推奨される。
dpkg-shlibdeps を冗長モード (-v)
で実行することで、依存関係情報を検索する際の試行に関して、より多くのメッセージを提供することができる。これは、エラーの原因が何か分からない場合に有用となるだろう。
関連項目¶
deb-shlibs(5),
deb-symbols(5),
dpkg-gensymbols(1)
翻訳者¶
高橋 基信 <monyo@monyo.com>. 喜瀬
浩 <kise@fuyuneko.jp>. 関戸 幸一
<sekido@mbox.kyoto-inet.or.jp>. 鍋谷 栄展
<nabe@debian.or.jp>. 倉澤 望
<nabetaro@debian.or.jp>. 石川 睦
<ishikawa@linux.or.jp>. 鵜飼 文敏
<ukai@debian.or.jp>. 中野 武雄
<nakano@apm.seikei.ac.jp>.
翻訳校正¶
Debian JP Documentation ML <debian-doc@debian.or.jp>.