appcert
の使用Solaris 8 4/01 リリースで、appcert が新規に追加されました。詳細は、『システムインタフェース』を参照してください。
この章では、次の項目について説明します。
appcert
ユーティリティの目的
appcert
の実行方法と使い方
appcert
が報告した問題への対処方法
appcert
準拠コードの作成方法
最新のマニュアルページを参照するには、man コマンドを使用してください。Solaris 8 Update リリースのマニュアルページには、「Solaris 8 Reference Manual Collection」には記載されていない新しい情報も提供されています。
appcert
ユーティリティの目的Solaris の新しいリリースが発表されると、ライブラリインタフェースの中には、動作が変わったり、完全になくなるものがあります。そうしたインタフェースに依存しているアプリケーションも機能しなくなってしまいます。Solaris Application Binary Interface (ABI) では、アプリケーションが使用できる、安全で安定した実行時ライブラリインタフェースを定義します。Solaris ABI に準拠して書かれたアプリケーションであれば、今後の Solaris のリリースでも安定性が確保できます。appcert
ユーティリティは、アプリケーションが Solaris ABI に準拠しているかどうかを、開発者が確認できるように設計されています。
appcert
のチェック項目
appcert
ユーティリティがアプリケーションで検査するのは、次の項目です。
非公開シンボルの使用
静的リンク
結合されていないシンボル
非公開 (private) シンボルとは、Solaris ライブラリがお互いに呼び出すときに使用する関数やデータです。非公開シンボルの意味上の動作は変わる可能性があり、シンボルは場合によっては削除されることがあります (このようなシンボルを降格されたシンボルといいます)。非公開シンボルの変更が可能な性質は、非公開シンボルに依存するアプリケーションが不安定になる原因となります。
Solaris ライブラリ間の非公開シンボルの呼び出しの意味が、リリースごとに変わる可能性があるため、アーカイブに対する静的リンクを作成すると、アプリケーションのバイナリの安定性が低下することになります。アーカイブの対応する共用オブジェクトファイルへ動的リンクを作成すると、この問題が回避できます。
appcert
ユーティリティは動的リンカーを使用して、検査されるアプリケーションが使用するライブラリシンボルを解決します。動的リンカーが解決できないシンボルを、結合されていないシンボルといいます。結合されていないシンボルの原因は、LD_LIBRARY_PATH 変数の間違った設定などの環境の問題や、コンパイル時に -llib オプションや -z オプションの定義を省略したなどの作成上の問題にあります。この例は重大とはならないものの、appcert
が報告する結合されていないシンボルは、重大な問題となる場合があります。
appcert
がチェックしない項目
appcert
に検査させたいオブジェクトファイルがライブラリに依存している場合は、そうした依存関係がオブジェクトに記録されている必要があります。そのためには、コードのコンパイル時に、コンパイラの -l オプションを確実に使用するようにします。オブジェクトファイルが他の共用ライブラリに依存している場合は、appcert
の実行時に LD_LIBRARY_PATH や RPATH を介して、それらのライブラリにアクセスできなければなりません。
appcert
アプリケーションでは、マシンが 64 ビットの Solaris カーネルを実行していない場合、64 ビットのアプリケーションはチェックできません。appcert
が 64 ビットのアプリケーションをチェックしているときは、静的リンクのチェックは行われません。
appcert
ユーティリティでは次の項目は検査できません。
完全にあるいは部分的に静的にリンクされているオブジェクトファイル。完全に静的にリンクされているオブジェクトは、不安定であると報告されます。
アクセス権が設定されていない実行可能ファイル。appcert
ユーティリティはこうした実行可能プログラムの処理を飛ばします。実行アクセス権のない共用オブジェクトは、通常どおり検査されます。
ユーザー ID が root に設定されているオブジェクトファイル。
シェルスクリプトなどの ELF 以外の実行可能プログラム。
C 言語以外の Solaris インタフェース。コード自体は C 言語である必要はありませんが、Solaris ライブラリへの呼び出しは C 言語でなければなりません。
appcert
での作業
appcert
を使用してアプリケーションをチェックするには、次のように実行します。
appcert object|directory |
appcert
に検査させたいオブジェクトの完全なリスト
そうしたオブジェクトがあるディレクトリの完全なリスト
チェックされるアプリケーションが実行される環境とは異なる環境で appcert
を実行する場合、appcert
ユーティリティは Solaris ライブラリインタフェースへの参照を正しく解決できない可能性があります。
appcert
ユーティリティは Solaris 実行時リンカーを使用して、実行可能プログラムや共用オブジェクトファイルごとにインタフェースへの依存関係のプロファイルを作成します。このプロファイルを使用すると、アプリケーションが依存する Solaris システムインタフェースが判別できます。プロファイルに記述された依存関係は Solaris ABI と比較され、準拠しているかどうかが確認されます (非公開インタフェースがあってはいけません)。
appcert
ユーティリティは再帰的にディレクトリを検索してオブジェクトファイルを探しますが、ELF 以外のオブジェクトファイルは無視します。appcert
によるアプリケーションのチェックが完了すると、標準出力 (stdout、通常は画面) に終了報告が出力されます。同じ内容が作業用ディレクトリ、通常は /tmp/appcert.pid の、Report という名前のファイルに書き込まれます。サブディレクトリ名の pid は appcert
のプロセス ID で 1〜6 桁の数字で示されます。appcert
が出力ファイルを書き込むディレクトリ構造の詳細については、appcert
の結果を参照してください。
appcert
のオプション次のオプションによって appcert
ユーティリティの動作が変更できます。コマンド行では、appcert コマンドの後、object|directory オペランドの前に、オプションを入力します。
バッチモードで appcert
を実行します。
バッチモードでは、appcert
が作成するレポートの各行に、チェックしたバイナリが記録されます。
PASS で始まる行は、その行に指定されているバイナリに対して appcert
の警告を発しなかったことを示します。
FAIL で始まる行は、そのバイナリで問題が見つかったことを示します。
INC で始まる行は、その行に指定されているバイナリが、完全にはチェックできなかったことを示します。
infile ファイルはチェックの対象となるファイルのリストで、1 行に 1 つのファイル名を指定します。コマンド行でファイルが指定されている場合は、そのファイルと共にチェックの対象となります。このオプションを使用する場合は、コマンド行でオブジェクトやディレクトリを指定する必要はありません。
appcert
の使用方法の情報を出力します。
デフォルトでは、appcert
はアプリケーションの共用オブジェクトをすべてチェックし、共用オブジェクトがあるディレクトリを LD_LIBRARY_PATH に追加します。-L オプションを指定すると、この動作が無効になります。
デフォルトでは、appcert
はディレクトリを検索してチェックするバイナリを探すときに、シンボリックリンクをたどります。-n オプションを指定すると、この動作が無効になります。
LD_LIBRARY_PATH に Solaris ライブラリディレクトリである /usr/openwin/lib と /usr/dt/lib を追加します。
ライブラリコンポーネントの実行と、一時ファイルの作成を行うディレクトリを指定します。このオプションが指定されていない場合、appcert
は /tmp ディレクトリを使用します。
appcert
の結果
appcert
ユーティリティによる、アプリケーションのオブジェクトファイルに対する分析結果は、appcert
ユーティリティの作業用ディレクトリ (通常は /tmp) に作成されるサブディレクトリの下に置かれるいくつかのファイルに書き込まれます。作業用ディレクトリに作成されるサブディレクトリ名は appcert
.pid で、pid は appcert
のプロセス ID です。
チェック済みのバイナリと、そのバイナリに対する appcert
の出力が置かれるサブディレクトリとの間の対応が入ります。
appcert
の実行時に stdout に表示された、終了報告のコピーが保存されます。
appcert
がチェックするように要求されたが処理を飛ばさざるを得なかったバイナリのリストが入ります。各バイナリが処理を飛ばされた理由も記載されます。理由には、次のものがあります。
ファイルがバイナリのオブジェクトでない
ファイルをユーザーが読み取ることができない
ファイル名にメタキャラクタが含まれている
ファイルに実行ビットが設定されていない
objects のサブディレクトリの下には、appcert
が検査したオブジェクトごとにサブディレクトリが作られます。それぞれのサブディレクトリには、次のファイルが入っています。
check.demoted.symbols | ||
降格された Solaris シンボルの可能性があると |
||
check.dynamic.private | ||
オブジェクトが直接結合されている、非公開 Solaris シンボルのリストが入っています。 |
||
check.dynamic.public | ||
オブジェクトが直接結合されている、公開 (public) Solaris シンボルのリストが入っています。 |
||
check.dynamic.unbound | ||
ldd -r の実行時に、動的リンカーで結合されなかったシンボルのリストが入っています。ldd によって返された file not found と記載された行も含まれます。 |
||
summary.dynamic | ||
|
appcert
の終了時には、次の 4 つの値のうちの 1 つが返されます。
バイナリが不安定となり得る要因は appcert
では見つかりませんでした。
appcert
ユーティリティは正常に実行されませんでした。
appcert
がチェックしたオブジェクトの一部に、バイナリの安定性に問題がある可能性があります。
appcert
ユーティリティはチェックするバイナリオブジェクトを見つけることができませんでした。
appcert
が報告した問題に対する対処方法
非公開シンボルの使用。 Solaris のリリースごとに、非公開シンボルの動作が変わっていたり、非公開シンボルがなくなっている場合があるため、非公開シンボルに依存するアプリケーションは、開発された Solaris リリースとは異なるリリース上では実行できない可能性があります。appcert
によって、アプリケーションで非公開シンボルが使用されていると報告された場合は、非公開シンボルを使用しないでアプリケーションを書き直す必要があります。
降格されたシンボル。 降格されたシンボルとは、後の Solaris リリースで削除された、または有効範囲が局所的 (ローカル) となる Solaris ライブラリの関数やデータ変数を指します。そうしたシンボルを直接呼び出すアプリケーションは、ライブラリがそのシンボルを外部参照可能としないリリースでは実行できなくなります。
結合されていないシンボル。 結合されていないシンボルは、appcert
によって呼び出されたときに動的リンカーが解決できなかったアプリケーションによって参照されるライブラリシンボルを指します。結合されていないシンボルは、必ずしもバイナリの安定性が低いことを示すものではありませんが、降格されたシンボルに対する依存関係のような、重大な問題を示している可能性があります。
旧式のライブラリ。 旧式のライブラリは将来のリリースで Solaris から削除される可能性があります。appcert
ユーティリティはそうしたライブラリが使用されていると注意を喚起します。今後のリリースでそのライブラリがなくなると、それに依存するアプリケーションが動作しなくなるからです。こうした問題を避けるため、旧式のライブラリのインタフェースは使用しないでください。
sys_errlist または sys_nerr の使用。 sys_errlist シンボルおよび sys_nerr シンボルの使用は、sys_errlist 配列の終端より後に対して参照が行われる場合があるため、バイナリの安定性を低下させる可能性があります。こうした危険を回避するため、代わりに strerror を使用してください。
強いシンボルや弱いシンボルの使用。 今後の Solaris のリリースでは動作が変わる可能性があるため、弱いシンボルと関連付けられている強いシンボルは、非公開として予約されています。アプリケーションは、弱いシンボルを直接的にのみ参照しなければなりません。強いシンボルの例に _socket がありますが、これは弱いシンボル socketと関連付けられています。