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

名称

elf_getdata, elf_newdata, elf_rawdataセクションデータを通して繰り返すか、または割り付けます

ライブラリ

ELF Access Library (libelf, -lelf)

書式

#include < libelf.h>

Elf_Data *
elf_getdata( Elf_Scn *scn, Elf_Data *data);

Elf_Data *
elf_newdata( Elf_Scn *scn);

Elf_Data *
elf_rawdata( Elf_Scn *scn, Elf_Data *data);

解説

これらの関数は、セクション記述子に関連しているデータ記述子にアクセスして、操作するために使用されます。 ELF ライブラリによって使用されるデータ記述子は、 elf(3) に説明されています。

関数 elf_getdata() は、セクション記述子 scn に関連している次のデータ記述子を返します。返されたデータ記述子は、変換されたデータを含むためにセットアップされます。引数 data は、NULL を指定できます、その場合、関数は、セクション scn に関連している最初のデータ記述子を返します。引数 data が NULL でないなら、それは、セクション記述子 scn に関連しているデータ記述子へのポインタでなければならず、関数 elf_getdata() は、セクションの次のデータ記述子へのポインタを返すか、セクションの記述子リストの終りに達しているとき、 NULL を返します。

関数 elf_newdata() は、新しいデータ記述子を割り付けて、それをセクション記述子 scn に関連しているデータ記述子のリストに追加します。新しいデータ記述子は、次のように初期化されます:

d_align
1 に設定。
d_buf
NUKK に初期化。
d_off
(off_t) -1 に設定。このフィールドは、 ELF_F_LAYOUT フラグが ELF 記述子で設定されていたなら、アプリケーション制御の下にあります。
d_size
0 に設定。
d_type
ELF_T_BYTE に初期化。
d_version
elf_version(3) によって設定されるようにライブラリの現在の動作バージョンに設定。

アプリケーションは、 elf_update(3) を呼び出す前に、必要に応じてこれらの値を設定しなければなりません。セクション scn は、書き込みのためにオープンされた ELF ファイルに関連していなければなりません。アプリケーションが記述子 elfELF_F_LAYOUT フラグを設定することによってレイアウトの完全な制御を要求していないなら、返された記述子によって参照されたデータは、メンバ d_align で指定されたファイルの整列を尊重する、セクションの既存の内容の後に置かれます。 elf_newdata() への呼び出しが成功して終了するときに、ELF ライブラリは、セクション scn を“dirty” (汚い) とマークします。

関数 elf_rawdata() は、セクション scn に関連しているデータ記述子を通してステップ (進める) するために使用されます。関数 elf_getdata() と対照的に、この関数は、変換されないデータを返します。引数 data が NULL であるなら、セクション scn に関連している最初のデータ記述子を返します。引数 data が NULL でないないら、セクション scn に関連しているデータ記述子でなければならなくて、関数 elf_rawdata() は、リスト中の次のデータ記述子を返すか、またはさらなる記述子が存在しないなら、NULL を返します。関数 elf_rawdata() は、常にタイプ ELF_T_BYTEElf_Data 構造を返します。

サイズ 0 と SHT_NOBITS セクションの特別な取り扱い

タイプ SHT_NOBITS のセクションのためと、サイズ 0 のセクションのための、関数 elf_getdata() と elf_rawdata() は、NULL に設定された d_buf メンバとセクションのサイズに設定された d_size メンバがある、有効な Elf_Data 構造体へのポインタを返します。

アプリケーションがタイプ SHT_NOBITS のセクションを作成したいなら、関数 elf_newdata() を使用してデータバッファをセクションに追加するべきです。返された Elf_Data 構造体の d_bufd_size メンバを NULL に、それぞれセクションの希望のサイズを設定するべきです。

戻り値

これらの関数は、成功するなら、データ記述子への有効なポインタを返し、エラーが生じたなら、NULL を返します。

エラー

これらの関数は、次のエラーで失敗します:
[ ELF_E_ARGUMENT]
引数 scn は、NULL でした。
[ ELF_E_ARGUMENT]
データ記述子 data は、セクション記述子 scn に関連づけられませんでした。
[ ELF_E_RESOURCE]
メモリ不足の状態が検出されました。
[ ELF_E_SECTION]
セクション scn には、タイプ SHT_NULL がありました。
[ ELF_E_SECTION]
セクション scn のタイプが、ライブラリによって認識されませんでした。
[ ELF_E_SECTION]
セクション scn のサイズが、そのセクションタイプのためのファイルサイズの倍数ではありません。
[ ELF_E_SECTION]
セクション scn のためにファイルオフセットが正しくありません。
February 18, 2013 FreeBSD