当前位置: 首页 > news >正文

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的关系

在这里插入图片描述

3. link脚本与Program

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

http://www.lryc.cn/news/239110.html

相关文章:

  • 汽车智能座舱/智能驾驶SOC -2
  • Vite Vue3+Element Plus框架布局
  • 【原创】为MybatisPlus增加一个逻辑删除插件,让XML中的SQL也能自动增加逻辑删除功能
  • ABAP 长文本操作
  • C++:哈希表的模拟实现
  • echarts实现如下图功能代码
  • Java 开源重试类 guava-retrying 使用案例
  • 服务器 jupyter 文件名乱码问题
  • Ubuntu设设置默认外放和麦克风设备
  • 【教程】Sqlite迁移到mysql(django)
  • 【漏洞复现】DPTech VPN存在任意文件读取漏洞
  • CentOS 8搭建WordPress
  • 服务器安全防护导致使用多款行业顶尖软件搭配使用,还是单独一款解决呢?
  • 【Spring篇】Spring注解式开发
  • 14.(vue3.x+vite)组件间通信方式之pinia
  • DolphinDB 浙商银行 | 第二期现场培训圆满结束
  • DBS note4:Buffer Management
  • Linux 中 .tar 和 tar.gz 的区别
  • 区域人员超限AI算法的介绍及TSINGSEE视频智能分析技术的行业应用
  • asp.net mvc点餐系统餐厅管理系统
  • SpringBoot 使用多SqlSessionFactory下的事务问题
  • 浏览器内置NoSQL数据库IndexedDB
  • 网络参考模型与标准协议(二)-TCP/IP对等模型详细介绍
  • 万宾科技智能井盖传感器,预防城市道路安全
  • GCC/Make/CMake 工具链
  • GO抽象工厂模式
  • Linux 磁盘/分区/修复 命令
  • php一句话木马免杀
  • 深度学习人体跌倒检测 -yolo 机器视觉 opencv python 计算机竞赛
  • 轻松整理文件夹,将视频文件全部归类到另一个文件夹!