ELF_UPDATE(3) | FreeBSD Library Functions Manual | ELF_UPDATE(3) |
名称
elf_update — ELF 記述子を更新するライブラリ
ELF Access Library (libelf, -lelf)解説
関数 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_Scn と Elf_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 記述子を含みました。
関連項目
elf(3), elf32_getehdr(3), elf32_getphdr(3), elf32_newehdr(3), elf32_newphdr(3), elf64_getehdr(3), elf64_getphdr(3), elf64_newehdr(3), elf64_newphdr(3), elf_cntl(3), elf_fill(3), elf_flagehdr(3), elf_flagelf(3), elf_getdata(3), elf_getscn(3), elf_newdata(3), elf_newscn(3), elf_rawdata(3), gelf(3), gelf_newehdr(3), gelf_newphdr(3), elf(5)March 19, 2008 | FreeBSD |