Solaris 8 のソフトウェア開発 (追補)

第 10 章 appcert の使用

Solaris 8 4/01 リリースで、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_PATHRPATH を介して、それらのライブラリにアクセスできなければなりません。

appcert アプリケーションでは、マシンが 64 ビットの Solaris カーネルを実行していない場合、64 ビットのアプリケーションはチェックできません。appcert が 64 ビットのアプリケーションをチェックしているときは、静的リンクのチェックは行われません。

appcert ユーティリティでは次の項目は検査できません。

appcert での作業

appcert を使用してアプリケーションをチェックするには、次のように実行します。


appcert object|directory
object|directory は、次のどちらかです。


注 –

チェックされるアプリケーションが実行される環境とは異なる環境で appcert を実行する場合、appcert ユーティリティは Solaris ライブラリインタフェースへの参照を正しく解決できない可能性があります。


appcert ユーティリティは Solaris 実行時リンカーを使用して、実行可能プログラムや共用オブジェクトファイルごとにインタフェースへの依存関係のプロファイルを作成します。このプロファイルを使用すると、アプリケーションが依存する Solaris システムインタフェースが判別できます。プロファイルに記述された依存関係は Solaris ABI と比較され、準拠しているかどうかが確認されます (非公開インタフェースがあってはいけません)。

appcert ユーティリティは再帰的にディレクトリを検索してオブジェクトファイルを探しますが、ELF 以外のオブジェクトファイルは無視します。appcert によるアプリケーションのチェックが完了すると、標準出力 (stdout、通常は画面) に終了報告が出力されます。同じ内容が作業用ディレクトリ、通常は /tmp/appcert.pid の、Report という名前のファイルに書き込まれます。サブディレクトリ名の pidappcert のプロセス ID で 1〜6 桁の数字で示されます。appcert が出力ファイルを書き込むディレクトリ構造の詳細については、appcert の結果を参照してください。

appcert のオプション

次のオプションによって appcert ユーティリティの動作が変更できます。コマンド行では、appcert コマンドの後、object|directory オペランドの前に、オプションを入力します。

-B

バッチモードで appcert を実行します。

バッチモードでは、appcert が作成するレポートの各行に、チェックしたバイナリが記録されます。

PASS で始まる行は、その行に指定されているバイナリに対して appcert の警告を発しなかったことを示します。

FAIL で始まる行は、そのバイナリで問題が見つかったことを示します。

INC で始まる行は、その行に指定されているバイナリが、完全にはチェックできなかったことを示します。

-f infile

infile ファイルはチェックの対象となるファイルのリストで、1 行に 1 つのファイル名を指定します。コマンド行でファイルが指定されている場合は、そのファイルと共にチェックの対象となります。このオプションを使用する場合は、コマンド行でオブジェクトやディレクトリを指定する必要はありません。

-h

appcert の使用方法の情報を出力します。

-L

デフォルトでは、appcert はアプリケーションの共用オブジェクトをすべてチェックし、共用オブジェクトがあるディレクトリを LD_LIBRARY_PATH に追加します。-L オプションを指定すると、この動作が無効になります。

-n

デフォルトでは、appcert はディレクトリを検索してチェックするバイナリを探すときに、シンボリックリンクをたどります。-n オプションを指定すると、この動作が無効になります。

-S

LD_LIBRARY_PATH に Solaris ライブラリディレクトリである /usr/openwin/lib/usr/dt/lib を追加します。

-w working_dir

ライブラリコンポーネントの実行と、一時ファイルの作成を行うディレクトリを指定します。このオプションが指定されていない場合、appcert/tmp ディレクトリを使用します。

appcert の結果

appcert ユーティリティによる、アプリケーションのオブジェクトファイルに対する分析結果は、appcert ユーティリティの作業用ディレクトリ (通常は /tmp) に作成されるサブディレクトリの下に置かれるいくつかのファイルに書き込まれます。作業用ディレクトリに作成されるサブディレクトリ名は appcert.pid で、pidappcert のプロセス ID です。

Index

チェック済みのバイナリと、そのバイナリに対する appcert の出力が置かれるサブディレクトリとの間の対応が入ります。

Report

appcert の実行時に stdout に表示された、終了報告のコピーが保存されます。

Skipped

appcert がチェックするように要求されたが処理を飛ばさざるを得なかったバイナリのリストが入ります。各バイナリが処理を飛ばされた理由も記載されます。理由には、次のものがあります。

  • ファイルがバイナリのオブジェクトでない

  • ファイルをユーザーが読み取ることができない

  • ファイル名にメタキャラクタが含まれている

  • ファイルに実行ビットが設定されていない

objects/object_name

objects のサブディレクトリの下には、appcert が検査したオブジェクトごとにサブディレクトリが作られます。それぞれのサブディレクトリには、次のファイルが入っています。

check.demoted.symbols

 
 

降格された Solaris シンボルの可能性があると appcert が判断したシンボルのリストが入っています。

check.dynamic.private

 
 

オブジェクトが直接結合されている、非公開 Solaris シンボルのリストが入っています。 

check.dynamic.public

 
 

オブジェクトが直接結合されている、公開 (public) Solaris シンボルのリストが入っています。 

check.dynamic.unbound

 
 

ldd -r の実行時に、動的リンカーで結合されなかったシンボルのリストが入っています。ldd によって返された file not found と記載された行も含まれます。

summary.dynamic

 
 

appcert が検査したオブジェクトの動的結合の要約を、印刷用に整形したものが入っています。これには、各 Solaris ライブラリから使用された公開シンボルや非公開シンボルのテーブルも含まれています。

appcert の終了時には、次の 4 つの値のうちの 1 つが返されます。

0

バイナリが不安定となり得る要因は appcert では見つかりませんでした。

1

appcert ユーティリティは正常に実行されませんでした。

2

appcert がチェックしたオブジェクトの一部に、バイナリの安定性に問題がある可能性があります。

3

appcert ユーティリティはチェックするバイナリオブジェクトを見つけることができませんでした。

appcert が報告した問題に対する対処方法