SHF_COMPRESSED セクションフラグは、圧縮データを含むセクションを示します。SHF_COMPRESSED は、割り当て不可のセクションにのみ適用され、SHF_ALLOC と組み合わせて使用することはできません。さらに、SHF_COMPRESSED はタイプ SHT_NOBITS のセクションに適用できません。
圧縮セクションに適用する必要のある再配置は、非圧縮セクションデータへのオフセットを指定します。したがって、再配置を適用する前に、セクションデータを圧縮解除する必要があります。それぞれの圧縮セクションは、個別にアルゴリズムを指定します。特定の ELF オブジェクトの別々のセクションは、異なる圧縮アルゴリズムを採用できます。
圧縮セクションの先頭には、圧縮アルゴリズムを特定する圧縮ヘッダー構造があります。
typedef struct { Elf32_Word ch_type; Elf32_Word ch_size; Elf32_Word ch_addralign; } Elf32_Chdr; typedef struct { Elf64_Word ch_type; Elf64_Word ch_reserved; Elf64_Xword ch_size; Elf64_Xword ch_addralign; } Elf64_Chdr;
圧縮アルゴリズムを指定します。サポートされているアルゴリズムとその説明は、表 22 に示されています。
圧縮解除後のデータのサイズ (単位: バイト)。sh_size を参照してください。
圧縮解除後のデータに必要な整列。sh_addralign を参照してください。
圧縮セクションヘッダーの sh_size フィールドと sh_addralign フィールドには、圧縮セクションの要件が反映されます。圧縮ヘッダーの ch_size フィールドと ch_addralign フィールドには、圧縮解除後のデータに対応した値が示されます。これにより、セクションが圧縮されていなければ sh_size および sh_addralign に表示されていた値がわかります。
圧縮ヘッダー以降のデータのレイアウトおよび解釈はそれぞれのアルゴリズムによって異なります。このレイアウトには、圧縮したデータバイト以外に、アルゴリズム固有のパラメータと整列パディングが含まれる場合があります。
圧縮ヘッダーの ch_type メンバーには、次の表に示すように、使用されている圧縮アルゴリズムが指定されます。
|
セクションデータは、ZLIB 圧縮アルゴリズムで圧縮されます。圧縮された ZLIB データバイトは、圧縮ヘッダー直後のバイトから始まり、セクションの最後まで続きます。ZLIB のドキュメントは、http://www.zlib.net/ にあります。
この範囲の値 (両端の値を含む) は、オペレーティングシステム固有のセマンティクスのために予約されています。
この範囲の値は、プロセッサ固有のセマンティクスのために予約されています。
Oracle Solaris リンカーは、前述の圧縮形式に加え、GNU ツールチェーンで使用される別の形式を認識します。この形式では、圧縮を示すセクションフラグは使用されません。代わりに、セクション名が .zdebug の接頭辞で始まっていれば、圧縮されたデータを含むセクションであることがわかります。GNU 形式の圧縮セクションは、次の圧縮ヘッダー構造から始まります。
typedef struct { uchar_t gch_magic[4]; uchar_t gch_size[8]; } Chdr_GNU;
圧縮アルゴリズムを特定する 4 バイトのマジックナンバー。現時点では、ZLIB 圧縮だけがサポートされています。ZLIB 圧縮の gch_magic の値は、表 23 に示すとおりです。
64 ビット ELFDATA2MSB ビッグエンディアン整数値としてエンコードされた、圧縮解除後のデータのサイズ (単位: バイト)。
|