一般に、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)) |
この構成要素は、初期設定値 (メモリーイメージへ移動される値) を提供します。
この構成要素は、初期設定が適用されるものに関するシンボルテーブルインデックスと、初期設定されるオフセットのサイズ (単位: バイト) の両方を提供します。構成要素の下位 8 ビットはサイズを定義し、1、2、4、または 8 になります。上位バイトはシンボルインデックスを定義します。
この構成要素は、初期設定が適用される、関連シンボルからの相対オフセットです。
この構成要素は、繰り返し回数です。
この構成要素は、スキップの数を提供します。この値は、繰り返し初期設定を実行する際にスキップするユニットの数を示します。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 |