JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
リンカーとライブラリ     Oracle Solaris 11 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

パート I リンカーおよび実行時リンカーの使用

1.  Oracle Solaris リンカーの紹介

2.  リンカー

3.  実行時リンカー

4.  共有オブジェクト

5.  インタフェースおよびバージョン管理

6.  動的ストリングトークンによる依存関係の確立

パート II クイックリファレンス

7.  リンカーのクイックリファレンス

8.  バージョン管理の手引き

パート III 詳細情報

9.  直接結合

10.  mapfile

11.  拡張性メカニズム

パート IV ELF アプリケーションバイナリインタフェース

12.  オブジェクトファイル形式

ファイル形式

データ表現

ELF ヘッダー

ELF 識別

データの符号化

セクション

セクションのマージ

特殊セクション

「COMDAT」セクション

グループセクション

機能セクション

ハッシュテーブルセクション

移動セクション

注釈セクション

再配置セクション

再配置計算

SPARC: 再配置

SPARC: 再配置型

64 ビット SPARC: 再配置型

x86: 再配置

32 ビット x86: 再配置型

x64: 再配置型

文字列テーブルセクション

シンボルテーブルセクション

シンボル値

シンボルテーブルのレイアウトと規則

シンボルソートセクション

レジスタシンボル

Syminfo テーブルセクション

バージョン管理セクション

バージョン定義セクション

バージョン依存セクション

バージョンシンボルセクション

13.  プログラムの読み込みと動的リンク

14.  スレッド固有領域 (TLS)

パート V 付録

A.  リンカーとライブラリのアップデートおよび新機能

B.  System V Release 4 (バージョン 1) Mapfile

索引

セクション

オブジェクトファイルのセクションヘッダーテーブルを使用すると、ファイルのセクションすべてを見つけ出すことができます。セクションヘッダーテーブルは、Elf32_Shdr 構造体または Elf64_Shdr 構造体の配列です。セクションヘッダーテーブルインデックスは、この配列への添字です。ELF ヘッダーの e_shoff メンバーは、ファイルの先頭からセクションヘッダーテーブルまでのバイトオフセットを示します。e_shnum メンバーは、セクションヘッダーテーブルに含まれるエントリ数を示します。e_shentsize メンバーは、各エントリのバイト単位の大きさを示します。

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

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

表 12-4 ELF セクションの特殊インデックス

名前
SHN_UNDEF
0
SHN_LORESERVE
0xff00
SHN_LOPROC
0xff00
SHN_BEFORE
0xff00
SHN_AFTER
0xff01
SHN_AMD64_LCOMMON
0xff02
SHN_HIPROC
0xff1f
SHN_LOOS
0xff20
SHN_LOSUNW
0xff3f
SHN_SUNW_IGNORE
0xff3f
SHN_HISUNW
0xff3f
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_LOSUNW - SHN_HISUNW

この両端を含む範囲の値は、Sun 固有のセマンティクスのために予約されています。

SHN_SUNW_IGNORE

このセクションインデックスは、再配置可能オブジェクト内の一時的なシンボル定義を提供します。dtrace(1M) の内部使用のため予約されています。

SHN_BEFORE, SHN_AFTER

SHF_LINK_ORDER および SHF_ORDERED セクションフラグとともに先頭および末尾のセクションの順序付けを行います。表 12-8 を参照してください。

SHN_AMD64_LCOMMON

x64 固有の共通ブロックラベル。このラベルは SHN_COMMON に似ていますが、大規模な共通ブロックの識別をサポートする点が異なります。

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

セクション名。このメンバー値はセクションヘッダーの文字列テーブルセクションへのインデックスで、ヌル文字で終わる文字列の位置を示します。セクション名とその説明は、表 12-10 を参照してください。

sh_type

セクションの内容とセマンティクスを分類します。セクションの種類とその説明は、表 12-5 を参照してください。

sh_flags

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

sh_addr

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

sh_offset

ファイルの先頭からセクションの先頭バイトまでのバイトオフセット。SHT_NOBITS 型のセクションの場合はファイル内のスペースを占めないため、このメンバーは、ファイル内の概念的なオフセットを示します。

sh_size

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

sh_link

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

sh_info

追加情報。情報の解釈は、セクションのタイプに依存します。値については、表 12-9 を参照してください。このセクションヘッダーの sh_flags フィールドに属性 SHF_INFO_LINK が含まれている場合、このメンバーはセクションヘッダーテーブルインデックスを表します。

sh_addralign

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

sh_entsize

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

セクションヘッダーの sh_type メンバーは、次の表に示すようにこのセクションのセマンティクスを示します。

