リンカーとライブラリ

セクション

オブジェクトファイルのセクションヘッダーテーブルを使用すると、すべてのファイルのセクションを見つけ出すことができます。セクションヘッダーテーブルは、以下に示されているとおり、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

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


注 -

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


SHN_LORESERVE

この値は、予約されているインデックスの範囲の下限を指定します。

SHN_LOPROC - SHN_HIPROC

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

SHN_BEFORE, SHN_AFTER

これらの値は、SHF_ORDERED セクションフラグと共に先頭および末尾セクションに順序付けを行います (表 7-14 を参照)。

SHN_ABS

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

SHN_COMMON

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

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 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_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_SUNW_COMDAT

このセクションには、部分的に初期化されたシンボルを扱うデータが存在します。

SHT_SUNW_move

このセクションには、部分的に初期化されたシンボルを扱うデータが存在します。

SHT_SUNW_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 セクションヘッダーのテーブルエントリ : インデックス 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_ORDERED

0x40000000

SHF_EXCLUDE

0x80000000

SHF_MASKPROC

0xf0000000

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

SHF_WRITE

このセクションには、プロセス実行時に書き込み可能でなければならないデータが存在します。

SHF_ALLOC

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

SHF_EXECINSTR

このセクションには、実行可能なマシン命令が存在します。

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 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_SUNW_move

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

0

SHT_SUNW_COMDAT

0

0

SHT_SUNW_syminfo

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

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

SHT_SUNW_verdef

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

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

SHT_SUNW_verneed

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

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

SHT_SUNW_versym

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

0

other

SHN_UNDEF

0