リンカーとライブラリ

セクション

オブジェクトファイルのセクションヘッダーテーブルを使用すると、ファイルのセクションすべてを見つけ出すことができます。セクションヘッダーテーブルは、以下に示されているとおり、Elf32_Shdr 構造体または Elf64_Shdr 構造体の配列です。セクションヘッダーテーブルインデックスは、この配列への添字です。ELF ヘッダーの e_shoff 構成要素は、ファイルの先頭からセクションヘッダーテーブルまでのバイトオフセットを与えます。 e_shnum は、セクションヘッダーテーブルに存在するエントリ数を与えます。 e_shentsize は、各エントリのサイズ (単位: バイト) を与えます。

セクションの数が SHN_LORESERVE (0xff00) 以上の場合、e_shnum の値は SHN_UNDEF (0) となり、セクションヘッダーテーブルエントリの実際の数はセクションヘッダーの sh_size フィールドのインデックス 0 の位置に入っています。そうでない場合、当初のエントリの sh_size 構成要素には 0 が入っています。

セクションヘッダーテーブルインデックスの中には、インデックスサイズが制限されている文脈で予約されているものがあります。たとえば、シンボルテーブルエントリの st_shndx 構成要素、 ELF ヘッダーの e_shnum 構成要素と e_shstrndx 構成要素などがそうです。このような文脈では、予約値はオブジェクトファイル内の実際のセクションを示しません。また、このような文脈では、エスケープ値は、実際のセクションインデックスがどこかもっと大きなフィールド内に存在することを示します。

表 7–11 ELF セクションの特殊インデックス

名前 

値 

SHN_UNDEF

0

SHN_LORESERVE

0xff00

SHN_LOPROC

0xff00

SHN_BEFORE

0xff00

SHN_AFTER

0xff01

SHN_HIPROC

0xff1f

SHN_LOOS

0xff20

SHN_HIOS

0xff3f

SHN_ABS

0xfff1

SHN_COMMON

0xfff2

SHN_XINDEX

0xffff

SHN_HIRESERVE

0xffff


注 –

インデックス 0 は未定義値として予約されますが、セクションヘッダーテーブルにはインデックス 0 のエントリが存在します。つまり、ELF ヘッダーの e_shnum 構成要素が、ファイルのセクションヘッダーテーブルに 6 つのエントリが存在することを示している場合、これら 6 つのエントリにはインデックス 0 から 5 までが与えられます。先頭のエントリの内容は、この項の末尾に記述します。


SHN_UNDEF

未定義の、失われた、関連のない、または無意味なセクション参照。たとえば、セクション番号 SHN_UNDEF に関して「定義された」シンボルは、未定義シンボルです。

SHN_LORESERVE

予約されているインデックスの範囲の下限。

SHN_LOPROC - SHN_HIPROC

この範囲の値は、プロセッサ固有の使用方法に予約されます。

SHN_LOOS - SHN_HIOS

この範囲の値 (両端の値を含む) は、オペレーティングシステム固有の意味のために予約されています。

SHN_BEFORE, SHN_AFTER

SHF_LINK_ORDER および SHF_ORDERED セクションフラグと共に先頭および末尾セクションに順序付けを行います (表 7–14 を参照)。

SHN_ABS

対応する参照の絶対値。 たとえば、セクション番号 SHN_ABS からの相対で定義されたシンボルは絶対値をとり、再配置の影響を受けません。

SHN_COMMON

このセクションに関して定義されたシンボルは、共通シンボルです。たとえば、FORTRAN COMMON や割り当てられていない C 外部変数です。これらのシンボルは、ときどき一時的シンボルと呼ばれることもあります。

SHN_XINDEX

実際のセクションヘッダーインデックスが大きすぎて保持するフィールド内に入りきらないことを示すエスケープ値。ヘッダーセクションインデックスは、このインデックスが出現する構造体に固有の別の場所に存在します。

SHN_HIRESERVE

予約されているインデックスの範囲の上限。システムは、SHN_LORESERVE から SHN_HIRESERVE までのインデックスを予約します。値は、セクションヘッダーテーブルを参照しません。セクションヘッダーテーブルには予約されているインデックスのエントリは存在しません。

