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

mapfile の構造と構文

mapfile のバージョン

条件付き入力

指令の構文

mapfile 指令

CAPABILITY 指令

HW 属性

HW_1/HW_2 属性

MACHINE 属性

PLATFORM 属性

SF 属性

SF_1 属性

DEPEND_VERSIONS 指令

ALLOW 属性

REQUIRE 属性

HDR_NOALLOC 指令

PHDR_ADD_NULL 指令

LOAD_SEGMENT/NOTE_SEGMENT/NULL_SEGMENT 指令

ALIGN 属性 (LOAD_SEGMENT のみ)

ASSIGN_SECTION 属性

DISABLE 属性

FLAGS 属性 (LOAD_SEGMENT のみ)

IS_ORDER 属性

MAX_SIZE 属性 (LOAD_SEGMENT のみ)

NOHDR 属性 (LOAD_SEGMENT のみ)

OS_ORDER 属性

PADDR 属性 (LOAD_SEGMENT のみ)

ROUND 属性 (LOAD_SEGMENT のみ)

SIZE_SYMBOL 属性 (LOAD_SEGMENT のみ)

VADDR (LOAD_SEGMENT のみ)

SEGMENT_ORDER 指令

STACK 指令

STUB_OBJECT 指令

SYMBOL_SCOPE/SYMBOL_VERSION 指令

ASSERT 属性

AUXILIARY 属性

FILTER 属性

FLAGS 属性

SIZE 属性

TYPE 属性

VALUE 属性

定義済みセグメント

マッピングの例

例: セクションからセグメントへの割り当て

例: 定義済みセクションの変更

リンカー内部情報: セクションおよびセグメント処理

セクションからセグメントへの割り当て

定義済みセグメントとエントランス基準のための mapfile 指令

11.  拡張性メカニズム

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

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

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

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

パート V 付録

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

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

索引

リンカー内部情報: セクションおよびセグメント処理

ここでは、セクションを出力セグメントに割り当てるためにリンカーによって使用される内部処理について説明します。この情報は、mapfile を使用するためには必要ありません。この情報は主に、リンカーの内部情報に関心を持ち、セグメントの mapfile 指令がリンカーによってどのように解釈されて実行されるかについて深く理解することが必要な読者を対象としています。

セクションからセグメントへの割り当て

入力セクションを出力セグメントに割り当てるプロセスには、次のデータ構造が関与します。

出力オブジェクトに書き込まれる各セクションについて、リンカーは次の手順を実行して、セクションを出力セグメントに配置します。

  1. セクションの属性は、内部エントランス基準リストの先頭から各レコードと比較され、各エントランス基準が順番に検証されます。エントランス基準内のすべての属性が完全に一致したときにエントランス基準と一致したことになります。そのエントランス基準に関連付けられたセグメントは無効化されません。検索は、一致した最初のエントランス基準で停止し、セクションは関連付けられたセグメントに指定されます。

    エントランス基準に一致するものが見つからない場合、セクションはその他すべてのセグメントの後の、出力ファイルの最後に置かれます。この情報に関するプログラムヘッダーエントリは作成されません。デバッグセクションなどの割り当て不能なセクションは、ほとんどがこの領域に配置されることになります。

  2. セクションがセグメントの中に入る際に、リンカーは次のようにそのセグメントの既存の一連の出力セクションを検査します。

    セクションの属性値が既存の出力セクションの属性値と完全に一致する場合、セクションはその出力セクションに対応するセクションの列挙の最後に置かれます。

    一致する出力セクションが見つからない場合、配置されるセクションの属性を使用して新しい出力セクションが作成され、新しい出力セクション内に入力セクションが配置されます。この新しい出力セクションは、セグメント内で同じセクションタイプを持つほかの出力セクションの後ろに配置されますが、ほかの出力セクションが存在しない場合はセグメントの末尾に配置されます。


    注 - 入力セクションが、SHT_LOUSERSHT_HIUSER の間にユーザー定義のセクションタイプ値を保持する場合、このセクションは PROGBITS セクションとして処理されます。mapfile でこのセクションタイプ値に名前を付ける方法はありませんが、これらのセクションは、エントランス基準でその他の属性値指定 (セクションフラグ、セクション名) を使って付け直すことができます。


