EN JA
ELF_UPDATE(3)
ELF_UPDATE(3) FreeBSD Library Functions Manual ELF_UPDATE(3)

名称

elf_updateELF 記述子を更新する

ライブラリ

ELF Access Library (libelf, -lelf)

書式

#include < libelf.h>

off_t
elf_update( Elf *elf, Elf_Cmd cmd);

解説

関数 elf_update() によって、ライブラリは、ELF オブジェクトの構造を再計算し、オプションでオブジェクトのイメージをファイルに書き込みます。

引数 elf は、ELF オブジェクトへの記述子です。引数 cmd は、次の値を取ることができます:

ELF_C_NULL
ライブラリは、 ELF_F_DIRTY フラグで変更された構造体の構造的な情報を再計算しますが、データを基本的なファイルイメージに書き戻します。
ELF_C_WRITE
ライブラリは、構造的な情報について再計算し、新しいイメージを基本的なファイルに書き込みます。

ファイルレイアウト

ELF_F_LAYOUT フラグが ELF 記述子に設定されていたなら、アプリケーションは、ELF オブジェクトのレイアウトについて完全に責任を負います。このフラグが設定されていないなら、ELF ライブラリは、関連するセクション記述子からファイルのレイアウトを計算します。

ELF ファイルの次の構造体のメンバを管理するのは、アプリケーションの責任です:

実行形式ヘッダ
ELF の実行形式ヘッダは、 elf(5) で説明されています。 ELF 実行形式ヘッダの次のメンバは、アプリケーションの責任です:

e_entry
実行形式のために必要なエントリアドレスを設定します。
e_flags
必要なプロセッサに特有のフラグを設定します。
e_ident[EI_DATA]
ELFDATA2LSB または ELFDATA2MSB の 1 つを設定しなければなりません。
e_ident[EI_OSABI]
必要な OS ABI を設定します。 FreeBSD の実行形式において、このフィールドは、 ELFOSABI_FREEBSD に設定されるべきです。
e_machine
必要なマシンアーキテクチャ、 < sys/elf_common.h>EM_* 値の 1 つを設定します。
e_phoff
アプリケーションがオブジェクトのレイアウトを管理しているなら、このフィールドを ELF プログラムヘッダテーブルのファイルオフセットに設定しなければなりません。
e_shoff
アプリケーションがオブジェクトのレイアウトを管理しているなら、このフィールドを ELF セクションヘッダテーブルのファイルオフセットに設定しなければなりません。
e_shstrndx
セクション名を含む文字列テーブルのインデックスを設定します。
e_type
ELF オブジェクトのタイプ、 < sys/elf_common.h>ET_* 値の 1 つを設定します。
e_version
ELF オブジェクトの必要なバージョンを設定します。
プログラムヘッダ
プログラムヘッダテーブルのエントリのすべてのフィールドは、アプリケーションで制御されます。
セクションヘッダ
ELF セクションヘッダは、 elf(5) で説明されています。 ELF セクションヘッダの次のメンバは、アプリケーションの責任です:

sh_addr
セクションがあるべきな物理的なメモリアドレスを設定します。
sh_addralign
アプリケーションがファイルレイアウトを管理しているなら、このフィールドをセクションの内容のために必要な整列に設定しなければなりません。この値は、2 の冪乗でなければなりません。
sh_entsize
固定サイズの要素を含むセクションのためにエントリのサイズを設定するか、または固定サイズの要素がないセクションのに 0 を設定します。アプリケーションがファイルレイアウトを管理していないなら、ライブラリに知られているタイプのそれらのセクションのために 0 としてこのフィールドをそのままとします。
sh_flags
必要なセクションフラグを設定します。
sh_info
elf(5) で説明されるように設定します。
sh_link
elf(5) で説明されるように設定します。
sh_name
セクション名を含む文字列テーブルのセクション名のインデックスを設定します。
sh_offset
アプリケーションがファイルレイアウトを管理しているなら、このフィールドをセクションの内容のファイルオフセットに設定しなければなりません。
sh_size
アプリケーションがファイルレイアウトを管理しているなら、このフィールドをセクションの内容のファイルサイズに設定しなければなりません。
sh_type
セクションのタイプを設定します。

ファイルの内容の範囲のギャップ (すき間) は、 elf_fill(3) によって指定された値で満たされます。

アプリケーションが ELF 記述子で ELF_F_LAYOUT フラグを設定することによってファイルのレイアウトの完全な制御を要求したなら、ファイルの内容の範囲にギャップがないことを保証するべきです。

記述子 elf に関連している Elf_ScnElf_Data へのすべてのポインタは、 elf_update() への呼び出しの後に無効であると見なされるべきです。

戻り値

関数 elf_update() は、成功するなら、ファイルイメージの合計サイズを返し、エラーが生じるなら、-1 を返します。

エラー

これらの関数は、次のエラーで失敗するかもしれません:
[ ELF_E_ARGUMENT]
引数 elf が NULL でした。
[ ELF_E_ARGUMENT]
引数 cmd が認識されませんでした。
[ ELF_E_ARGUMENT]
引数 elf が、ELF オブジェクトのための記述子ではありませんでした。
[ ELF_E_CLASS]
引数 elf の実行形式ヘッダの e_ident[EI_CLASS] フィールドは、ファイルのクラスに一致しませんでした。
[ ELF_E_DATA]
引数 elf に含まれた Elf_Data 記述子は、セクションを含むのと不適合であるタイプを指定しました。
[ ELF_E_HEADER]
引数 elf の ELF ヘッダは、既にファイルに関連しているバイト順序と異なったバイト順序を要求しました。
[ ELF_E_IO]
I/O エラーに遭遇しました。
[ ELF_E_LAYOUT]
引数 elf に含まれた Elf_Data 記述子は、セクションを含むのと不適合である整列を指定しました。
[ ELF_E_LAYOUT]
引数 elf は、範囲が重なったセクション記述子を含みました。
[ ELF_E_LAYOUT]
引数 elf は、不正に整列されたか、またはそれらのデータには小さ過ぎるセクション記述子を含みました。
[ ELF_E_LAYOUT]
フラグ ELF_F_LAYOUT は、Elf 記述子に設定され、セクションヘッダテーブルは、セクション記述子によってマップされたオブジェクトの範囲が重ね合わさっています。
[ ELF_E_MODE]
ELF_C_WRITE 操作が、書き込みまたは更新用にオープンされなかった ELF 記述子で要求されました。
[ ELF_E_SECTION]
引数 elf は、認識されていないタイプがあるセクションを含みました。
[ ELF_E_SECTION]
インデックス SHN_UNDEF のセクションヘッダには、不正なセクションタイプがありました。
[ ELF_E_SEQUENCE]
ELF_C_WRITE 操作が、基本的なファイルから ELF 記述子 elf を分離された elf_cntl( elf, ELF_C_FDDONE) への前の呼び出しの後に要求されました。
[ ELF_E_VERSION]
引数 elf がサポートされないバージョンであるか、またはサポートされないバージョンで Elf_Data 記述子を含みました。
March 19, 2008 FreeBSD