Program Header Table(转载)

程序头表与段表相互独立,由ELF文件头统一管理。
程序头表负责ELF文件从文件到加载后映像的映射关系,一般只有可执行文件包含。

1. segment和section

segment:
程序头表项描述的对象称为segment,即elf文件加载后的数据块;
它提供给加载器loader使用,loader需要知道rwe属性
可执行文件可以没有section,但一定要有segment。

section:
section描述加载前的数据块,给链接器linker使用。
linker主要关心.text, .rel.text, .data, .rodata等,需要重定位。

2. segment描述数据结构

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;

2.1 field p_type

/* Legal values for p_type (segment type).  */
#define	PT_NULL		0		/* Program header table entry unused */
#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 */
#define	PT_NUM		8		/* Number of defined types */

一个可执行文件至少有一个PT_LOAD类型的段,如text, data,并根据p_align对齐。

2.2 Other Fields

  • p_offset, segment文件偏移;
  • p_vaddr, segment虚拟地址;
  • p_paddr, segment物理地址。因为现代os都使用了分页机制,所以不用关心,readelf输出结果等于虚拟地址;
  • p_filesz, segment文件大小;
  • p_memsz, segment内存大小;
  • p_align, segmenet内存对齐大小,LOAD段值为0x1000;
  • p_flags, segment权限属性
#define PF_X		(1 << 0)	/* Segment is executable */
#define PF_W		(1 << 1)	/* Segment is writable */
#define PF_R		(1 << 2)	/* Segment is readable */

2.3 section与program的关系

Program Header Table(转载)_第1张图片
Program Header Table(转载)_第2张图片
因为.data与.bss均是连续的,所以从ELF到bin,此Program提取就只可以将.bss前的所有段作为.data段内容。

3. link脚本与Program

Program Header Table(转载)_第3张图片
Program的个数由link脚本中的MEMORY定义决定。

4. Program与bin

Program Header Table(转载)_第4张图片
**注意:**由上到下代表对应到bin文件低地址到高地址,而且Program会按2K进行对齐,若Program未按2K对齐,不足则补0。

你可能感兴趣的:(编译链接,c语言)