定義済みセグメントとエントランス基準のための mapfile 指令

リンカーには、「定義済みセグメント」で説明されているように、定義済みの出力セグメント記述子とエントランス基準のセットが提供されています。リンカーはこれらのセクションについて認識しているため、mapfile 指令でこれらを作成する必要はありません。これらの作成に使用できる mapfile 指令は、説明のため、または比較的複雑な mapfile を指定する例として示されています。mapfile セグメント指令は、これらの組み込み定義を変更または拡張するために使用できます。

通常、セクションからセグメントへの割り当ては、単一のセグメント指令の内部で行われます。しかし、定義済みのセクションにはより複雑な要件があるため、セグメントがメモリーに展開されている順序と異なる順序でエントランス基準を処理する必要があります。これを実現するには 2 つの方法が使用されます。1 つ目は、すべてのセグメントを望ましい順序で定義する方法、2 つ目は、望ましい結果が得られる順序でエントランス基準を設定する方法です。ユーザーの mapfile でこの方法が必要になることはまれです。

        # Predefined segments and entrance criteria for the Oracle Solaris
        # link-editor
        $mapfile_version 2

        # The lrodata and ldata segments only apply to x86-64 objects.
        # Establish amd64 as a convenient token for conditional input
        $if _ELF64 && _x86
        $add amd64
        $endif

        # Pass 1: Define the segments and their attributes, but
        # defer the entrance criteria details to the 2nd pass.
        LOAD_SEGMENT text {
                FLAGS = READ EXECUTE;
        };
        LOAD_SEGMENT data {
                FLAGS = READ WRITE EXECUTE;
        };
        LOAD_SEGMENT bss {
                DISABLE;
                FLAGS=DATA;
        };
        $if amd64
                LOAD_SEGMENT lrodata {
                        FLAGS = READ
                };
                LOAD_SEGMENT ldata {
                        FLAGS = READ WRITE;
                };
        $endif
        NOTE_SEGMENT note;
        NULL_SEGMENT extra;

        # Pass 2: Define ASSIGN_SECTION attributes for the segments defined
           # above, in the order the link-editor should evaluate them.

        # All SHT_NOTE sections go to the note segment
        NOTE_SEGMENT note {
                ASSIGN_SECTION {
                        TYPE = NOTE;
                };
        };
        $if amd64
                # Medium/large model x86-64 readonly sections to lrodata
                LOAD_SEGMENT lrodata {
                        ASSIGN_SECTION {
                                FLAGS = ALLOC AMD64_LARGE;
                        };
                };
        $endif

        # text receives all readonly allocable sections
        LOAD_SEGMENT text {
                ASSIGN_SECTION {
                        FLAGS = ALLOC !WRITE;
                };
        };

        # If bss is enabled, it takes the writable NOBITS sections
        # that would otherwise end up in ldata or data.
        LOAD_SEGMENT bss {
                DISABLE;
                ASSIGN_SECTION {
                        FLAGS = ALLOC WRITE;
                        TYPE = NOBITS;
                };
        };

        $if amd64
                # Medium/large model x86-64 writable sections to ldata
                LOAD_SEGMENT ldata {
                        ASSIGN_SECTION {
                                FLAGS = ALLOC WRITE AMD64_LARGE;
                        };
                        ASSIGN_SECTION {
                                TYPE = NOBITS;
                                FLAGS = AMD64_LARGE
                        };
                };
        $endif

        # Any writable allocable sections not taken above go to data
        LOAD_SEGMENT data {
                ASSIGN_SECTION {
                        FLAGS = ALLOC WRITE;
                };
        };

        # Any section that makes it to this point ends up at the
        # end of the object file in the extra segment. This accounts
        # for the bulk of non-allocable sections.
        NULL_SEGMENT extra {
                ASSIGN_SECTION;
        };