オブジェクトファイルのセクションヘッダーテーブルを使用すると、すべてのファイルのセクションを見つけ出すことができます。セクションヘッダーテーブルは、以下に示されているとおり、Elf32_Shdr 構造体または Elf64_Shdr 構造体の配列です。セクションヘッダーテーブルインデックスは、この配列への添字です。ELF ヘッダーの e_shoff 構成要素は、ファイルの先頭からセクションヘッダーテーブルまでのバイトオフセットを与えます。e_shnum は、セクションヘッダーテーブルに存在するエントリ数を与えます。e_shentsize は、各エントリのサイズ (単位: バイト) を与えます。
いくつかのセクションヘッダーテーブルインデックスは予約されます。オブジェクトファイルには、これらの特殊インデックスのセクションは存在しません。
表 7-11 セクションの特殊インデックス
名前 |
値 |
---|---|
SHN_UNDEF |
0 |
SHN_LORESERVE |
0xff00 |
SHN_LOPROC |
0xff00 |
SHN_BEFORE |
0xff00 |
SHN_AFTER |
0xff01 |
SHN_HIPROC |
0xff1f |
SHN_ABS |
0xfff1 |
SHN_COMMON |
0xfff2 |
SHN_HIRESERVE |
0xffff |
この値は、未定義の、失われた、関連のない、または無意味なセクション参照を示します。たとえば、セクション番号 SHN_UNDEF に関して「定義された」シンボルは、未定義シンボルです。
インデックス 0 は未定義値として予約されますが、セクションヘッダーテーブルにはインデックス 0 のエントリが存在します。つまり、ELF ヘッダーの e_shnum 構成要素が、ファイルのセクションヘッダーテーブルに 6 つのエントリが存在することを示している場合、これら 6 つのエントリにはインデックス 0 から 5 までが与えられます。先頭のエントリの内容は、この項の末尾に記述します。
この値は、予約されているインデックスの範囲の下限を指定します。
この範囲の値は、プロセッサ固有の使用方法に予約されます。
これらの値は、SHF_LINK_ORDER および SHF_ORDERED セクションフラグと共に先頭および末尾セクションに順序付けを行います (表 7-14 を参照)。
この値は、対応する参照の絶対値を示します。たとえば、セクション番号 SHN_ABS からの相対で定義されたシンボルは絶対値をとり、再配置の影響を受けません。
このセクションに関して定義されたシンボルは、共通シンボルです。たとえば、FORTRAN COMMON や割り当てられていない C 外部変数です。これらのシンボルは、ときどき一時的シンボルと呼ばれることもあります。
この値は、予約されているインデックスの範囲の上限を指定します。システムは、SHN_LORESERVE から SHN_HIRESERVE までのインデックスを予約します。値は、セクションヘッダーテーブルを参照しません。つまり、セクションヘッダーテーブルには予約されているインデックスのエントリは存在しません。
セクションには、ELF ヘッダー、プログラムヘッダーテーブル、セクションヘッダーテーブルを除く、オブジェクトファイルのすべての情報が存在します。また、オブジェクトファイルのセクションは以下の条件を満たします。
オブジェクトファイルの各セクションには、そのセクションを記述するセクションヘッダーが必ず 1 つ存在する。対応するセクションが存在しないセクションヘッダーが存在することもある
各セクションは、ファイル内で連続するバイトシーケンス (空の場合もある) を占める
ファイル内のセクション同士は重ならない。ファイル内のどのバイトも複数のセクションに属することはない
オブジェクトファイルには、使用されていない領域が存在することがある。さまざまなヘッダーとセクションは、オブジェクトファイルのすべてのバイトをカバーしないことがある。使用されていないデータの内容は不定
セクションヘッダーの構造体 (sys/elf.h で定義されている) は、次のとおりです。
typedef struct { Elf32_Word sh_name; Elf32_Word sh_type; Elf32_Word sh_flags; Elf32_Addr sh_addr; Elf32_Off sh_offset; Elf32_Word sh_size; Elf32_Word sh_link; Elf32_Word sh_info; Elf32_Word sh_addralign; Elf32_Word sh_entsize; } Elf32_Shdr; typedef struct { Elf64_Word sh_name; Elf64_Word sh_type; Elf64_Xword sh_flags; Elf64_Addr sh_addr; Elf64_Off sh_offset; Elf64_Xword sh_size; Elf64_Word sh_link; Elf64_Word sh_info; Elf64_Xword sh_addralign; Elf64_Xword sh_entsize; } Elf64_Shdr; |
この構成要素は、セクション名を指定します。値はセクションヘッダーの文字列テーブルセクション (「文字列テーブル」を参照) へのインデックスで、空文字で終わっている文字列を示します。セクション名とその説明は、表 7-17 を参照してください。
この構成要素は、セクションの内容と意味を分類します。セクションの種類とその説明は、表 7-12 を参照してください。
セクションは、さまざまな属性を記述する 1 ビットフラグをサポートします。フラグの定義は、表 7-14 を参照してください。
セクションがプロセスのメモリーイメージに現れる場合、この構成要素はセクションの先頭バイトが存在しなければならないアドレスを与えます。セクションがプロセスのメモリーイメージに現れない場合、この構成要素には 0 が存在します。
この構成要素は、ファイルの先頭からセクションの先頭バイトまでのバイトオフセットを与えます。以下に説明されている SHT_NOBITS 型のセクションは、ファイルのスペースを占めません。sh_offset 構成要素は、ファイル内の概念上の位置を示します。
この構成要素は、セクションのサイズ (単位: バイト) を与えます。セクションの型が SHT_NOBITS でない限り、セクションはファイルの sh_size バイトを占めます。タイプが SHT_NOBITS のセクションは、0 以外のサイズをとることがありますが、ファイルのスペースは占めません。
この構成要素は、セクションヘッダーテーブルインデックスリンクを保持します。このリンクの解釈は、セクションの型に依存します。値は、表 7-15 を参照してください。
この構成要素は、追加的な情報を保持します。追加的な情報の解釈は、セクションの型に依存します。値は、表 7-15 を参照してください。
いくつかのセクションには、アドレス整列制約が存在します。たとえば、あるセクションが 2 語で構成されるデータを保持している場合、システムはそのセクション全体に対して 2 語単位の整列を保証しなければなりません。つまり、sh_addr の値は、sh_addralign の値を法として 0 でなければなりません。現在、0、および 2 の非負整数累乗のみが許可されています。値 0 と 1 は、セクションに整列制約が存在しないことを意味します。
いくつかのセクションは、サイズが一定のエントリのテーブル (シンボルテーブルなど) を保持します。このようなセクションに対してこの構成要素は、各エントリのサイズ (単位: バイト) を与えます。サイズが一定のエントリのテーブルをセクションが保持しない場合、この構成要素には 0 が格納されます。
セクションヘッダーの sh_type 構成要素は、表 7-12 に示すようにこのセクションの意味を指定します。
表 7-12 sh_type が保持するセクションの型
名前 |
値 |
---|---|
SHT_NULL |
0 |
SHT_PROGBITS |
1 |
SHT_SYMTAB |
2 |
SHT_STRTAB |
3 |
SHT_RELA |
4 |
SHT_HASH |
5 |
SHT_DYNAMIC |
6 |
SHT_NOTE |
7 |
SHT_NOBITS |
8 |
SHT_REL |
9 |
SHT_SHLIB |
10 |
SHT_DYNSYM |
11 |
SHT_SUNW_move |
0x6ffffffa |
SHT_SUNW_COMDAT |
0x6ffffffb |
SHT_SUNW_syminfo |
0x6ffffffc |
SHT_SUNW_verdef |
0x6ffffffd |
SHT_SUNW_verneed |
0x6ffffffe |
SHT_SUNW_versym |
0x6fffffff |
SHT_LOPROC |
0x70000000 |
SHT_HIPROC |
0x7fffffff |
SHT_LOUSER |
0x80000000 |
SHT_HIUSER |
0xffffffff |
この値は、該当セクションヘッダーが使用されないものであることを示します。このセクションには、関連付けられているセクションは存在しません。セクションヘッダーの他の構成要素の値は不定です。
このセクションは、プログラムで定義された情報を保持します。プログラムの形式と意味は、プログラムが独自に決定します。
これらのセクションは、シンボルテーブルを保持します。一般に、SHT_SYMTAB セクションはリンク編集に関するシンボルを与えます。このセクションには完全なシンボルテーブルとして、動的リンクに不要な多くのシンボルが存在することがあります。また、オブジェクトファイルには SHT_DYNSYM セクション (動的リンクシンボルの最小セットを保持して領域を節約している) が存在することがあります。詳細は、「シンボルテーブル」を参照してください。
これらのセクションは、文字列テーブルを保持します。オブジェクトファイルには、複数の文字列テーブルセクションが存在できます。詳細は、「文字列テーブル」を参照してください。
このセクションは、明示的加数が存在する再配置エントリ (32 ビットクラスのオブジェクトファイルの Elf32_Rela タイプなど) を保持します。オブジェクトファイルには、複数の再配置セクションが存在できます。詳細は、「再配置」を参照してください。
このセクションは、シンボルハッシュテーブルを保持します。動的にリンクされたすべてのオブジェクトファイルには、シンボルハッシュテーブルが存在しなければなりません。現在、オブジェクトファイルにはハッシュテーブルは 1 つしか存在できませんが、この制約は将来、緩和されるかもしれません。詳細は、「ハッシュテーブル」を参照してください。
このセクションは、動的リンクに関する情報を保持します。現在、オブジェクトファイルには動的リンクのセクションは 1 つしか存在できませんが、この制約は将来、緩和されるかもしれません。詳細は、「動的セクション」を参照してください。
このセクションは、何らかの方法でファイルを示す情報を保持します。詳細は、「注釈セクション」を参照してください。
この型のセクションはファイルの領域を占めませんが、他の点では SHT_PROGBITS に類似しています。このセクションにはデータは存在しませんが、sh_offset 構成要素には概念上のファイルオフセットが存在します。
このセクションは、明示的加数が存在しない再配置エントリ (32 ビットクラスのオブジェクトファイルの Elf32_Rel 型など) を保持します。オブジェクトファイルには、複数の再配置セクションが存在できます。詳細は、「再配置」を参照してください。
このセクション型は予約されていますが、解釈の方法は定義されていません。この型のセクションが存在するプログラムは、ABI に準拠しません。
このセクションには、部分的に初期化されたシンボルを扱うデータが存在します。詳細は、「Comdat セクション」を参照してください。
このセクションには、部分的に初期化されたシンボルを扱うデータが存在します。詳細は、「移動セクション」を参照してください。
このセクションには、追加シンボル情報を保持するテーブルが存在します。詳細は、「移動セクション」を参照してください。
このセクションには、このファイルで定義されているきめの細かいバージョンの定義が存在します。詳細は、「バージョン定義セクション」を参照してください。
このセクションには、イメージの実行に必要なきめの細かい依存性の記述が存在します。詳細は、「バージョン依存セクション」を参照してください。
このセクションには、シンボルとバージョン定義 (ファイルが与える) の関係を記述するテーブルが存在します。詳細は、「バージョンシンボルセクション」を参照してください。
この範囲の値は、プロセッサ固有な使用方法用に予約されます。
この値は、アプリケーションプログラムに対して予約されるインデックスの範囲の下限を示します。
この値は、アプリケーションプログラムに対して予約されるインデックスの範囲の上限を示します。SHT_LOUSER から SHT_HIUSER までのセクション型は、現在の、または将来のシステム定義セクション型と競合することなくアプリケーションで使用できます。
他のセクション型の値は、保留されています。先に述べたとおり、インデックス 0 (SHN_UNDEF) のセクションヘッダーは存在します (このインデックスが未定義セクション参照を示してもです)。その値は表 7-13 の通りです。
表 7-13 セクションヘッダーのテーブルエントリ: インデックス 0
名前 |
値 |
注意 |
---|---|---|
sh_name |
0 |
名前が存在しない |
sh_type |
SHT_NULL |
使用されない |
sh_flags |
0 |
フラグが存在しない |
sh_addr |
0 |
アドレスが存在しない |
sh_offset |
0 |
ファイルオフセットが存在しない |
sh_size |
0 |
サイズが存在しない |
sh_link |
SHN_UNDEF |
リンク情報が存在しない |
sh_info |
0 |
補助情報が存在しない |
sh_addralign |
0 |
整列が存在しない |
sh_entsize |
0 |
エントリが存在しない |
セクションヘッダーの sh_flags 構成要素は、セクションの属性を記述する 1 ビットフラグを保持します。
表 7-14 セクションの属性のフラグ
名前 |
値 |
---|---|
SHF_WRITE |
0x1 |
SHF_ALLOC |
0x2 |
SHF_EXECINSTR |
0x4 |
SHF_MERGE |
0x10 |
SHF_STRINGS |
0x20 |
SHF_INFO_LINK |
0x40 |
SHF_LINK_ORDER |
0x80 |
SHF_OS_NONCONFORMING |
0x100 |
SHF_GROUP |
0x200 |
SHF_MASKOS |
0x0ff00000 |
SHF_ORDERED |
0x40000000 |
SHF_EXCLUDE |
0x80000000 |
SHF_MASKPROC |
0xf0000000 |
sh_flags にフラグビットが設定されると、属性がセクションに対して「オン」になります。設定されない場合は、属性が「オフ」になるか、または適用されません。定義されていない属性は保留され、0 に設定されています。
このセクションには、プロセス実行時に書き込み可能でなければならないデータが存在します。
このセクションは、プロセス実行時にメモリーを占めます。いくつかの制御セクションは、オブジェクトファイルのメモリーイメージに存在しません。この属性は、これらのセクションに対してオフです。
このセクションには、実行可能なマシン命令が存在します。
このセクション内のデータは、重複を避けるためにマージすることができます。同時に SHF_STRINGS フラグが設定されていない限り、このセクション内のデータ要素は統一されたサイズになります。各要素のサイズは、セクションヘッダーの sh_entsize フィールドで指定されます。同時に SHF_STRINGS フラグも設定されいる場合は、データ要素は NUILL で終わる文字列で構成されています。各文字のサイズは、セクションヘッダーの sh_entsize フィールドで指定されます。
このセクション内のデータ要素が、NUILL で終わる文字列で構成されています。各文字のサイズは、セクションヘッダーの sh_entsize フィールドで指定されます。
このセクションヘッダーの sh_info フィールドは、セクションヘッダーのテーブルインデックスを保持します。
このフラグは、リンカーに特別な順序の要求を追加します。この要求は、このセクションのヘッダーの sh_link フィールドが別のセクション (リンク先のセクション) を参照する場合に適用されます。このセクションが出力ファイル内の他のセクションと結合される場合には、これらのセクションに関しては、同じ相対的な順序で現われます。すなわち、リンクされるセクションは、それが結合されるセクションに現われます。
sh_info の特殊値である SHN_BEFORE および SHN_AFTER (表 7-11 を参照) は、順序付けされるセット内の他のすべてのセクションに対して、ソートされたセクションがそれぞれ前に付くまたは後に付くことを示します。入力ファイルのリンク行の順序は、1 つの順序付けセット内の複数のセクションがこれらの特殊値のいずれかを持つ場合のために、予約されています。
このフラグを使用する場合の典型的なものとして、アドレスの順序でテキストまたはデータセクションを参照するテーブルを構築する場合があります。
このセクションは、正しくない動作を避けるために、特別な OS 固有の処理 (標準のリンク処理規則の範囲を越えるもの) を必要とするものです。このセクションが、これらのフィールドに対して sh_type 値を持つか、OS 固有の範囲内にある sh_flags ビットを含み、かつリンカーがこれらの値を認識しない場合は、リンカーはこのセクションを含むオブジェクトファイルを拒否し、エラーを出します。
このセクションは、1 つのセクショングループの (おそらく唯一の) 構成要素です。このセクションは、タイプ SHT_GROUP のセクションに参照されなければなりません。SHF_GROUP フラグは、再配置可能オブジェクト (ET_REL に設定された ELF ヘッダーの e_type 構成要素を持つオブジェクト) に含まれたセクションに対してのみ設定することができます。詳細は、「セクショングループ」 を参照してください。
このマスクに含まれるすべてのビットは、オペレーティングシステム特有のセマンティクス (意味的用途) のために予約されています。
このセクションは、同じ型の他のセクションと順序付けられます。順序付けられるセクションは、sh_link エントリでポイントされるセクション内で結合されます。順序付けられるセクションの sh_link エントリは、自身を指し示すことがあります。
順序付けられるセクションの sh_info エントリが同一入力ファイル内の有効セクションの場合、順序付けられるセクションは、sh_info エントリでポイントされるセクションの出力ファイル内の相対順序付けに基づいて整列されます。
特殊な sh_info 値である SHN_BEFORE または SHN_AFTER (表 7-11 を参照) は、整列対象セクションが順序付け対象となる他のすべてのセクションの前または後に存在することを意味します。順序付けの対象となるセクションの複数にこれらの特殊値の 1 つが存在する場合、入力ファイルが指定された順序は保存されます。
sh_info 順序付け情報が存在しない場合、出力ファイルの 1 つのセクション内で結合される 1 つの入力ファイルからのセクションは連続的になり、入力ファイル内の相対順序付けと同じ相対順序付けになります。複数の入力ファイルからの場合は、リンクコマンドで指定された順序になります。
このセクションは、実行可能オブジェクトまたは共有オブジェクトのリンク編集への入力から除かれます。このフラグは、SHF_ALLOC フラグが設定されている場合、またはセクションに対する参照が存在する場合、無視されます。
このマスクに存在するすべてのビットは、プロセッサ固有な使用方法に予約されます。
セクションヘッダーの 2 つの構成要素 sh_link と sh_info は、セクション型に従って特殊な情報を保持します。
表 7-15 sh_link と sh_info の解釈
sh_type |
sh_link |
sh_info |
---|---|---|
SHT_DYNAMIC |
関連付けられている文字列テーブルのセクションヘッダーインデックス |
0 |
SHT_HASH |
関連付けられているシンボルテーブルのセクションヘッダーインデックス |
0 |
SHT_REL SHT_RELA |
関連付けられているシンボルテーブルのセクションヘッダーインデックス |
再配置が適用されるセクションのセクションヘッダーインデックス。表 7-17 も参照 |
SHT_SYMTAB SHT_DYNSYM |
関連付けられている文字列テーブルのセクションヘッダーインデックス |
最後のローカルシンボルのシンボルテーブルインデックスより 1 大きい (STB_LOCAL に対応する) |
SHT_GROUP |
関連付けられているシンボルテーブルのセクションヘッダーインデックス |
関連付けられているシンボルテーブル内のエントリの、シンボルテーブルインデックス。指定されたシンボルテーブルエントリの名前は、そのセクショングループのシグニチャを提供する |
SHT_SUNW_move |
関連付けられているシンボルテーブルのセクションヘッダーインデックス |
0 |
SHT_SUNW_COMDAT |
0 |
0 |
SHT_SUNW_syminfo |
関連付けられているシンボルテーブルのセクションヘッダーインデックス |
関連付けられている .dynamic セクションのセクションヘッダーインデックス |
SHT_SUNW_verdef |
関連付けられている文字列テーブルのセクションヘッダーインデックス |
セクション内のバージョン定義数 |
SHT_SUNW_verneed |
関連付けられている文字列テーブルのセクションヘッダーインデックス |
セクション内のバージョン依存数 |
SHT_SUNW_versym |
関連付けられているシンボルテーブルのセクションヘッダーインデックス |
0 |