表 12-5 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_LOSUNW
0x6fffffef
SHT_SUNW_capchain
0x6fffffef
SHT_SUNW_capinfo
0x6ffffff0
SHT_SUNW_symsort
0x6ffffff1
SHT_SUNW_tlssort
0x6ffffff2
SHT_SUNW_LDYNSYM
0x6ffffff3
SHT_SUNW_dof
0x6ffffff4
SHT_SUNW_cap
0x6ffffff5
SHT_SUNW_SIGNATURE
0x6ffffff6
SHT_SUNW_ANNOTATE
0x6ffffff7
SHT_SUNW_DEBUGSTR
0x6ffffff8
SHT_SUNW_DEBUG
0x6ffffff9
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_HISUNW
0x6fffffff
SHT_HIOS
0x6fffffff
SHT_LOPROC
0x70000000
SHT_SPARC_GOTDATA
0x70000000
SHT_AMD64_UNWIND
0x70000001
SHT_HIPROC
0x7fffffff
SHT_LOUSER
0x80000000
SHT_HIUSER
0xffffffff
SHT_NULL

セクションヘッダーが無効であることを示します。このセクションヘッダーには、関連付けられているセクションは存在しません。セクションヘッダーのほかのメンバーの値は不定です。

SHT_PROGBITS

プログラムによって定義された情報を示します。その形式や意味はすべて、プログラムによって決定されます。

SHT_SYMTABSHT_DYNSYMSHT_SUNW_LDYNSYM

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

SHT_DYNSYM は、SHT_SUNW_LDYNSYM セクションで拡張することもできます。この追加セクションは、局所関数シンボルを実行時環境に提供しますが、動的リンクには必要ありません。このセクションを追加することで、SHT_SYMTAB を割り当てることができないために、テーブルが使用できないまたはファイルから削除されたときでも、デバッガは実行時状況で正確なスタックトレースを行うことができます。また、このセクションは、dladdr(3C) が使用する追加シンボリック情報を実行時環境に提供します。

SHT_SUNW_LDYNSYM セクションと SHT_DYNSYM セクションの両方があるときは、リンカーはそれらのデータ領域を並べて配置します。SHT_SUNW_LDYNSYM セクションは SHT_DYNSYM セクションの前に配置されます。このように配置されることで、SHT_SYMTAB の追加シンボルを含めて、これらの 2 つのテーブルを大きな 1 つの連続したシンボルテーブルとして表示することができます。

詳細は、「シンボルテーブルセクション」を参照してください。

SHT_STRTABSHT_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_LOSUNWSHT_HISUNW

この両端を含む範囲の値は、Oracle Solaris OS 用のセマンティクスのために予約されています。

SHT_SUNW_capchain

機能ファミリメンバーを集めたインデックスの配列です。配列の最初の要素は連鎖バージョンメンバーです。この要素の後に来るのは、0 で終了する一連の機能シンボルインデックスです。インデックスの 0 で終了する各グループは機能ファミリを表します。各ファミリの最初の要素は機能の先頭のシンボルです。次の要素はファミリメンバーを指します。詳細については、「機能セクション」を参照してください。

SHT_SUNW_capinfo

シンボルテーブルエントリを機能要件に関連付けるインデックスの配列と、その先頭の機能シンボルです。シンボル機能を定義するオブジェクトには SHT_SUNW_cap セクションが含まれています。SHT_SUNW_cap セクションのヘッダー情報は、関連する SHT_SUNW_capinfo セクションを指します。SHT_SUNW_capinfo セクションのヘッダー情報は、関連するシンボルテーブルセクションを指します。詳細については、「機能セクション」を参照してください。

SHT_SUNW_symsort

並んで配置される SHT_SUNW_LDYNSYM セクションと SHT_DYNSYM セクションによって作成される動的なシンボルテーブルへのインデックスの配列。これらのインデックスは、SHT_SUNW_LDYNSYM セクションの開始位置からの相対値です。インデックスはメモリーアドレスを含み、上記のシンボルを参照します。インデックスは、アドレスの昇順にシンボルを参照するようにソートされます。

SHT_SUNW_tlssort

並んで配置される SHT_SUNW_LDYNSYM セクションと SHT_DYNSYM セクションによって作成される動的なシンボルテーブルへのインデックスの配列。これらのインデックスは、SHT_SUNW_LDYNSYM セクションの開始位置からの相対値です。インデックスは、スレッド固有領域シンボルを参照します。第 14 章スレッド固有領域 (TLS)を参照してください。インデックスは、オフセットの昇順にシンボルを参照するようにソートされます。

