1.2 段节格式



分段(或叫分节,后续默认叫法为分段)的二进制文件格式是比较常见的,比如编译器 GCC 输出的目标文件一般为 ELF 的分段文件。

1 整体结构


这类文件一般采用 文件头 + 分段 的结构:

file header 
section 0
section 1
....
section N

文件头设计方法在 文件头 中介绍,本章节主要描述分段式存储数据的方法。

2 分段方法


一般有两种结构:

  • 分散式:在分区的头部的描述分段的大小等信息。
  • 段表式:存在统一的结构描述分段的大小、相对偏移等信息。

分散式

分散式分结构在分区的头部的描述分段的大小等信息,然后各个分段首尾相连的,分段写入。

分段的每一个段的结构通常是:

tag + length
section data

tag 和 length 合起来是分区头部,描述分段中的数据标识,后面紧跟着体数据。

tag 一般是一个整数,用来标识分区的类型。不同的分区用不同的 tag 值表示,不同的分区种类可以使用不同的读取方式。

整体结构如下:

file header 
section 0
            tag     //section 0 的标识
            length  //section 0 的数据长度
            data[]  //section 0 的数据
section 1
....
section N

段表式

段表式的结构是有一个描述分段信息的段表,后面存储各个分区的数据。

主要优点就是,可以通过段描述表(简称段表)快速的访问分段的内容,其格式如下。

section table
section 0
section 1
....
section N

段表一般描述分段的类型、数据长度、相对偏移等,结构如下。

kind
length
offset

C 语言定义如下:

struct SegTabItem{
    uint32 kind;    //类型
    uint32 length;  //数据长度
    uint32 offset;  //相对偏移
};

整体结构如下:

file header 
section table
                kind    //section 0 的类型
                length  //section 0 的数据长度
                offset  //section 0 的相对偏移
                kind    //section 1 的类型
                length  //section 1 的数据长度
                offset  //section 1 的相对偏移
                ...
                kind    //section N 的类型
                length  //section N 的数据长度
                offset  //section N 的相对偏移
section 0
section 1
....
section N