程序头表
以32位为例;程序头表由几个项组成,其处理方式类似于数组项。
数据结构
/* Program segment header. */
typedef struct
{
Elf32_Word p_type; /* Segment type */
描述段的种类,其中段的种类如下:
PT_NULL表示的段。
PT_LOAD表示可装载段,在程序执行前从二进制文件映射到内存。
PT_DYNAMIC表示段包含了用于动态链接器的信息
PT_INTERP表示当前段指定了可用于动态链接的程序解释器。通常是ld-linux.so
PT_NOTE指定一个段,其中可能包含专用的编译器信息。
还有两个是处理器相关,内核不关注。
Elf32_Off p_offset; /* Segment file offset *
/所述段在文件中的偏移量(从起始位置计算,单位为字节)
Elf32_Addr p_vaddr; /* Segment virtual address */
给出了段的数据映射到虚拟地址空间中的位置(对于PT_LOAD类型的段)。只支持物理寻址,不支持虚拟寻址的系统,将使用p_paddr保持信息。
Elf32_Addr p_paddr; /* Segment physical address */物理寻址支持
Elf32_Word p_filesz; /* Segment size in file */段在二进制文件中的长度
Elf32_Word p_memsz; /* Segment size in memory */段在虚拟地址空间中的长度,与文件中的物理的长度差值可通过截断数据或填充0字节来补偿。
Elf32_Word p_flags; /* Segment flags */
保持了标志信息ÿ