| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 3 : ライブラリ (A~M) > eelf(3E)HP-UX 11i Version 2: September 2004 |
|
名称elf ― オブジェクトファイルのアクセスライブラリ 説明ELF アクセスライブラリの各種機能を使用すると、プログラムは ELF (実行可能およびリンク形式) オブジェクトファイル、アーカイブファイル、およびアーカイブメンバーを操作することができます。ヘッダファイルは、すべてのライブラリサービスに対する型宣言と関数宣言を提供します。 プログラムは、 ELF 記述子 を使って、多くの上位ルーチンと通信します。つまり、プログラムがファイルを使って作業を始めると、 elf_begin によって ELF 記述子が作成され、プログラムはこれを使ってファイルの構造やファイル内の情報を操作します。この ELF 記述子は、ファイルの読み取りと書き込みの両方に使用できます。ファイルに ELF 記述子を設定した後、プログラムはセクション 記述子 を入手して、ファイルのセクションを操作できるようになります (elf_getscn(3E) を参照)。セクションには、テキスト、データ、シンボルテーブル等、オブジェクトファイルの実情報が大量に保存されます。セクションがファイルに属するように、セクション記述子は特定の ELF 記述子に「属します」。最後に、データ 記述子 がセクション記述子から使用できます。プログラムはこれを使って、セクションに関連付けられている情報を操作することができます。データ記述子は、セクション記述子に「属します」。 記述子は、ファイルとその各部のプライベートハンドルとして機能します。つまり、データ記述子は 1 つのセクション記述子に関連付けられており、セクション記述子は 1 つの ELF 記述子に関連付けられており、ELF 記述子は 1 つのファイルに関連付けられています。記述子はプライベートなものですが、共有データにアクセスするためにも使えます。入力ファイルを組み合わせたプログラムで、着信データを使って別のファイルを作成したりアップデートするプログラムを考えてみましょう。 このようなプログラムは、入力セクションと出力セクション用に記述子を入手することがあります。これによって、プログラムは、入力記述子のデータを再使用するために出力記述子をアップデートすることができます。つまり、記述子はそれぞれ別個のものですが、関連したデータバイトを共有することができます。このような共有によって、重複したバッファによるスペースオーバーヘッドを避け、データの不要なコピー操作によるパフォーマンスオーバーヘッドを避けることができます。 ファイルクラスELF によって提供されるワークフレームは、1 つのファミリのオブジェクトファイルを定義して、複数のプロセッサとアーキテクチャをサポートします。 オブジェクトファイルの間で区別しなければならない重要なことは、ファイルのクラス 、すなわち容量です。32 ビットのクラスは、次に示すように、32 ビットのオブジェクトがアドレス、ファイルサイズ、その他を表現できるアーキテクチャをサポートします。
その他のクラスは、大型の (または、小型の) マシンをサポートするために、必要に応じて定義されます。ライブラリサービスの中には、特定のクラスのデータオブジェクトだけを処理するものもあれば、クラスには依存しないものもあります。この区別を明確にするために、ライブラリ関数は、次に説明するように、それぞれのステータスを反映しています。 データ表現概念上は、2 つのオブジェクトのパラレルセットで異なるコンパイル環境をサポートしています。一方のセットはファイル内容に対応し、もう一方はファイルを操作しているプログラムのネイティブ メモリイメージに対応しています。ヘッダファイルによって提供される型定義はネイティブマシンで機能しますが、このネイティブマシンのデータ符号化 (サイズ、バイト順序、その他) がターゲットマシンのものと異なる場合があります。 ネイティブ メモリオブジェクトは少なくともファイルオブジェクトと同じ大きさでなければなりませんが (情報が失われないようにするため)、ホストマシンにとって大きい方が適当であれば、ネイティブ メモリオブジェクトが大きくなってもかまいません。 変換機能は、ファイルとメモリの表現方法を変換するためにあります。ライブラリルーチンの中には、自動的にデータを変換するものもあれば、変換をプログラムに任せるものもあります。いずれにしても、オブジェクトファイルを作成するプログラムは、ファイルタイプの付いたオブジェクトをそのファイルに書き込まなければならず、オブジェクトファイルを読み取るプログラムは、同じような表示形式を取らなければなりません。詳しくは、 elf_xlate(3E) および elf_fsize(3E) を参照してください。 プログラムは、オブジェクトファイルのレイアウトとセマンティックスを完全に管理して、データを明示的に変換することができます。プログラムに完全な管理能力を与え、プログラムがそれを実行できるようにしたくない場合は、ライブラリはより高度なインタフェースを使って、オブジェクトファイルの詳細を非表示にします。プログラムは elf_begin および関連する関数を使ってネイティブメモリの型を処理し、オブジェクトファイルを読み取ったり書き込むときに、メモリオブジェクトとそれに対応するファイルとの間で変換します。 ELF バージョンオブジェクトファイルのバージョンにより、ELF は新しい要件に適応できます。プログラムに重要なバージョンとして、3 つの独立したバージョンが考えられます。まず、アプリケーションプログラムは特定のヘッダファイルでコンパイルされるために、特定のバージョンを認識します。2 番目として、アクセスライブラリは、それが認識しているバージョンを制御するヘッダファイルによって同様にコンパイルされます。3 番目として、ELF オブジェクトファイルにはそのバージョンを識別する値が保存されますが、これは、 そのファイルの作成者が認識している ELF バージョンによって決められたものです。この 3 つのバージョンがすべて同じであることが理想ですが、違っていてもかまいません。 プログラムのバージョンがアクセスライブラリよりも新しい場合、プログラムはライブラリに認識されていない情報を使うことがあります。この場合、変換ルーチンが正しく機能せずに、未定義の動作が起こることがあります。この状態では、新しいライブラリをインストールした方が安全です。 ライブラリのバージョンがプログラムおよびファイルのバージョンよりも新しい場合があります。ライブラリは旧バージョンを認識するため、この場合は互換性の問題は起こりません。 最後に、ファイルのバージョンがプログラムまたはライブラリが認識しているバージョンよりも新しい場合があります。ファイルに特別な情報があるかどうか、また、その情報を無視しても問題ないかどうかによって、プログラムがファイルを正しく処理できる場合とできない場合があります。この場合も、ファイルのバージョンを認識できる新しいライブラリをインストールするのが、安全な方法です。 このような相違に対応するために、プログラムは elf_version を使ってそのバージョンをライブラリに渡し、プロセス用に作業バージョン を設定しなければなりません。これを使って、ライブラリは適切な表現方式のデータをプログラムから受け取ったり、プログラムに提供します。ライブラリは、オブジェクトファイルを読み取るときに、各ファイルのバージョンを使ってデータを解釈します。ファイルを書き込んだり、メモリの型をファイルの同等の型に変換する場合、ライブラリはファイルデータ用にプログラムの作業バージョンを使います。 システムサービス前に説明したように、 elf_begin および関連するルーチンは ELF ファイルにとってより高度なインタフェースとして機能し、アプリケーションプログラムのために入出力を実行します。このルーチンは、一時ファイルを明示的に使わなくても、プログラムがファイル全体をメモリに保持できるものと想定します。ファイルを読み取るときに、ライブラリルーチンはデータをメモリに保存して、メモリのコピー上でそれ以降の操作を実行します。 このモデルで大きなオブジェクトファイルの読み取りまたは書き込みを行うプログラムは、大きいプロセス仮想アドレス空間を持つマシン上で実行する必要があります。オープンしているファイル数が基本オペレーティングシステムによって限られている場合には、 elf_cntl を使ってファイルから必要なデータをすべて取り出し、プログラムがファイル記述子をクローズしたり、それを再使用できるようにします。 elf_begin インタフェースは多くのプログラムにとって便利であり、効率的ですが、一部のプログラムには不適切な場合があります。このような場合には、アプリケーションで elf_xlate データ変換ルーチンを直接起動してもかまいません。このルーチンは入出力は行わず、それをアプリケーションに任せます。アプリケーションは、ジョブの大きい方のシェアを引き受けて、入出力モデルを制御します。 ライブラリ名ライブラリに関連付けられる名前には、いくつかの形式があります。
注意ELF ヘッダファイル内の情報は、共通部分とプロセッサ固有の部分に分かれています。プログラムは、適切なヘッダファイルを含めることによって、プロセッサの情報を使えるようになります。例えば、 sys/elf_NAME.h を使います (ここで、 NAME は ELF ファイルヘッダに使用したプロセッサ名と同じ名前です)。
他のプロセッサは、必要に応じてこの表に追加されます。例えば、プログラムは次のコードを使って、WE 32100 用にプロセッサ固有の情報を「表示」することができます。 #include <libelf.h> #include <sys/elf_M32.h> sys/elf_M32.h 定義がない場合は、共通の ELF 情報だけが表示されます。 参照a.out(4), ar(4), elf_begin(3E), elf_cntl(3E), elf_end(3E), elf_error(3E), elf_fill(3E), elf_flag(3E), elf_fsize(3E), elf_getarhdr(3E), elf_getarsym(3E), elf_getbase(3E), elf_getdata(3E), elf_getehdr(3E), elf_getident(3E), elf_getphdr(3E), elf_getscn(3E), elf_getshdr(3E), elf_hash(3E), elf_kind(3E), elf_next(3E), elf_rand(3E), elf_rawfile(3E), elf_strptr(3E), elf_update(3E), elf_version(3E), elf_xlate(3E) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||