リンカーとライブラリ

移動セクション

一般に、ELF ファイル内では、初期設定されたデータ変数はオブジェクトファイル内で維持されます。データ変数が非常に大きく、初期設定された (ゼロ以外の) 要素が少数の場合でも、変数全体はやはりオブジェクトファイルで維持されます。

サイズの大きな部分的に初期設定されたデータ変数を含むオブジェクト (FORTRAN COMMON ブロックなどのような) は、多大なディスクスペースオーバーヘッドをもたらすことがあります。SHT_SUNW_move セクションは、こういったデータ変数を圧縮して関連オブジェクトのディスクサイズを減らすメカニズムを提供します。

SHT_SUNW_move セクションは、ELF32_Move または Elf64_Move 型の複数のエントリを含みます。これらのエントリはデータ変数を一時的項目 (.bss) として定義することが可能で、そのためオブジェクトファイル内にスペースを占めることなく、実行時にオブジェクトのメモリーイメージに反映させることができます。移動レコードは、完全なデータ変数を構成するためにデータについてメモリーイメージがどのように初期設定されるかを確立します。

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_value

この構成要素は、初期設定値 (メモリーイメージへ移動される値) を提供します。

m_info

この構成要素は、初期設定が適用されるものに関するシンボルテーブルインデックスと、初期設定されるオフセットのサイズ (単位: バイト) の両方を提供します。構成要素の下位 8 ビットはサイズを定義し、1、2、4、または 8 になります。上位バイトはシンボルインデックスを定義します。

m_poffset

この構成要素は、初期設定が適用される、関連シンボルからの相対オフセットです。

m_repeat

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

m_stride

この構成要素は、スキップの数を提供します。この値は、繰り返し初期設定を実行する際にスキップするユニットの数を示します。1 ユニットは m_info で定義された初期設定オブジェクトのサイズです。m_stride の値が 0 の場合、初期設定を m_repeat ユニット連続して行うことを示します。

次のデータ定義は、オブジェクトファイル内で通常 0x8000 バイトを消費するものです。


typedef struct {
        int     one;
        char    two;
} Data

Data move[0x1000] = {
        {0, 0},
        {1, '1'},
        {0, 0},
        {0xf, 'F'}, {0xf, 'F'},
        {0, 0},
        {0xe, 'E'},
        {0, 0},
        {0xe, 'E'}
};

SHT_SUNW_move セクションを使用して、データ項目を .bss セクションへ移動し、関連する移動エントリで初期設定することができます。


% elfdump -s data | fgrep move
      [17]  0x00020868 0x00008000  OBJT GLOB 0   .bss       move
% elfdump -m data
Move Section: .SUNW_move
        offset  ndx     size    repeat  stride  value   with respect to
        0x8     0x17    4       1       0       0x1     foo
        0xc     0x17    1       1       0       0x31    foo
        0x18    0x17    4       2       2       0xf     foo
        0x1c    0x17    1       2       8       0x46    foo
        0x28    0x17    4       2       4       0xe     foo
        0x2c    0x17    1       2       16      0x45    foo