关于程序表项的解析,后面再进行具体分析。
- e_phnum
目前取值为00 01,这里表示程序头的个数当前只有一个程序头,如果有多个程序头表,那么会在elf头文件之后,也就是52个字节之后,依次向下排列。因为这里是1,所以只有1个程序头。
- e_shentsize
表示节区头部表格大小,解析字段为00 28,也就是第一个节区的大小为40个字节的偏移处。根据e_shoff可以知道。
将从e_shoff的区域向后面偏移40个字节,得到第一个节区的内容。
- e_shnum
节区的数量,由字段解析得到数据为00 11。此时得到节区的数量为17个。通过readelf -t也可以解析到节区的数量为17个。
bigmagic@bigmagic:~/work/python_elf/elf$ readelf -t rtthread.elf
There are 17 section headers, starting at offset 0x4245c:
- e_shstrndx
标记字符串节区的索引。当前的解析为00 0e。也就是14个节区为字符节区。
到这里,头部信息的相关字段就解析完成了。
4.elf文件的节区(Section)elf文件中的节是从编译器链接角度来看文件的组成的。从链接器的角度上来看,包括指令、数据、符号以及重定位表等等。
4.1 节区的作用在可从定位的可执行文件中,节区描述了文件的组成,节的位置等信息。通过readelf -s可以查看信息。
这些节信息通过特定的地址偏移组成了一个elf文件的整体。
4.2 节区的组成关于理解ELF中的Section。首先需要知道程序的链接视图,在编译器将一个一个.o文件链接成一个可以执行的elf文件的过程中,同时也生成了一个表。这个表记录了各个Section所处的区域。在程序中,程序的section header有多个,但是大小是一样。拿elf32文件来说
typedef struct
{
Elf32_Word sh_name; /* Section name (string tbl index) */
Elf32_Word sh_type; /* Section type */
Elf32_Word sh_flags; /* Section flags */
Elf32_Addr sh_addr; /* Section virtual addr at execution */
Elf32_Off sh_offset; /* Section file offset */
Elf32_Word sh_size; /* Section size in bytes */
Elf32_Word sh_link; /* Link to another section */
Elf32_Word sh_info; /* Additional section information */
Elf32_Word sh_addralign; /* Section alignment */
Elf32_Word sh_entsize; /* Entry size if section holds table */
} Elf32_Shdr;
根据e_shoff可以找到section的地址,根据e_shentsize可以找到具体的第一个section的内容。