セクションには、ELF ヘッダー、プログラムヘッダーテーブル、セクションヘッダーテーブルを除く、オブジェクトファイルのすべての情報が存在します。また、オブジェクトファイルのセクションは以下の条件を満たします。

セクションヘッダーの構造体 (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;

この構造体の要素を次に示します。

sh_name

セクション名。値はセクションヘッダーの文字列テーブルセクションへのインデックスで、ヌル文字で終わっている文字列を示します。セクション名とその説明は、表 7–16 を参照してください。

sh_type

セクションの内容と意味を分類します。セクションのタイプとその説明は、表 7–12 を参照してください。

sh_flags

セクションは、さまざまな属性を記述する 1 ビットフラグをサポートします。フラグの定義は、表 7–14 を参照してください。

sh_addr

セクションがプロセスのメモリーイメージに現れる場合、この構成要素はセクションの先頭バイトが存在しなければならないアドレスを与えます。セクションがプロセスのメモリーイメージに現れない場合、この構成要素には 0 が存在します。

sh_offset

ファイルの先頭からセクションの先頭バイトまでのバイトオフセット。SHT_NOBITS 型のセクションは、ファイルのスペースを占めません。sh_offset 構成要素は、ファイル内の概念上の位置を示します。

sh_size

セクションのサイズ (単位: バイト)。セクションのタイプが SHT_NOBITS でない限り、セクションはファイルの sh_size バイトを占めます。タイプが SHT_NOBITS のセクションは、0 以外のサイズをとることがありますが、ファイルのスペースは占めません。

sh_link

セクションヘッダーテーブルのインデックスリンク。このリンクの解釈は、セクションのタイプに依存します。値は、表 7–15 を参照してください。

sh_info

追加情報。情報の解釈は、セクションのタイプに依存します。値は、表 7–15 を参照してください。

sh_addralign

いくつかのセクションには、アドレス整列制約が存在します。たとえば、あるセクションが 2 語で構成されるデータを保持している場合、システムはそのセクション全体に対して 2 語単位の整列を保証しなければなりません。つまり、sh_addr の値は、sh_addralign の値を法として 0 でなければなりません。現在、0、および 2 の非負整数累乗のみが許可されています。値 0 と 1 は、セクションに整列制約が存在しないことを意味します。

sh_entsize

いくつかのセクションは、サイズが一定のエントリのテーブル (シンボルテーブルなど) を保持します。このようなセクションに対してこの構成要素は、各エントリのサイズ (単位: バイト) を与えます。サイズが一定のエントリのテーブルをセクションが保持しない場合、この構成要素には 0 が格納されます。

セクションヘッダーの sh_type 構成要素は、表 7–12 に示すようにこのセクションの意味を示します。

表 7–12 ELF セクションタイプ、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_INIT_ARRAY

14

SHT_FINI_ARRAY

15

SHT_PREINIT_ARRAY

16

SHT_GROUP

17

SHT_SYMTAB_SHNDX

18

SHT_LOOS

0x60000000

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_HIOS

0x6fffffff

SHT_LOPROC

0x70000000

SHT_HIPROC

0x7fffffff

SHT_LOUSER

0x80000000

SHT_HIUSER

0xffffffff

SHT_NULL

セクションヘッダーが使用されないことを示します。このセクションヘッダーには、関連付けられているセクションは存在しません。セクションヘッダーの他の構成要素の値は不定です。

SHT_PROGBITS

プログラムで定義された情報を示します。プログラムの形式と意味は、プログラムが独自に決定します。

SHT_SYMTAB, SHT_DYNSYM

文字列テーブルを示します。一般に、SHT_SYMTAB セクションはリンク編集に関するシンボルを示します。このセクションには完全なシンボルテーブルとして、動的リンクに不要な多くのシンボルが存在することがあります。また、オブジェクトファイルには SHT_DYNSYM セクション (動的リンクシンボルの最小セットを保持して領域を節約している) が存在することがあります。詳細は、シンボルテーブルセクションを参照してください。

SHT_STRTAB, SHT_DYNSTR

文字列テーブルを示します。オブジェクトファイルには、複数の文字列テーブルセクションを指定できます。詳細は、文字列テーブルセクションを参照してください。

SHT_RELA

明示的加数が存在する再配置エントリ (32 ビットクラスのオブジェクトファイルの Elf32_Rela タイプなど) を示します。オブジェクトファイルには、複数の再配置セクションを指定できます。詳細は、再配置セクションを参照してください。

SHT_HASH

シンボルハッシュテーブルを示します。動的にリンクされたオブジェクトファイルには、シンボルハッシュテーブルが存在しなければなりません。現在、オブジェクトファイルにはハッシュテーブルは 1 つしか存在できませんが、この制約は将来、緩和されるかもしれません。詳細は、ハッシュテーブルセクションを参照してください。

SHT_DYNAMIC

動的リンクに関する情報を示します。現在、オブジェクトファイルには動的セクションを 1 つだけ含めることができます。詳細は、動的セクションを参照してください。

SHT_NOTE

ファイルを示す情報を示します。詳細は、注釈セクションを参照してください。

SHT_NOBITS

このセクションは、ファイルの領域を占めないという点以外では SHT_PROGBITS に類似しています。このセクションにはデータは存在しませんが、sh_offset 構成要素には概念上のファイルオフセットが存在します。

SHT_REL

明示的加数が存在しない再配置エントリ (32 ビットクラスのオブジェクトファイルの Elf32_Rel 型など) を示します。オブジェクトファイルには、複数の再配置セクションを指定できます。詳細は、再配置セクションを参照してください。

SHT_SHLIB

未定義のセマンティクスを保持する、予約済みのセクション。この型のセクションが存在するプログラムは、ABI に準拠しません。

SHT_INIT_ARRAY

初期設定関数を指すポインタの配列が存在するセクションを示します。配列内の各ポインタは、void を戻り値とする、パラメータを持たないプロシージャと見なされます。詳細は、初期設定および終了セクションを参照してください。

SHT_FINI_ARRAY

終了関数を指すポインタの配列が存在するセクションを示します。配列内の各ポインタは、void を戻り値とする、パラメータを持たないプロシージャと見なされます。詳細は、初期設定および終了セクションを参照してください。

SHT_PREINIT_ARRAY

ほかのすべての初期設定関数の前に呼び出される関数を指すポインタの配列が存在するセクションを示します。配列内の各ポインタは、void を戻り値とする、パラメータを持たないプロシージャと見なされます。詳細は、初期設定および終了セクションを参照してください。

SHT_GROUP

セクショングループを示します。セクショングループとは、関連する一連のセクションであり、リンカーは 1 つの単位として扱う必要があります。タイプが SHT_GROUP であるセクションは、再配置可能オブジェクト内にしか存在できません。詳細は、グループセクションを参照してください。

SHT_SYMTAB_SHNDX

拡張されたセクションインデックスが入ったセクション (シンボルテーブルに関連付けられている) を示します。シンボルテーブルによって参照されているセクションヘッダーインデックスのどれかにエスケープ値 SHN_XINDEX が含まれる場合は、関連する SHT_SYMTAB_SHNDX が必要です。

SHT_SYMTAB_SHNDX セクションは、Elf32_Word 値の配列です。関連するシンボルテーブルエントリごとに 1 つの値が存在します。これらの値は、シンボルテーブルエントリが定義されているセクションヘッダーインデックスを示します。一致する Elf32_Word に実際のセクションヘッダーインデックスが含まれるのは、対応するシンボルテーブルエントリの st_shndx フィールドにエスケープ値 SHN_XINDEX が含まれる場合だけです。そうでない場合、エントリは必ず SHN_UNDEF (0) です。

SHT_LOOSSHT_HIOS

この範囲の値 (両端の値を含む) は、オペレーティングシステム固有の意味のために予約されています。

SHT_SUNW_move

部分的に初期化されたシンボルを処理するデータを指定します。詳細は、移動セクションを参照してください。

SHT_SUNW_COMDAT

同一データの複数のコピーを単一のコピーに削減することを可能にするセクション。詳細は、COMDAT セクションを参照してください。

SHT_SUNW_syminfo

追加のシンボル情報を指定します。詳細は、Syminfo テーブルセクションを参照してください。

SHT_SUNW_verdef

このファイルで定義された、きめの細かいバージョンを指定します。詳細は、バージョン定義セクションを参照してください。

SHT_SUNW_verneed

このファイルに必要な、きめの細かい依存関係を指定します。詳細は、バージョン依存セクションを参照してください。

SHT_SUNW_versym

シンボルとファイルに記述されたバージョン定義との関係を示すテーブルを指定します。詳細は、バージョンシンボルセクションを参照してください。

SHT_LOPROC - SHT_HIPROC

この範囲の値は、プロセッサ固有の使用方法に予約されます。

SHT_LOUSER

アプリケーションプログラムに対して予約されるインデックスの範囲の下限を示します。

SHT_HIUSER

アプリケーションプログラムに対して予約されるインデックスの範囲の上限を示します。SHT_LOUSER から SHT_HIUSER までのセクション型は、現在の、または将来のシステム定義セクション型と競合することなくアプリケーションで使用できます。

他のセクション型の値は、保留されています。先に述べたとおり、インデックス 0 (SHN_UNDEF) のセクションヘッダーは存在します (このインデックスが未定義セクション参照を示してもです)。その値は表 7–13 の通りです。

表 7–13 ELF セクションヘッダーのテーブルエントリ: インデックス 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 ELF セクションの属性フラグ

名前 

値 

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_TLS

0x400

SHF_MASKOS

0x0ff00000

SHF_ORDERED

0x40000000

SHF_EXCLUDE

0x80000000

SHF_MASKPROC

0xf0000000

sh_flags にフラグビットが設定されると、属性がセクションに対して「オン」になります。設定されない場合は、属性が「オフ」になるか、または適用されません。定義されていない属性は保留され、0 に設定されています。

SHF_WRITE

プロセス実行時に書き込み可能にする必要のあるセクションを示します。

SHF_ALLOC

プロセス実行時にメモリーを占有するセクションを示します。いくつかの制御セクションは、オブジェクトファイルのメモリーイメージに存在しません。この属性は、これらのセクションに対してオフです。

SHF_EXECINSTR

実行可能なマシン命令を含むセクションを示します。

SHF_MERGE

重複を避けるためにマージ可能なデータを含むセクションを示します。同時に SHF_STRINGS フラグが設定されていない限り、このセクション内のデータ要素は統一されたサイズになります。各要素のサイズは、セクションヘッダーの sh_entsize フィールドで指定されます。同時に SHF_STRINGS フラグも設定されている場合は、データ要素はヌル文字で終わる文字列で構成されています。各文字のサイズは、セクションヘッダーの sh_entsize フィールドで指定されます。

SHF_STRINGS

ヌル文字で終わる文字列で構成されるセクションを示します。各文字のサイズは、セクションヘッダーの sh_entsize フィールドで指定されます。

SHF_INFO_LINK

このセクションヘッダーの sh_info フィールドは、セクションヘッダーのテーブルインデックスを保持します。

SHF_LINK_ORDER

このセクションは、リンカーに特別な順序の要求を追加します。この要求は、このセクションのヘッダーの sh_link フィールドが別のセクション (リンク先のセクション) を参照する場合に適用されます。このセクションを出力ファイル内の他のセクションと結合する場合、結合対象セクションと同じ相対的な順序で現われます。同様に、リンクされるセクションは、それが結合されるセクションに現われます。

特殊な sh_link 値である SHN_BEFORE および SHN_AFTER (表 7–11 を参照) は、順序付けされるセット内の他のすべてのセクションに対して、ソートされたセクションがそれぞれ前に付くまたは後に付くことを示します。順序付けの対象となるセクションの複数にこれらの特殊値の 1 つが存在する場合、入力ファイルが指定された順序は保存されます。

このフラグを使用する場合の典型的なものとして、アドレスの順序でテキストまたはデータセクションを参照するテーブルを構築する場合があります。

sh_link 順序付け情報が存在しない場合、出力ファイルの 1 つのセクション内で結合される 1 つの入力ファイルからのセクションは連続的になり、入力ファイル内の相対順序付けと同じ相対順序付けになります。複数の入力ファイルからの場合は、リンクコマンドで指定された順序になります。

SHF_OS_NONCONFORMING

このセクションは、正しくない動作を避けるために、特別な OS 固有の処理 (標準のリンク処理規則の範囲を越えるもの) を必要とするものです。このセクションが、これらのフィールドに対して sh_type 値を持つか、OS 固有の範囲内にある sh_flags ビットを含み、かつリンカーがこれらの値を認識しない場合は、リンカーはこのセクションを含むオブジェクトファイルを拒否し、エラーを出します。

SHF_GROUP

このセクションは、1 つのセクショングループの (おそらく唯一の) 構成要素です。このセクションは、タイプ SHT_GROUP のセクションに参照されなければなりません。SHF_GROUP フラグは、再配置可能オブジェクト内に含まれるセクションに対してしか設定できません。詳細は、グループセクションを参照してください。

SHF_TLS

このセクションは、スレッド固有の領域を保持します。つまり、各個別の実行の流れは、このデータのインスタンスをそれぞれ別個に持つことを意味します。詳細は、スレッド固有領域セクションを参照してください。

SHF_MASKOS

このマスクに含まれるすべてのビットは、オペレーティングシステム特有の意味のために予約されています。

SHF_ORDERED

このセクションは、同じ型の他のセクションと順序付けられます。順序付けられるセクションは、sh_link エントリでポイントされるセクション内で結合されます。順序付けられるセクションの sh_link エントリは、自身を指し示すことがあります。

順序付けられるセクションの sh_info エントリが同一入力ファイル内の有効セクションの場合、順序付けられるセクションは、sh_info エントリでポイントされるセクションの出力ファイル内の相対順序付けに基づいて整列されます。

特殊なsh_info 値である SHN_BEFORE または SHN_AFTER (表 7–11 を参照) は、整列対象セクションが順序付け対象となる他のすべてのセクションの前または後に存在することを意味します。順序付けの対象となるセクションの複数にこれらの特殊値の 1 つが存在する場合、入力ファイルが指定された順序は保存されます。

sh_info 順序付け情報が存在しない場合、出力ファイルの 1 つのセクション内で結合される 1 つの入力ファイルからのセクションは連続的になり、入力ファイル内の相対順序付けと同じ相対順序付けになります。複数の入力ファイルからの場合は、リンクコマンドで指定された順序になります。

SHF_EXCLUDE

このセクションは、実行可能オブジェクトまたは共有オブジェクトのリンク編集への入力から除かれます。このフラグは、SHF_ALLOC フラグが設定されている場合、またはセクションに対する参照が存在する場合、無視されます。

SHF_MASKPROC

このマスクに存在するすべてのビットは、プロセッサ固有な使用方法に予約されます。

セクションヘッダーの 2 つの構成要素 sh_linksh_info は、セクション型に従って特殊な情報を保持します。

表 7–15 ELF sh_linksh_info の解釈

sh_type

sh_link

sh_info

SHT_DYNAMIC

関連付けられている文字列テーブルのセクションヘッダーインデックス 

0

SHT_HASH

関連付けられているシンボルテーブルのセクションヘッダーインデックス 

0

SHT_REL

SHT_RELA

関連付けられているシンボルテーブルのセクションヘッダーインデックス 

再配置が適用されるセクションのセクションヘッダーインデックス。表 7–16再配置セクションも参照

SHT_SYMTAB

SHT_DYNSYM

関連付けられている文字列テーブルのセクションヘッダーインデックス 

最後のローカルシンボルのシンボルテーブルインデックスより 1 大きい (STB_LOCAL に対応する)

SHT_GROUP

関連付けられているシンボルテーブルのセクションヘッダーインデックス 

関連付けられているシンボルテーブル内のエントリの、シンボルテーブルインデックス。指定されたシンボルテーブルエントリの名前は、そのセクショングループのシグニチャを提供する 

SHT_SYMTAB_SHNDX

関連付けられているシンボルテーブルのセクションヘッダーインデックス 

0

SHT_SUNW_move

関連付けられているシンボルテーブルのセクションヘッダーインデックス 

0

SHT_SUNW_COMDAT

0

0

SHT_SUNW_syminfo

関連付けられているシンボルテーブルのセクションヘッダーインデックス 

関連付けられている .dynamic セクションのセクションヘッダーインデックス

SHT_SUNW_verdef

関連付けられている文字列テーブルのセクションヘッダーインデックス 

セクション内のバージョン定義数 

SHT_SUNW_verneed

関連付けられている文字列テーブルのセクションヘッダーインデックス 

セクション内のバージョン依存数 

SHT_SUNW_versym

関連付けられているシンボルテーブルのセクションヘッダーインデックス 

0