ELF程序头表结构(Elf32_Phdr)

ELF程序头表结构(Elf32_Phdr)

Content #

ELF可执行文件中有一个专门的数据结构叫做程序头表(Program Header Table)用来保存“Segment”的信息。因为ELF目标文件不需要被装载,所以它没有程序头表,而ELF的可执行文件和共享库文件都有。跟段表结构一样,程序头表也是一个结构体数组,它的结构体如下:

typedef struct
{
  Elf32_Word	p_type;		/* Segment type */
  Elf32_Off	p_offset;	/* Segment file offset */
  Elf32_Addr	p_vaddr;	/* Segment virtual address */
  Elf32_Addr	p_paddr;	/* Segment physical address */
  Elf32_Word	p_filesz;	/* Segment size in file */
  Elf32_Word	p_memsz;	/* Segment size in memory */
  Elf32_Word	p_flags;	/* Segment flags */
  Elf32_Word	p_align;	/* Segment alignment */
} Elf32_Phdr;

Elf32_Phdr结构体的几个成员与使用“readelf –l”打印文件头表显示的结果一一对应。

如果p_memsz大于p_filesz,就表示该“Segment”在内存中所分配的空间大小超过文件中实际的大小,这部分“多余”的部分则全部填充为“0”,那些额外的部分就是BSS。因为数据段和BSS的唯一区别就是:数据段从文件中初始化内容,而BSS段的内容全都初始化为0。

p_type #

#define PT_LOAD		1	/* Loadable program segment */
#define PT_DYNAMIC	2	/* Dynamic linking information */
#define PT_INTERP	3	/* Program interpreter */
#define PT_NOTE		4	/* Auxiliary information */
#define PT_SHLIB	5	/* Reserved */
#define PT_PHDR		6	/* Entry for header table itself */
#define PT_TLS		7	/* Thread-local storage segment */

p_vaddr #

Segment在进程虚拟地址空间的起始位置。

p_paddr #

Segment物理装载地址,即LMA(Load Memory Address),参看: VMA与LMA

From #

程序员的自我修养