• 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    一个可执行文件至少有一个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 */
    
    
    • 1
    • 2
    • 3
    • 4

    2.3 section与program的关系

    在这里插入图片描述

    3. link脚本与Program

    在这里插入图片描述
    Program的个数由link脚本中的MEMORY定义决定。

  • 相关阅读:
    代码随想录算法训练营day60|84.柱状图中最大的矩形 |完结撒花~
    token、cookie、session
    wish测评自养号,卖家怎么快速出单?
    解密Prompt系列11. 小模型也能COT-先天不足后天来补
    OpenCV每日函数 图像过滤模块 (10) getGaborKernel计算Gabor 滤波器函数
    基于java+SpringBoot+VUE+Mysql在线考试系统
    氨基NH2/羧酸COOH/马来酰亚胺MAL/叠氮N3/巯基SH/生物素Biotin修饰CdTe/CdS量子点
    IO-DAY1
    ise使用ChipScope时报错NgdBuild:604
    我的创作纪念日——2048天
  • 原文地址:https://blog.csdn.net/heyangge/article/details/134555356