Oracle® Solaris 11.2 リンカーとライブラリガイド

印刷ビューの終了

更新: 2014 年 7 月
 
 

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

この例では、セグメントを定義し、セグメントに入力セクションを割り当てる方法について説明します。

使用例 8-1  セクションからセグメントへの基本的な割り当て
        1    $mapfile_version 2
        2    LOAD_SEGMENT elephant {
        3            ASSIGN_SECTION {
        4                    IS_NAME=.data;
        5                    FILE_PATH=peanuts.o;
        6            };
        7            ASSIGN_SECTION {
        8                    IS_NAME=.data;
        9                    FILE_OBJNAME=popcorn.o;
        10           };
        11   };
        12
        13   LOAD_SEGMENT monkey {
        14           VADDR=0x80000000;
        15           MAX_SIZE=0x4000;
        16           ASSIGN_SECTION {
        17                   TYPE=progbits;
        18                   FLAGS=ALLOC EXECUTE;
        19           };
        20           ASSIGN_SECTION {
        21                   IS_NAME=.data
        22           };
        23   };
        24
        25   LOAD_SEGMENT donkey {
        26           FLAGS=READ EXECUTE;
        27           ALIGN=0x1000;
        28           ASSIGN_SECTION {
        29                   IS_NAME=.data;
        30           };
        31   };
        32
        33   LOAD_SEGMENT text {
        34           VADDR=0x80008000
        35   };

4 つの別々のセグメントがこの例では扱われています。1 行目に示すように、すべての mapfile$mapfile_version 宣言で始まります。elephant セグメント (2 行目から 11 行目) は、peanuts.o または popcorn.o ファイルからすべてのデータセクションを受け取ります。オブジェクト popcorn.o はアーカイブから取得でき、その場合、アーカイブファイルは任意の名前を持つことができます。あるいは、popcorn.o はベース名が popcorn.o の任意のファイルから取得できます。これに対して、peanuts.o は同一の名前のファイルからのみ取得できます。たとえば、/var/tmp/peanuts.o がリンク編集時に指定された場合、peanuts.o と一致しません。

monkey セグメント (13 行目から 23 行目) には、仮想アドレス 0x80000000 および最大長 0x4000 が指定されています。このセグメントは、PROGBITS および割り当て可能な実行可能プログラムの両方であるすべてのセクション、さらに elephant セグメントに含まれていない .data という名前のすべてのセクションを受け取ります。monkey セグメントに入る .data セクションは、PROGBITS でも割り当て可能な実行可能プログラムである必要もありません。これは、.data セクションは 16 行目でなく 20 行目のエントランス基準に一致するためです。このことは、ASSIGN_SECTION 属性内のサブ属性間には and 関係が存在し、単一セグメントの異なる ASSIGN_SECTION 属性間には or 関係が存在することを示しています。

donkey セグメント (25 行目から 31 行目) は、デフォルト以外のアクセス権フラグと配置を指定し、.data という名前のすべてのセクションを受け入れます。ただし、このセグメントにはどのセクションも割り当てられず、その結果、donkey セグメントは出力オブジェクトに含まれません。この理由は、リンカーは mapfile に現れる順序でエントランス基準を検証するためです。この mapfile では、elephant セグメントが一部の .data セクションを受け入れ、monkey セグメントが残りを受け取るため、donkey には何も残りません。

33 行目から 35 行目では、text セグメントの仮想アドレスを 0x80008000 に設定します。text セグメントは、定義済みセグメントで説明されているように、標準の定義済みセグメントの 1 つであるため、このステートメントは新しいセグメントを作成するのではなく、既存のセグメントを変更します。