日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.3-RELEASE-K, 13.0-RELEASE-K から 13.2-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
ELF(3) FreeBSD ライブラリ関数マニュアル ELF(3) 名称 elf -- ELF オブジェクトを操作する API ライブラリ ELF 解析ライブラリ (libelf, -lelf) 書式 #include <libelf.h> 解説 ELF 解析ライブラリ (libelf, -lelf) は、アプリケーションが ELF オブジェク トファイルを読み込んで操作でき、ar(1) アーカイブを読み込むことができる関 数群を提供しています。ライブラリによって、バイト順序とワードサイズ独立の 方法で、ELF オブジェクトの操作ができ、アプリケーションは、32 と 64 ビット のアーキテクチャとリトルエンディアンとビッグエンディアンのマシンのための ELF オブジェクトを読み込んで、作成することができます。ライブラリは、拡張 セクションの番号付けを使用する ELF オブジェクトを処理する能力があります。 このマニュアルページは、ELF ライブラリの機能性の概要を提供するのに役立ち ます。ライブラリに含まれている個々の ELF(3) 関数のマニュアルページに、さ らなる詳細があります。 ELF 概念 elf(5) で説明されるように、ELF ファイルは、特有の方法でレイアウトされてい るいくつかのデータ構造を含んでいます。ELF ファイルは、``実行形式のヘッ ダ'' で始まり、省略可能な ``プログラムヘッダテーブル'' と省略可能な ELF ``セクション'' の形式のデータを含んでいます。``セクションヘッダテーブル'' は、これらのセクションのデータの内容を説明しています。 ELF オブジェクトには、オブジェクトに使われているアーキテクチャにに自然な マシンワードサイズを示す関連する ``ELF クラス'' があります。32 ビットの アーキテクチャのためのオブジェクトには、ELFCLASS32 の ELF のクラスがあり ます。64 ビットのアーキテクチャのためのオブジェクトには、ELFCLASS64 の ELF のクラスがあります。 また、ELF オブジェクトには、オブジェクトに関連しているマシンアーキテク チャのエンディアンを示す関連する ``エンディアン'' があります。これは、リ トルエンディアンアーキテクチャのための ELFDATA2LSB とビッグエンディアン アーキテクチャのための ELFDATA2MSB です。 また、ELF オブジェクトも API バージョン番号に関連しています。このバージョ ン番号は、ELF ファイルの個々の構成要素と、これらに関連しているセマンティ クスのレイアウトを決定しています。 データ表現と変換 ELF(3) ライブラリは、ELF データ構造の ``ネイティブ'' 表現とそれらの ``ファイル'' 表現を区別しています。 アプリケーションは、``ネイティブ'' 表現の ELF データで動作します、すなわ ち、ネイティブのバイト順と、アプリケーションが実行しているプロセッサに よって強制された整列を使用します。同じデータの ``ファイル'' 表現は、異 なったバイト順序を使用して、これらのネイティブの制約よりオブジェクト整列 で異なった制約に従います。 従って、ELF(3) ライブラリは、それらの表現から、またその表現への変換機能 (elf32_xlatetof(3), elf32_xlatetom(3), elf64_xlatetof(3) と elf64_xlatetom(3)) を提供し、明白な方法で ELF オブジェクトからデータを検 索して、格納するより高いレベルの API も提供します。 ライブラリ動作バージョン 概念的に、ELF オブジェクトを操作するために ELF ライブラリを使用するアプリ ケーションに関連している 3 つのバージョン番号があります: • アプリケーションがコンパイルされた ELF バージョン。このバージョ ンは、アプリケーションによって予想された ABI を決定します。 • ELF ライブラリを通してアプリケーションによって操作される ELF オ ブジェクトの ELF バージョン。 • ELF ライブラリ自体によってサポートされる ELF バージョン (また は、バージョンのセット)。 異なるバージョンの ELF オブジェクトで容易に動作するために、ELF ライブラリ は、アプリケーションが必要とする動作するバージョンのライブラリに知らせる ために、操作の多くを呼び出す前に elf_version() 関数を呼び出すためのアプリ ケーションを必要とします。 現在の実装では、すべての 3 つのバージョンは、EV_CURRENT でなければなりま せん。 名前空間使用 ELF ライブラリは、次の接頭辞を使用します: elf_ クラス独立の関数に使用されます。 elf32_ 32 ビットの ELF オブジェクトで動作する関数に使用されます。 elf64_ 64 ビットの ELF オブジェクトで動作する関数に使用されます。 Elf_ クラス独立のデータタイプに使用されます。 ELF_C_ いくつかの関数で使用されるコマンド値に使用されます。これらのシン ボルは、Elf_Cmd 列挙型のメンバとして定義されます。 ELF_E_ エラー番号に使用されます。 ELF_F_ フラグに使用されます。 ELF_K_ これらの定数は、ELF 記述子に関連しているファイルの種類を定義しま す。elf_kind(3) を参照してください。シンボルは、Elf_Kind 列挙型 で定義されます。 ELF_T_ これらの値は、Elf_Type 列挙型で定義されて、ELF オブジェクトに存 在する ELF データ構造のタイプを示します。 さらに、ライブラリは、内部の使用のために接頭辞 _ELF と _libelf を付けてシ ンボルを使用します。 記述子 アプリケーションは、記述子を使用してライブラリと交信します。これらは、次 の通りです: Elf Elf 記述子は、ELF オブジェクト、または ar(1) アーカイブを表しま す。elf_begin() または elf_memory() 関数の 1 つを使用してそれを 割り付けます。ELF ファイルにデータを読み込み書き込みするために Elf 記述子を使用することができます。0 以上の Elf_Scn セクション 記述子に Elf 記述子を関連づけることができます。 ELF 記述子を与えて、アプリケーションは、elf32_getehdr() または elf64_getehdr() 関数を使用して、ELF オブジェクトのクラスに依存 する ``実行形式ヘッダ'' 構造を検索することができます。 elf64_newehdr() または elf64_newehdr() 関数を使用して、新しい Ehdr 構造を割り付けることができます。 elf32_getphdr() または elf64_getphdr() 関数を使用して、ELF 記述 子に関連している ``プログラムヘッダテーブル'' を割り付けること ができます。新プログラムヘッダテーブルを割り付けるか、または elf32_newphdr() または、elf64_newphdr() 関数を使用して既存の テーブルをリサイズします。 Elf 構造は、不透明 (サイズおよび形がわからないもの) であり、ア プリケーションに見えるメンバはありません。 Elf_Data Elf_Data データ構造は、メモリで表現されるような ELF ファイルの 個々の塊について記述しています。それには、次のアプリケーション に見えるメンバがあります: uint64_t d_align ELF セクション内に含まれるデータバッ ファの in-file の整列。この値は、0 でな い、2 の冪乗なければなりません。 void *d_buf メモリのデータへのポインタ。 uint64_t d_off この記述子のデータが置かれるセクション 内に含んでいるオフセット。このフィール ドは、アプリケーションが ELF オブジェク トのレイアウトの完全な制御を要求しない なら、ライブラリによって計算されます。 uint64_t d_size この記述子のデータのバイト数。 Elf_Type d_type この記述子のデータの ELF タイプ (下記参 照)。 unsigned int d_version このバッファ中のデータの操作バージョ ン。 Elf_Data 記述子は、通常 Elf_Scn 記述子に関連しています。ELF セ クションに関連している既存のデータ記述子は、elf_getdata() と elf_rawdata() 関数を使用して検索される構造です。elf_newdata() 関数は、新しいデータ記述子を ELF セクションにアタッチするために 使用されます。 Elf_Scn Elf_Scn 記述子は、ELF オブジェクトのセクションを表します。 それらは、elf_getscn() 関数を使用して検索されます。アプリケー ションは、elf_nextscn() 関数を使用して既存の ELF オブジェクトの セクションを繰り返します。新しいセクションは、elf_newscn() 関数 を使用して割り付けられます。 Elf_Scn 記述子は、不透明であり、アプリケーションの修正できる フィールドを含んでいません。 サポートしている Elf タイプ 次の ELF データタイプが、ライブラリによってサポートされています。 ELF_T_ADDR マシンアドレス。 ELF_T_BYTE バイトデータ。ライブラリは、バイトデータを変換する試みを行 いません。 ELF_T_CAP ソフトウェアとハードウェアのケーパビリティレコード。 ELF_T_DYN タイプ SHT_DYNAMIC のセクションで使用されるレコード。 ELF_T_EHDR ELF 実行形式のヘッダ。 ELF_T_GNUHASH GNU スタイルのハッシュテーブル。 ELF_T_HALF 16 ビット符号なしワード。 ELF_T_LWORD 64 ビット符号なしワード。 ELF_T_MOVE ELF 移動レコード。 ELF_T_NOTE ELF ノート構造体。 ELF_T_OFF ファイルオフセット。 ELF_T_PHDR ELF プログラムヘッダテーブルエントリ。 ELF_T_REL ELF リロケーデョンエントリ。 ELF_T_RELA 加数がある ELF リロケーデョンエントリ。 ELF_T_SHDR ELF セクションヘッダエントリ。 ELF_T_SWORD 符号付き 32 ビットワード。 ELF_T_SXWORD 符号付き 64 ビットワード。 ELF_T_SYMINFO ELF シンボル情報。 ELF_T_SYM ELF シンボルテーブルエントリ。 ELF_T_VDEF シンボルバージョン定義レコード。 ELF_T_VNEED シンボルバージョン要件レコード。 ELF_T_WORD 符号なし 32 ビットワード。 ELF_T_XWORD 符号なし 64 ビットワード。 シンボル ELF_T_NUM は、ライブラリで知られている Elf タイプの数を示しま す。 次のテーブルは、elf(5) で定義された ELF セクションタイプとライブラリに よってサポートされているタイプの間のマッピングを示します。 セクションタイプ ライブラリタイプ 説明 SHT_DYNAMIC ELF_T_DYN `.dynamic' セクションエントリ。 SHT_DYNSYM ELF_T_SYM ダイナミックリンクのシンボル。 SHT_FINI_ARRAY ELF_T_ADDR 終了関数ポインタ。 SHT_GNU_HASH ELF_T_GNUHASH GNU ハッシュセクション。 SHT_GNU_LIBLIST ELF_T_WORD 前もってリンクされたライブラリのリ スト。 SHT_GNU_verdef ELF_T_VDEF シンボルバージョンの定義。 SHT_GNU_verneed ELF_T_VNEED シンボルバージョニングの要件。 SHT_GNU_versym ELF_T_HALF バージョンシンボル。 SHT_GROUP ELF_T_WORD セクショングループのマーカ。 SHT_HASH ELF_T_HASH シンボルハッシュ。 SHT_INIT_ARRAY ELF_T_ADDR 初期関数ポインタ。 SHT_NOBITS ELF_T_BYTE 空セクション。elf(5) 参照。 SHT_NOTE ELF_T_NOTE ELF ノートレコード。 SHT_PREINIT_ARRAY ELF_T_ADDR 前もって初期化された関数ポインタ。 SHT_PROGBITS ELF_T_BYTE マシンコード。 SHT_REL ELF_T_REL ELF リロケーションレコード。 SHT_RELA ELF_T_RELA 加数があるリロケーションレコード。 SHT_STRTAB ELF_T_BYTE 文字列テーブル。 SHT_SYMTAB ELF_T_SYM シンボルテーブル。 SHT_SYMTAB_SHNDX ELF_T_WORD 拡張セクション番号付けを使用しま す。 SHT_SUNW_dof ELF_T_BYTE dtrace(1) によって使用されます。 SHT_SUNW_move ELF_T_MOVE ELF 移動レコード。 SHT_SUNW_syminfo ELF_T_SYMINFO 追加シンボルフラグ。 SHT_SUNW_verdef ELF_T_VDEF SHT_GNU_verdef と同様です。 SHT_SUNW_verneed ELF_T_VNEED SHT_GNU_verneed と同様です。 SHT_SUNW_versym ELF_T_HALF SHT_GNU_versym と同様です。 そうでなければ、範囲 [SHT_LOOS, SHT_HIUSER] のセクションタイプは、タイプ ELF_T_BYTE であると見なされます。 機能的なグループ分け このセクションは、ELF ライブラリの利用可能な機能の簡潔な概要を含んでしま す。ここにリストされた各関数は、それ自体のマニュアルページにより詳しく説 明されています。 アーカイブのアクセス elf_getarsym() アーカイブされたシンボルテーブルを検索します。 elf_getarhdr() オブジェクトのためのアーカイブヘッダを検索しま す。 elf_getbase() アーカイブ内のメンバのオフセットを検索します。 elf_next() ar(1) アーカイブを通して繰り返します。 elf_rand() ar(1) アーカイブ内をランダムにアクセスします。 データ構造 elf_getdata() ELF セクションのために変換されたデータを検索し ます。 elf_getscn() 指定されたセクションのセクション記述子を検索し ます。 elf_ndxscn() セクションのインデックスを検索します。 elf_newdata() 新しい Elf_Data 記述子を ELF セクションに追加し ます。 elf_newscn() 新しいセクション記述子を ELF 記述子に追加しま す。 elf_nextscn() ELF オブジェクトのセクションを通して繰り返しま す。 elf_rawdata() ELF セクションのための変換されないデータを検索 します。 elf_rawfile() ELF オブジェクトの変換されないファイルの内容へ のポインタを返します。 elf32_getehdr(), elf64_getehdr() ELF オブジェクトの実行形式ヘッダを検索します。 elf32_getphdr(), elf64_getphdr() ELF オブジェクトのプログラムヘッダテーブルを検 索します。 elf32_getshdr(), elf64_getshdr() Elf_Scn 記述子に関連している ELF セクションヘッ ダを検索します。 elf32_newehdr(), elf64_newehdr() ELF オブジェクトの実行形式ヘッダを割り付けま す。 elf32_newphdr(), elf64_newphdr() ELF オブジェクトのプログラムヘッダテーブルを割 り付けるか、またはリサイズ (サイズ変更) しま す。 データ変換 elf32_xlatetof(), elf64_xlatetof() ELF データ構造をネイティブ表現からファイル表現 に変換します。 elf32_xlatetom(), elf64_xlatetom() ELF データ構造をファイル表現からネイティブ表現 に変換します。 エラー報告 elf_errno() 現在のエラーを検索します。 elf_errmsg() 現在のエラーの人間に読み込み可能な記述を検索し ます。 初期設定 elf_begin() ar(1) アーカイブまたは ELF オブジェクトを与えら れたファイル記述子でオープンします。 elf_end() ELF 記述子をクローズして、すべてのリソースを解 放します。 elf_memory() メモリ領域に存在する ar(1) アーカイブまたは ELF オブジェクトをオープンします。 elf_version() 操作バージョンを設定します。 IO 制御 elf_cntl() ELF 記述子とその基本的なファイルの間の関連性を 管理します。 elf_flagdata() Elf_Data 記述子がダーティ (汚い) とマークしま す。 elf_flagehdr() ELF 記述子の ELF 実行形式ヘッダがダーティ (汚 い) とマークします。 elf_flagphdr() ELF 記述子の ELF プログラムヘッダテーブルが ダーティ (汚い) とマークします。 elf_flagscn() Elf_Scn 記述子がダーティ (汚い) とマークしま す。 elf_flagshdr() ELF セクションヘッダがダーティ (汚い) とマーク します。 elf_setshstrndx() ELF オブジェクトのセクション名文字列テーブルの インデックスを設定します。 elf_update() ELF オブジェクトのレイアウトを再計算し、オプ ションで、変更されたオブジェクトを基本的なファ イルに書き戻します。 問い合わせ elf32_checksum(), elf64_checkum() ELF オブジェクトのチェックサムを計算します。 elf_getident() ELF オブジェクトの識別バイトを検索します。 elf_getshnum() ELF オブジェクトのセクションの数を検索します。 elf_getshstrndx() ELF オブジェクトのセクション名文字列テーブルの セクションインデックスを検索します。 elf_hash() 文字列の ELF ハッシュ値を計算します。 elf_kind() ELF 記述子に関連しているオブジェクトの種類を問 い合わせます。 elf32_fsize(), elf64_fsize() ELF タイプのファイル表現のサイズを返します。 ELF オブジェクトレイアウトの制御 操作の通常モードで、ライブラリは、セクションのオフセットを計算し、アプリ ケーションによってさらなる調整の必要性なしで ELF 記述子のセクションの内容 に基づいて整列します。 しかしながら、アプリケーションが ELF ファイルのレイアウトの完全な管理を引 き受けるなら、elf_flagelf(3) を使用して ELF 記述子に ELF_F_LAYOUT フラグ を設定し、続いて、ライブラリが、ファイルをレイアウトするとき、アプリケー ションによって指定されたデータオフセットと整列を使用します。ファイルレイ アウトのアプリケーション制御は、elf_update(3) マニュアルページに、より詳 しく説明されています。 セクション間のギャップは、関数 elf_fill() によって設定された fill (充填) 文字で満たされます。 エラー処理 エラーに遭遇する場合に、これらのライブラリ関数は、内部のエラー番号を設定 して、特別なリターン値を返すことによって、エラーの存在を示します。アプリ ケーションは、elf_errno(3) を呼び出すことによって、現在のエラー番号を チェックすることができます。記録されたエラーの人間に読み込み可能な記述 は、elf_errmsg(3) を呼び出すことによって、利用可能です。 メモリ管理規則 ライブラリは、ELF 記述子に関連しているすべての Elf_Scn と Elf_Data 記述子 の経過を追い、記述子が elf_end(3) を使用してクローズされるとき、それらを 復元します。したがって、アプリケーションは、ELF ライブラリによって割り付 けられたデータ構造で free(3) を呼び出してはなりません。 反対に、ライブラリは、割り付けられていないデータを解放しません。例とし て、アプリケーションは、新しい Elf_Data 記述子を割り付けるために elf_newdata(3) を呼び出し、malloc(3) を使用して割り付けられたメモリの領域 を指すように記述子の d_off メンバを設定することができます。この領域を解放 することは、アプリケーション責任ですが、ライブラリは、Elf_Data 記述子自体 によって使用される空間を取り戻します。 関連項目 gelf(3), elf(5) 歴史 オリジナルの ELF(3) API は、Unix System V のために開発されました。ELF(3) API の現在の実装は、FreeBSD 7.0 で登場しました。 作者 ELF ライブラリは、Joseph Koshy <jkoshy@FreeBSD.org> によって書かれまし た。 FreeBSD 11.2 July 28, 2014 FreeBSD 11.2