SHT_SUNW_LDYNSYM

非大域シンボル用の動的シンボルテーブル。すでに説明した「SHT_SYMTAB SHT_DYNSYMSHT_SUNW_LDYNSYM」を参照してください。

SHT_SUNW_dof

dtrace(1M) の内部使用のため予約されています。

SHT_SUNW_cap

機能要件を指定します。詳細については、「機能セクション」を参照してください。

SHT_SUNW_SIGNATURE

モジュール検証用の署名を示します。

SHT_SUNW_ANNOTATE

注釈セクションの処理は、デフォルトのセクション処理規則のすべてに従います。唯一の例外は、注釈セクションが割り当て不可能なメモリー内に存在する場合に発生します。セクションのヘッダーフラグ SHF_ALLOC が設定されていないと、 リンカーは、このセクションに対する未対応の再配置をすべて黙って無視します。

SHT_SUNW_DEBUGSTRSHT_SUNW_DEBUG

デバッグ情報を示します。このタイプのセクションは、リンカーの -z strip-class オプションを使用するか、あるいはリンク編集後に strip(1) を使用して、オブジェクトから取り除くことができます。

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_SPARC_GOTDATA

GOT からの相対アドレスを使って参照される、SPARC 固有のデータを示します。つまり、シンボル _GLOBAL_OFFSET_TABLE_ に割り当てられたアドレスに対する相対的なオフセットです。64 ビット SPARC の場合、このセクション内のデータは、リンク編集時に GOT アドレスの {+-} 2^32 バイト内の場所に結合されなければなりません。

SHT_AMD64_UNWIND

スタックを巻き戻すための巻き戻し (unwind) 関数テーブルエントリを含む、x64 固有のデータを示します。

SHT_LOUSER

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

SHT_HIUSER

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

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

表 12-6 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
エントリが存在しない

セクションまたはプログラムヘッダーの数が ELF ヘッダーデータサイズを超えた場合、セクションヘッダー 0 の構成要素を使って拡張 ELF ヘッダー属性が定義されます。その値は次の表のとおりです。

表 12-7 ELF 拡張セクションヘッダーテーブルエントリ: インデックス 0

名前
注意
sh_name
0
名前が存在しない
sh_type
SHT_NULL
使用されない
sh_flags
0
フラグが存在しない
sh_addr
0
アドレスが存在しない
sh_offset
0
ファイルオフセットが存在しない
sh_size
e_shnum
セクションヘッダーテーブルのエントリ数
sh_link
e_shstrndx
セクション名文字列テーブルに対応するエントリのセクション ヘッダーインデックス
sh_info
e_phnum
プログラムヘッダーテーブルのエントリ数
sh_addralign
0
整列が存在しない
sh_entsize
0
エントリが存在しない

セクションヘッダーの sh_flags メンバーは、セクションの属性を記述する 1 ビットフラグを保持します。

表 12-8 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_AMD64_LARGE
0x10000000
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 フィールドが別のセクション (リンク先のセクション) を参照する場合に適用されます。このセクションを出力ファイル内のほかのセクションと結合する場合、結合対象セクションと同じ相対的な順序で現われます。同様に、リンク先のセクションは、それが結合されるセクションに現われます。リンク先のセクションは順不同でなければならず、その結果 SHF_LINK_ORDER または SHF_ORDERED を指定することはできません。

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

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

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

SHF_OS_NONCONFORMING

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

SHF_GROUP

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

SHF_TLS

このセクションには、スレッド固有領域が格納されます。プロセス内の各スレッドは、このデータのインスタンスをそれぞれ別個に持ちます。詳細は、第 14 章スレッド固有領域 (TLS)を参照してください。

SHF_MASKOS

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

SHF_AMD64_LARGE

x64 用のデフォルトコンパイルモデルで使用できるのは、32 ビットのディスプレイスメントだけです。このディスプレイスメントでは、セクションのサイズ (最終的にはセグメントのサイズ) が 2G バイトに制限されます。この属性フラグは、2G バイトを超えるデータを格納できるセクションを識別します。このフラグを使えば、異なるコードモデルを使用するオブジェクトファイルのリンク処理を行えます。

SHF_AMD64_LARGE 属性フラグを含まない x64 オブジェクトファイルセクションは、小規模コードモデルを使用するオブジェクトから自由に参照できます。このフラグを含むセクションは、それよりも規模の大きいコードモデルを使用するオブジェクトからしか参照できません。たとえば、x64 中規模コードモデルのオブジェクトは、この属性フラグを含むセクション内のデータとこの属性フラグを含まないセクション内のデータを参照できます。ところが、x64 小規模コードモデルのオブジェクトは、このフラグを含まないセクション内のデータしか参照できません。

