書式
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) で実行することで、依存関係情報を検索する際の試行に関して、より多くのメッセージを提供することができる。これは、エラーの原因が何か分からない場合に有用となるだろう。