Go to main content
Oracle® Solaris 11.3 リンカーとライブラリガイド

印刷ビューの終了

更新: 2015 年 10 月
 
 

セクションの圧縮

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;
ch_type

圧縮アルゴリズムを指定します。サポートされているアルゴリズムとその説明は、表 22 に示されています。

ch_size

圧縮解除後のデータのサイズ (単位: バイト)。sh_size を参照してください。

ch_addralign

圧縮解除後のデータに必要な整列。sh_addralign を参照してください。

圧縮セクションヘッダーの sh_size フィールドと sh_addralign フィールドには、圧縮セクションの要件が反映されます。圧縮ヘッダーの ch_size フィールドと ch_addralign フィールドには、圧縮解除後のデータに対応した値が示されます。これにより、セクションが圧縮されていなければ sh_size および sh_addralign に表示されていた値がわかります。

圧縮ヘッダー以降のデータのレイアウトおよび解釈はそれぞれのアルゴリズムによって異なります。このレイアウトには、圧縮したデータバイト以外に、アルゴリズム固有のパラメータと整列パディングが含まれる場合があります。

圧縮ヘッダーの ch_type メンバーには、次の表に示すように、使用されている圧縮アルゴリズムが指定されます。

表 22  ELF 圧縮タイプ、ch_type
名前
ELFCOMPRESS_ZLIB
1
ELFCOMPRESS_LOOS
0x60000000
ELFCOMPRESS_HIOS
0x6fffffff
ELFCOMPRESS_LOPROC
0x70000000
ELFCOMPRESS_HIPROC
0x7fffffff
ELFCOMPRESS_ZLIB

セクションデータは、ZLIB 圧縮アルゴリズムで圧縮されます。圧縮された ZLIB データバイトは、圧縮ヘッダー直後のバイトから始まり、セクションの最後まで続きます。ZLIB のドキュメントは、http://www.zlib.net/ にあります。

ELFCOMPRESS_LOOS - ELFCOMPRESS_HIOS

この範囲の値 (両端の値を含む) は、オペレーティングシステム固有のセマンティクスのために予約されています。

ELFCOMPRESS_LOPROC - ELFCOMPRESS_HIPROC

この範囲の値は、プロセッサ固有のセマンティクスのために予約されています。

GNU 形式のセクション圧縮

Oracle Solaris リンカーは、前述の圧縮形式に加え、GNU ツールチェーンで使用される別の形式を認識します。この形式では、圧縮を示すセクションフラグは使用されません。代わりに、セクション名が .zdebug の接頭辞で始まっていれば、圧縮されたデータを含むセクションであることがわかります。GNU 形式の圧縮セクションは、次の圧縮ヘッダー構造から始まります。

typedef struct {
        uchar_t         gch_magic[4];
        uchar_t         gch_size[8];
} Chdr_GNU;
gch_magic

圧縮アルゴリズムを特定する 4 バイトのマジックナンバー。現時点では、ZLIB 圧縮だけがサポートされています。ZLIB 圧縮の gch_magic の値は、表 23 に示すとおりです。

gch_size

64 ビット ELFDATA2MSB ビッグエンディアン整数値としてエンコードされた、圧縮解除後のデータのサイズ (単位: バイト)。

表 23  GNU ZLIB 圧縮、gch_magic
名前
gch_magic[0]
'Z'
gch_magic[1]
'L'
gch_magic[2]
'I'
gch_magic[3]
'B'