リンカーとライブラリ

移動セクション

非常に大きい配列の要素が初期化されると、その配列全体のデータがオブジェクトファイルに書き込まれます。再配置可能オブジェクトファイルまたは実行可能ファイルのサイズは、非常に大きくなることがあります。SHT_SUNW_move セクションは、このようなファイルを圧縮するために導入されています。

コンパイラまたはリンカーで作成されるオブジェクトには、部分的に初期化されたシンボルに対して移動セクションが存在することがあります。このセクションは、SHT_SUNW_move 型で定義されます。このセクションには、ELF32_Move/Elf64_Move 型の複数のエントリが存在します。これらのエントリは以下のように定義されます。


typedef struct {
        Elf32_Lword		 m_value;
        Elf32_Word      m_info;
        Elf32_Word      m_poffset;
        Elf32_Half      m_repeat;
        Elf32_Half      m_stride;
} Elf32_Move;

#define ELF32_M_SYM(info)       ((info)>>8)
#define ELF32_M_SIZE(info)      ((unsigned char)(info))
#define ELF32_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size))

typedef struct {
        Elf64_Lword     m_value;
        Elf64_Xword     m_info;
        Elf64_Xword     m_poffset;
        Elf64_Half      m_repeat;
        Elf64_Half      m_stride;
} Elf64_Move;

#define ELF64_M_SYM(info)       ((info)>>8)
#define ELF64_M_SIZE(info)      ((unsigned char)(info))
#define ELF64_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size))

m_poffset

これは、シンボルからの相対オフセットです。

m_info

この構成要素は、移動を行わなければならないシンボルテーブルインデックスと、移動されるオブジェクトの大きさ (単位: バイト) を与えます。構成要素の下位 8 ビットは大きさを保持し、上位バイトはシンボルインデックスを保持します。大きさは、1、2、4、または 8 です。

m_repeat

この構成要素は、繰り返し回数です。

m_stride

この構成要素は、1 つのオブジェクトを初期化するごとに飛び越えるオブジェクトの数を示します。この値が 0 の場合、初期化を m_repeat 回数連続して行うことを意味します。

m_value

この構成要素は、初期化値です。