ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
リンカーとライブラリ Oracle Solaris 11 Information Library (日本語) |
オブジェクトファイルのセクションヘッダーテーブルを使用すると、ファイルのセクションすべてを見つけ出すことができます。セクションヘッダーテーブルは、Elf32_Shdr 構造体または Elf64_Shdr 構造体の配列です。セクションヘッダーテーブルインデックスは、この配列への添字です。ELF ヘッダーの e_shoff メンバーは、ファイルの先頭からセクションヘッダーテーブルまでのバイトオフセットを示します。e_shnum メンバーは、セクションヘッダーテーブルに含まれるエントリ数を示します。e_shentsize メンバーは、各エントリのバイト単位の大きさを示します。
セクション数が SHN_LORESERVE (0xff00) 以上の場合、e_shnum の値は SHN_UNDEF (0) になります。セクションヘッダーテーブルエントリの実際の数は、インデックス 0 の sh_size フィールドに含まれます。そうでない場合、初期エントリの sh_size メンバーには値 0 が入っています。
セクションヘッダーテーブルインデックスの中には、インデックスサイズが制限されている文脈で予約されているものがあります。たとえば、シンボルテーブルエントリの st_shndx メンバー、 ELF ヘッダーの e_shnum メンバーと e_shstrndx メンバーなどがそうです。このような文脈では、予約値はオブジェクトファイル内の実際のセクションを示しません。また、このような文脈では、エスケープ値は、実際のセクションインデックスがどこかもっと大きなフィールド内に存在することを示します。
表 12-4 ELF セクションの特殊インデックス
|
注 - インデックス 0 は未定義値として予約されますが、セクションヘッダーテーブルにはインデックス 0 のエントリが存在します。つまり、ELF ヘッダーの e_shnum メンバーが、ファイルのセクションヘッダーテーブルに 6 つのエントリが存在することを示している場合、これら 6 つのエントリにはインデックス 0 から 5 までが与えられます。先頭のエントリの内容は、この項の末尾に記述します。
未定義、存在しない、無関係など、無意味なセクション参照。たとえば、セクション番号 SHN_UNDEF に関して「定義された」シンボルは、未定義シンボルです。
このセクションインデックスは、再配置可能オブジェクト内の一時的なシンボル定義を提供します。dtrace(1M) の内部使用のため予約されています。
SHF_LINK_ORDER および SHF_ORDERED セクションフラグとともに先頭および末尾のセクションの順序付けを行います。表 12-8 を参照してください。
x64 固有の共通ブロックラベル。このラベルは SHN_COMMON に似ていますが、大規模な共通ブロックの識別をサポートする点が異なります。
対応する参照の絶対値。たとえば、セクション番号 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;
セクション名。このメンバー値はセクションヘッダーの文字列テーブルセクションへのインデックスで、ヌル文字で終わる文字列の位置を示します。セクション名とその説明は、表 12-10 を参照してください。
セクションの内容とセマンティクスを分類します。セクションの種類とその説明は、表 12-5 を参照してください。
セクションは、さまざまな属性を記述する 1 ビットフラグをサポートします。フラグの定義は、表 12-8 を参照してください。
セクションがプロセスのメモリーイメージに現れる場合、このメンバーはセクションの先頭バイトが存在しなければならないアドレスを与えます。セクションがプロセスのメモリーイメージに現れない場合、このメンバーには 0 が存在します。
ファイルの先頭からセクションの先頭バイトまでのバイトオフセット。SHT_NOBITS 型のセクションの場合はファイル内のスペースを占めないため、このメンバーは、ファイル内の概念的なオフセットを示します。
セクションのサイズ (バイト)。セクションのタイプが SHT_NOBITS でないかぎり、セクションはファイルの sh_size バイトを占めます。タイプが SHT_NOBITS のセクションは、0 以外のサイズをとることがありますが、ファイルのスペースは占めません。
セクションヘッダーテーブルのインデックスリンク。このリンクの解釈は、セクションのタイプに依存します。値については、表 12-9 を参照してください。
追加情報。情報の解釈は、セクションのタイプに依存します。値については、表 12-9 を参照してください。このセクションヘッダーの sh_flags フィールドに属性 SHF_INFO_LINK が含まれている場合、このメンバーはセクションヘッダーテーブルインデックスを表します。
いくつかのセクションには、アドレス整列制約が存在します。たとえば、あるセクションが 2 語で構成されるデータを保持している場合、システムはそのセクション全体に対して 2 語単位の整列を保証しなければなりません。この場合、sh_addr の値は、sh_addralign の値を法として 0 でなければなりません。現在、0、および 2 の非負整数累乗のみが許可されています。値 0 と 1 は、セクションに整列制約が存在しないことを意味します。
いくつかのセクションは、サイズが一定のエントリのテーブル (シンボルテーブルなど) を保持します。このようなセクションに対してこのメンバーは、各エントリのサイズ (単位: バイト) を与えます。サイズが一定のエントリのテーブルをセクションが保持しない場合、このメンバーには 0 が格納されます。
セクションヘッダーの sh_type メンバーは、次の表に示すようにこのセクションのセマンティクスを示します。
表 12-5 ELF セクションタイプ、sh_type
|
セクションヘッダーが無効であることを示します。このセクションヘッダーには、関連付けられているセクションは存在しません。セクションヘッダーのほかのメンバーの値は不定です。
シンボルテーブルを示します。一般に、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 つの連続したシンボルテーブルとして表示することができます。
詳細は、「シンボルテーブルセクション」を参照してください。
文字列テーブルを示します。オブジェクトファイルには、複数の文字列テーブルセクションを指定できます。詳細は、「文字列テーブルセクション」を参照してください。
32 ビットクラスのオブジェクトファイル用のタイプ Elf32_Rela など、明示的加数を含む再配置エントリを示します。オブジェクトファイルには、複数の再配置セクションを指定できます。詳細は、「再配置セクション」を参照し てください。
シンボルハッシュテーブルを示します。動的にリンクされたオブジェクトファイルには、シンボルハッシュテーブルが存在しなければなりません。現在、オブジェクトファイルにはハッシュテーブルは 1 つしか存在できませんが、この制約は将来、緩和されるかもしれません。詳細は、「ハッシュテーブルセクション」を参照してください。
動的リンク処理用の情報を示します。現在、オブジェクトファイルには動的セクションを 1 つだけ含めることができます。詳細は、「動的セクション」を参照してください。
ファイルに何らかの方法で付加すべき情報を示します。詳細は、「注釈セクション」を参照してください。
ファイル内の領域を占有しないセクションを示します。このセクションは、その他の点では SHT_PROGBITS に似ています。このセクションにはデータは存在しませんが、sh_offset メンバーには概念上のファイルオフセットが存在します。
32 ビットクラスのオブジェクトファイル用のタイプ Elf32_Rel など、明示的加数を含まない再配置エントリを示します。オブジェクトファイルには、複数の再配置セクションを指定できます。詳細は、「再配置セクション」を参照し てください。
セマンティクスが定義されていない予約済みセクションを示します。この型のセクションが存在するプログラムは、ABI に準拠しません。
初期設定関数へのポインタの配列を含むセクションを示します。配列内の各ポインタは、void を戻り値とする、パラメータを持たないプロシージャーと見なされます。詳細は、「初期設定および終了セクション」を参照してください。
終了関数へのポインタの配列を含むセクションを示します。配列内の各ポインタは、void を戻り値とする、パラメータを持たないプロシージャーと見なされます。詳細は、「初期設定および終了セクション」を参照してください。
ほかのすべての初期設定関数の前に呼び出される関数へのポインタの配列を含むセクションを示します。配列内の各ポインタは、void を戻り値とする、パラメータを持たないプロシージャーと見なされます。詳細は、「初期設定および終了セクション」を参照してください。
セクショングループを示します。セクショングループとは、関連する一連のセクションであり、リンカーは 1 つの単位として扱う必要があります。タイプが SHT_GROUP であるセクションは、再配置可能オブジェクト内にしか存在できません。詳細は、「グループセクション」を参照してください。
拡張されたセクションインデックスが入ったセクション (シンボルテーブルに関連 付けられている) を示します。シンボルテーブルによって参照されているセクションヘッダーインデックスのいずれかにエスケープ値 SHN_XINDEX が含まれる場合は、関連する SHT_SYMTAB_SHNDX が必要です。
SHT_SYMTAB_SHNDX セクションは、Elf32_Word 値の配列です。この配列には、関連するシンボルテーブルエントリごとに 1 つのエントリが存在します。これらの値は、シンボルテーブルエントリが定義されているセクションヘッダーインデックスを示します。一致する Elf32_Word に実際のセクションヘッダーインデックスが含まれるのは、対応するシンボルテーブルエントリの st_shndx フィールドにエスケープ値 SHN_XINDEX が含まれる場合だけです。そうでない場合、エントリは必ず SHN_UNDEF (0) です。
機能ファミリメンバーを集めたインデックスの配列です。配列の最初の要素は連鎖バージョンメンバーです。この要素の後に来るのは、0 で終了する一連の機能シンボルインデックスです。インデックスの 0 で終了する各グループは機能ファミリを表します。各ファミリの最初の要素は機能の先頭のシンボルです。次の要素はファミリメンバーを指します。詳細については、「機能セクション」を参照してください。
シンボルテーブルエントリを機能要件に関連付けるインデックスの配列と、その先頭の機能シンボルです。シンボル機能を定義するオブジェクトには SHT_SUNW_cap セクションが含まれています。SHT_SUNW_cap セクションのヘッダー情報は、関連する SHT_SUNW_capinfo セクションを指します。SHT_SUNW_capinfo セクションのヘッダー情報は、関連するシンボルテーブルセクションを指します。詳細については、「機能セクション」を参照してください。
並んで配置される SHT_SUNW_LDYNSYM セクションと SHT_DYNSYM セクションによって作成される動的なシンボルテーブルへのインデックスの配列。これらのインデックスは、SHT_SUNW_LDYNSYM セクションの開始位置からの相対値です。インデックスはメモリーアドレスを含み、上記のシンボルを参照します。インデックスは、アドレスの昇順にシンボルを参照するようにソートされます。
並んで配置される SHT_SUNW_LDYNSYM セクションと SHT_DYNSYM セクションによって作成される動的なシンボルテーブルへのインデックスの配列。これらのインデックスは、SHT_SUNW_LDYNSYM セクションの開始位置からの相対値です。インデックスは、スレッド固有領域シンボルを参照します。第 14 章スレッド固有領域 (TLS)を参照してください。インデックスは、オフセットの昇順にシンボルを参照するようにソートされます。
非大域シンボル用の動的シンボルテーブル。すでに説明した「SHT_SYMTAB 、SHT_DYNSYM、SHT_SUNW_LDYNSYM」を参照してください。
dtrace(1M) の内部使用のため予約されています。
機能要件を指定します。詳細については、「機能セクション」を参照してください。
注釈セクションの処理は、デフォルトのセクション処理規則のすべてに従います。唯一の例外は、注釈セクションが割り当て不可能なメモリー内に存在する場合に発生します。セクションのヘッダーフラグ SHF_ALLOC が設定されていないと、 リンカーは、このセクションに対する未対応の再配置をすべて黙って無視します。
デバッグ情報を示します。このタイプのセクションは、リンカーの -z strip-class オプションを使用するか、あるいはリンク編集後に strip(1) を使用して、オブジェクトから取り除くことができます。
部分的に初期設定されたシンボルを処理するためのデータを示します。詳細は、「移動セクション」を参照してください。
同一データの複数のコピーを単一のコピーに低減することを可能にするセクションを示します。詳細は、「「COMDAT」セクション」を参照してください。
追加のシンボル情報を示します。詳細は、「Syminfo テーブルセクション」を参照してください。
このファイルで定義された細粒度のバージョンを示します。詳細は、「バージョン定義セクション」を参照してください。
このファイルが必要とする細粒度の依存関係を示します。詳細は、「バージョン依存セクション」を参照してください。
シンボルと、ファイルが提供するバージョン定義との関係を記述したテーブルを示します。詳細は、「バージョンシンボルセクション」を参照してください。
GOT からの相対アドレスを使って参照される、SPARC 固有のデータを示します。つまり、シンボル _GLOBAL_OFFSET_TABLE_ に割り当てられたアドレスに対する相対的なオフセットです。64 ビット SPARC の場合、このセクション内のデータは、リンク編集時に GOT アドレスの {+-} 2^32 バイト内の場所に結合されなければなりません。
アプリケーションプログラム用として予約されているインデックスの範囲の上限を指定します。SHT_LOUSER から SHT_HIUSER までのセクション型は、現在の、または将来のシステム定義セクション型と競合することなくアプリケーションで使用できます。
ほかのセクション型の値は、保留されています。先に述べたとおり、そのインデックスが未定義セクション参照を示している場合でも、インデックス 0 (SHN_UNDEF) のセクションヘッダーは存在します。その値は次の表のとおりです。
表 12-6 ELF セクションヘッダーテーブルエントリ: インデックス 0
|
セクションまたはプログラムヘッダーの数が ELF ヘッダーデータサイズを超えた場合、セクションヘッダー 0 の構成要素を使って拡張 ELF ヘッダー属性が定義されます。その値は次の表のとおりです。
表 12-7 ELF 拡張セクションヘッダーテーブルエントリ: インデックス 0
|
セクションヘッダーの sh_flags メンバーは、セクションの属性を記述する 1 ビットフラグを保持します。
表 12-8 ELF セクションの属性フラグ
|
sh_flags にフラグビットが設定されると、属性がセクションに対して「オン」になります。設定されない場合は、属性が「オフ」になるか、または適用されません。定義されていない属性は保留され、0 に設定されています。
プロセス実行中にメモリーを占有するセクションを示します。いくつかの制御セクションは、オブジェクトファイルのメモリーイメージに存在しません。この属性は、これらのセクションに対してオフです。
マージして重複をなくすことの可能なデータを含むセクションを示します。同時に SHF_STRINGS フラグが設定されていないかぎり、このセクション内のデータ要素は統一されたサイズになります。各要素のサイズは、セクションヘッダーの sh_entsize フィールドで指定されます。同時に SHF_STRINGS フラグも設定されている場合は、データ要素はヌル文字で終わる文字列で構成されています。各文字のサイズは、セクションヘッダーの sh_entsize フィールドで指定されます。
ヌル文字で終わっている文字列で構成されるセクションを示します。各文字のサイズは、セクションヘッダーの sh_entsize フィールドで指定されます。
このセクションは、リンカーに特別な順序の要求を追加します。この要求は、このセクションのヘッダーの sh_link フィールドが別のセクション (リンク先のセクション) を参照する場合に適用されます。このセクションを出力ファイル内のほかのセクションと結合する場合、結合対象セクションと同じ相対的な順序で現われます。同様に、リンク先のセクションは、それが結合されるセクションに現われます。リンク先のセクションは順不同でなければならず、その結果 SHF_LINK_ORDER または SHF_ORDERED を指定することはできません。
特殊な sh_link 値である SHN_BEFORE および SHN_AFTER (表 12-4 を参照) は、順序付けされるセット内のほかのすべてのセクションに対して、ソートされたセクションがそれぞれ前に付くまたは後に付くことを示します。順序付けの対象となるセクションの複数にこれらの特殊値の 1 つが存在する場合、入力ファイルが指定された順序は保存されます。
このフラグを使用する場合の典型的なものとして、アドレスの順序でテキストまたはデータセクションを参照するテーブルを構築する場合があります。
sh_link 順序付け情報が存在しない場合、出力ファイルの 1 つのセクション内にまとめられた単一入力ファイルからのセクションは、連続的になります。これらのセクションの相対順序付けは、入力ファイル内のセクションの相対順序付けと同じになります。複数の入力ファイルからの場合は、リンクコマンドで指定された順序になります。
このセクションは、不適切な動作を避けるために、標準のリンク処理規則に含まれない OS 固有の特殊処理を必要とします。このセクションが、これらのフィールドに対して sh_type 値を持つか、OS 固有の範囲内にある sh_flags ビットを含み、かつリンカーがこれらの値を認識しない場合は、このセクションを含むオブジェクトファイルは拒否され、エラーが出力されます。
このセクションは、セクショングループのメンバー (おそらく唯一のメンバー) です。このセクションは、タイプ SHT_GROUP のセクションに参照されなければなりません。SHF_GROUP フラグは、再配置可能オブジェクト内に含まれるセクションに対してしか設定できません。詳細は、「グループセクション」を参照してください。
このセクションには、スレッド固有領域が格納されます。プロセス内の各スレッドは、このデータのインスタンスをそれぞれ別個に持ちます。詳細は、第 14 章スレッド固有領域 (TLS)を参照してください。
x64 用のデフォルトコンパイルモデルで使用できるのは、32 ビットのディスプレイスメントだけです。このディスプレイスメントでは、セクションのサイズ (最終的にはセグメントのサイズ) が 2G バイトに制限されます。この属性フラグは、2G バイトを超えるデータを格納できるセクションを識別します。このフラグを使えば、異なるコードモデルを使用するオブジェクトファイルのリンク処理を行えます。
SHF_AMD64_LARGE 属性フラグを含まない x64 オブジェクトファイルセクションは、小規模コードモデルを使用するオブジェクトから自由に参照できます。このフラグを含むセクションは、それよりも規模の大きいコードモデルを使用するオブジェクトからしか参照できません。たとえば、x64 中規模コードモデルのオブジェクトは、この属性フラグを含むセクション内のデータとこの属性フラグを含まないセクション内のデータを参照できます。ところが、x64 小規模コードモデルのオブジェクトは、このフラグを含まないセクション内のデータしか参照できません。
SHF_ORDERED は SHF_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_ALLOC フラグが設定されている場合、またはセクションに対する参照が存在する場合、無視されます。
セクションヘッダーの 2 つのメンバー sh_link と sh_info は、セクション型に従って特殊な情報を保持します。
表 12-9 ELF sh_link と sh_info の解釈
|