SHF_ORDERED

SHF_ORDEREDSHF_LINK_ORDER が提供する機能の古いバージョンであり、SHF_LINK_ORDER に置き換えられました。SHF_ORDERED は 2 つの異なる機能を提供します。1 つは、出力セクションを指定できる機能、もう 1 つは、リンカーから特別な順序付け要件を要求する機能です。

SHF_ORDERED セクションの sh_link フィールドはセクションのリンクリストを形成します。このリストは、自分自身を指す sh_link を持つ最終セクションで終了します。このリストにあるすべてのセクションは、リストの最終セクションの名前を使用して、出力セクションに割り当てられます。

順序付けられるセクションの sh_info エントリが同一入力ファイル内の有効セクションの場合、順序付けられるセクションは、sh_info エントリでポイントされるセクションの出力ファイル内の相対順序付けに基づいて整列されます。sh_info エントリによって指されたセクションは順不同でなければならず、その結果、SHF_LINK_ORDER または SHF_ORDERED を指定することができません。

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

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

SHF_EXCLUDE

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

SHF_MASKPROC

このマスクに含まれるビットはすべて、プロセッサ固有のセマンティクスのために予約されています。

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

表 12-9 ELF sh_linksh_info の解釈

sh_type
sh_link
sh_info
SHT_DYNAMIC
関連付けられている文字列テーブルのセクションヘッダーインデックス。
0
SHT_HASH
関連付けられているシンボルテーブルのセクションヘッダーインデックス。
0
SHT_REL

SHT_RELA

関連付けられているシンボルテーブルのセクションヘッダーインデックス。
sh_flags メンバーに SHF_INFO_LINK フラグが含まれている場合は再配置が適用されるセクションのセクションヘッダーインデックス、それ以外の場合は 0表 12-10「再配置セクション」も参照してください。
SHT_SYMTAB

SHT_DYNSYM

関連付けられている文字列テーブルのセクションヘッダーインデックス。
最後の局所シンボルのシンボルテーブルインデックス STB_LOCAL より 1 大きい。
SHT_GROUP
関連付けられているシンボルテーブルのセクションヘッダーインデックス。
関連付けられているシンボルテーブル内のエントリの、シンボルテーブルインデックス。指定されたシンボルテーブルエントリの名前は、そのセクショングループのシグニチャを提供します。
SHT_SYMTAB_SHNDX
関連付けられているシンボルテーブルのセクションヘッダーインデックス。
0
SHT_SUNW_cap
シンボル機能が存在する場合、関連する SHT_SUNW_capinfo テーブルのセクションヘッダーインデックス。そうでない場合は 0
機能が名前付きの文字列を参照する場合、関連する文字列テーブルのセクションヘッダーインデックス。そうでない場合は 0
SHT_SUNW_capinfo
関連付けられているシンボルテーブルのセクションヘッダーインデックス。
動的オブジェクトの場合、関連する SHT_SUNW_capchain テーブルのセクションヘッダーインデックス。そうでない場合は 0
SHT_SUNW_symsort
関連付けられているシンボルテーブルのセクションヘッダーインデックス。
0
SHT_SUNW_tlssort
関連付けられているシンボルテーブルのセクションヘッダーインデックス。
0
SHT_SUNW_LDYNSYM
関連付けられている文字列テーブルのセクションヘッダーインデックス。このインデックスは、SHT_DYNSYM セクションで使用される文字列テーブルと同じです。
最後の局所シンボルのシンボルテーブルインデックス STB_LOCAL より 1 大きい。SHT_SUNW_LDYNSYM には局所シンボルしか含まれないので、sh_info はテーブル内のシンボル数に等しくなります。
SHT_SUNW_move
関連付けられているシンボルテーブルのセクションヘッダーインデックス。
0
SHT_SUNW_COMDAT
0
0
SHT_SUNW_syminfo
関連付けられているシンボルテーブルのセクションヘッダーインデックス。
関連付けられている .dynamic セクションのセクションヘッダーインデックス。
SHT_SUNW_verdef
関連付けられている文字列テーブルのセクションヘッダーインデックス。
セクション内のバージョン定義数。
SHT_SUNW_verneed
関連付けられている文字列テーブルのセクションヘッダーインデックス。
セクション内のバージョン依存数。
SHT_SUNW_versym
関連付けられているシンボルテーブルのセクションヘッダーインデックス。
0