Go to main content
Oracle® Solaris 11.3 リンカーとライブラリガイド

印刷ビューの終了

更新: 2015 年 10 月
 
 

定義済みセグメント

リンカーには、定義済みの出力セグメント記述子とエントランス基準のセットが提供されています。これらの定義は、ほとんどのリンクシナリオのニーズを満たし、システムによって期待される ELF レイアウト規則および規約に適合します。

text、data、および extra セグメントがもっとも重要で、その他のセグメントは次に説明する特殊な目的のために役立ちます。

  • text

    text セグメントは、割り当て可能な書き込み不可のセクションを受け入れる、読み取り専用の実行可能で読み込み可能なセグメントを定義します。これには、実行可能コード、プログラムで必要な読み取り専用データ、および実行時リンカーによって使用されるリンカーによって生成される読み取り専用データ (動的シンボルテーブルなど) が含まれます。

    text セグメントはプロセスの最初のセグメントであり、そのため、リンカーによって ELF ヘッダーおよびプログラムヘッダー配列が割り当てられます。この動作は HDR_NOALLOC mapfile 指令を使用すると回避できます。

  • data

    data セグメントは書き込み可能で読み込み可能なセグメントを定義します。data セグメントは、プログラムが必要とする書き込み可能データや、実行時リンカーが使用する書き込み可能データに使用します。たとえば、グローバルオフセットテーブル (GOT) や、SPARC などのアーキテクチャー上でプロシージャーのリンクテーブル (PLT) セクションを書き込み可能にする必要があるときに PLT に使用します。

  • extra

    extra セグメントは、どこにも割り当てられず、最後のエントランス基準レコードによってそこに指定されたすべてのセクションを取り込みます。一般的な例として、シンボルテーブル (.symtab ) や、デバッガ用に生成されるさまざまなセクションがあります。これはヌルセグメントで、対応するプログラムヘッダーテーブルエントリはありません。

  • note

    note セグメントは、SHT_NOTE タイプのすべてのセクションを取り込みます。リンカーは、note セグメントを参照するための PT_NOTE プログラムヘッダーエントリを提供します。

  • lrodata / ldata

    x86–64 ABI では、小規模、中規模、および大規模なコンパイルモデルを定義します。ABI では、中規模および大規模なモデルのセクションについて、SHF_AMD64_LARGE セクションフラグを設定する必要があります。SHF_AMD64_LARGE がない入力セクションは、2G バイトのサイズを超えない出力セグメント内に配置する必要があります。lrodata および ldata の定義済みセグメントは x86–64 出力オブジェクトについてのみ存在し、SHF_AMD64_LARGE フラグが設定されているセクションを処理するために使用されます。lrodata は読み取り専用セクションを受け取り、ldata はその他のセクションを受け取ります。

  • bss

    ELF では任意のセグメントに NOBITS セクションを含めることができます。リンカーはそれらのセクションを、セクションが割り当てられているセグメントの最後に配置します。これはプログラムヘッダーエントリ p_filesz および p_memsz フィールドを使用して実装され、次の規則に従う必要があります。

            p_memsz >= p_filesz

    p_memszp_filesz より大きい場合、余分なバイトは NOBITS になります。先頭の p_filesz バイトはオブジェクトファイルに由来し、p_memsz までの残りのバイトはすべて、使用前にシステムによってゼロ化されます。

    デフォルトの割り当て規則では、読み取り専用の NOBITS セクションを text セグメントに、書き込み可能な NOBITS セクションを data セグメントに割り当てます。リンカーは bss セグメントを、書き込み可能な NOBITS セクションを受け入れることができる代替セグメントとして定義します。このセグメントはデフォルトで無効化されており、使用するには明示的に有効化する必要があります。

    書き込み可能な NOBITS セクションは data セグメントの一部として容易に処理できるため、bss セグメントをべつに持つ利点はあまり明確ではありません。慣例的に、プロセス動的メモリーヒープは最終セグメントの末尾から開始し、書き込み可能である必要があります。これは通常はデータセグメントですが、bss が有効な場合は bss が最終セグメントになります。動的実行可能プログラムを構築するときに、適切な配置で bss セグメントを有効にすると、ヒープに大きなページを割り当てられるようになります。bss セグメントを有効にして 4M バイトの配置を設定する例を次に示します。

            LOAD_SEGMENT bss {
                    ALIGN=0x400000;
            };

    注 -  配置の指定はマシン固有であるため、ハードウェアプラットフォームの種類によっては同様の利点が得られない場合があります。将来のリリースでは、基本となる最適なページサイズをより柔軟に要求する方法が進展する可能性があります。