本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 3 : ライブラリ (A~M) > e

elf(3E)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

elf ― オブジェクトファイルのアクセスライブラリ

構文

cc [flag... ] file... -lelf [library] ...

#include <libelf.h>

説明

ELF アクセスライブラリの各種機能を使用すると、プログラムは ELF (実行可能およびリンク形式) オブジェクトファイル、アーカイブファイル、およびアーカイブメンバーを操作することができます。ヘッダファイルは、すべてのライブラリサービスに対する型宣言と関数宣言を提供します。

プログラムは、 ELF 記述子 を使って、多くの上位ルーチンと通信します。つまり、プログラムがファイルを使って作業を始めると、 elf_begin によって ELF 記述子が作成され、プログラムはこれを使ってファイルの構造やファイル内の情報を操作します。この ELF 記述子は、ファイルの読み取りと書き込みの両方に使用できます。ファイルに ELF 記述子を設定した後、プログラムはセクション 記述子 を入手して、ファイルのセクションを操作できるようになります (elf_getscn(3E) を参照)。セクションには、テキスト、データ、シンボルテーブル等、オブジェクトファイルの実情報が大量に保存されます。セクションがファイルに属するように、セクション記述子は特定の ELF 記述子に「属します」。最後に、データ 記述子 がセクション記述子から使用できます。プログラムはこれを使って、セクションに関連付けられている情報を操作することができます。データ記述子は、セクション記述子に「属します」。

記述子は、ファイルとその各部のプライベートハンドルとして機能します。つまり、データ記述子は 1 つのセクション記述子に関連付けられており、セクション記述子は 1 つの ELF 記述子に関連付けられており、ELF 記述子は 1 つのファイルに関連付けられています。記述子はプライベートなものですが、共有データにアクセスするためにも使えます。入力ファイルを組み合わせたプログラムで、着信データを使って別のファイルを作成したりアップデートするプログラムを考えてみましょう。 このようなプログラムは、入力セクションと出力セクション用に記述子を入手することがあります。これによって、プログラムは、入力記述子のデータを再使用するために出力記述子をアップデートすることができます。つまり、記述子はそれぞれ別個のものですが、関連したデータバイトを共有することができます。このような共有によって、重複したバッファによるスペースオーバーヘッドを避け、データの不要なコピー操作によるパフォーマンスオーバーヘッドを避けることができます。

ファイルクラス

ELF によって提供されるワークフレームは、1 つのファミリのオブジェクトファイルを定義して、複数のプロセッサとアーキテクチャをサポートします。 オブジェクトファイルの間で区別しなければならない重要なことは、ファイルのクラス 、すなわち容量です。32 ビットのクラスは、次に示すように、32 ビットのオブジェクトがアドレス、ファイルサイズ、その他を表現できるアーキテクチャをサポートします。

名前目的
Elf32_Addr 符合なしアドレス
Elf32_Half 符合なし単精度整数
Elf32_Off 符合なしファイルオフセット
Elf32_Sword 符合付き倍精度整数
Elf32_Word 符合なし倍精度整数
unsigned char符合なし 8 ビット整数

その他のクラスは、大型の (または、小型の) マシンをサポートするために、必要に応じて定義されます。ライブラリサービスの中には、特定のクラスのデータオブジェクトだけを処理するものもあれば、クラスには依存しないものもあります。この区別を明確にするために、ライブラリ関数は、次に説明するように、それぞれのステータスを反映しています。

データ表現

概念上は、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_name 

クラスに依存しないこの名前は、プログラムに対して一部のサービス、 name を実行します。

elf32_name 

埋め込みクラスのあるサービス名。ここで、 32 はファイルの指定クラスだけに機能することを示します。

elf64_name 

埋め込みクラスのあるサービス名。ここで、 64 はファイルの指定クラスだけに機能することを示します。

Elf_Type 

データ型もクラスに依存せず、 Type によって区別します。

Elf32_Type 

クラスに依存するデータ型で、埋め込みクラス名 (ここでは 32) を持っています。

Elf64_Type 

クラスに依存するデータ型で、埋め込みクラス名 (ここでは 64) を持っています。

ELF_C_CMD 

いくつかの関数は、自らのアクションを制御するコマンドを取ります。この値は、 Elf_Cmd 列挙のメンバーであり、ゼロから ELF_C_NUM-1 の範囲にわたります。

ELF_F_FLAG 

いくつかの関数は、ライブラリのステータスとアクション、またはどちらか一方を制御するフラグを取ります。フラグは、結合できるビットです。

ELF32_FSZ_TYPE 

この定数は、ファイルの 32 ビットのクラスに対して、基本的な ELF 型のファイルサイズをバイト数で指定します。詳しくは、 elf_fsize を参照してください。

ELF64_FSZ_TYPE 

この定数は、ファイルの 64 ビットのクラスに対して、基本的な ELF 型のファイルサイズをバイト数で指定します。詳しくは、 elf_fsize を参照してください。

ELF_K_KIND 

関数 elf_kind は、ELF 記述子に関連付けられたファイルの種類 を識別します。この値は、 Elf_Kind 列挙のメンバーであり、ゼロから ELF_K_NUM-1 の範囲にわたります。

ELF_T_TYPE 

elf_xlate などのサービス関数が複数の型を処理する場合、この形式の名前によって目的の を指定します。例えば、 ELF_T_EHDR は直接 Elf32_Ehdr に関連します。この値は Elf_Type 列挙のメンバーであり、ゼロから ELF_T_NUM-1 の範囲にわたります。

注意

ELF ヘッダファイル内の情報は、共通部分とプロセッサ固有の部分に分かれています。プログラムは、適切なヘッダファイルを含めることによって、プロセッサの情報を使えるようになります。例えば、 sys/elf_NAME.h を使います (ここで、 NAME は ELF ファイルヘッダに使用したプロセッサ名と同じ名前です)。

記号プロセッサ
pariscPA RISC

他のプロセッサは、必要に応じてこの表に追加されます。例えば、プログラムは次のコードを使って、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)

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.