ELF header

1. ELF header定义

ELF header的定义可以在 /usr/include/elf.h 中找到。Elf32_Ehdr是32位 ELF header的结构体。Elf64_Ehdr是64位ELF header的结构体。
所以,ELF header在ELF文件中的大小与位置是确定的,位置位于文件头部,大小则是Elf_Ehdr结构体的大小。

typedef struct
{unsigned char	e_ident[EI_NIDENT];	/* Magic number和其它信息 */Elf32_Half	e_type;			/* Object file type */Elf32_Half	e_machine;		/* Architecture */Elf32_Word	e_version;		/* Object file version */Elf32_Addr	e_entry;		/* Entry point virtual address */Elf32_Off	e_phoff;		/* Program header table file offset */Elf32_Off	e_shoff;		/* Section header table file offset */Elf32_Word	e_flags;		/* Processor-specific flags */Elf32_Half	e_ehsize;		/* ELF header size in bytes */Elf32_Half	e_phentsize;		/* Program header table entry size */Elf32_Half	e_phnum;		/* Program header table entry count */Elf32_Half	e_shentsize;		/* Section header table entry size */Elf32_Half	e_shnum;		/* Section header table entry count */Elf32_Half	e_shstrndx;		/* Section header string table index */
} Elf32_Ehdr;typedef struct
{unsigned char	e_ident[EI_NIDENT];	/* Magic number and other info */Elf64_Half	e_type;			/* Object file type */Elf64_Half	e_machine;		/* Architecture */Elf64_Word	e_version;		/* Object file version */Elf64_Addr	e_entry;		/* Entry point virtual address */Elf64_Off	e_phoff;		/* Program header table file offset */Elf64_Off	e_shoff;		/* Section header table file offset */Elf64_Word	e_flags;		/* Processor-specific flags */Elf64_Half	e_ehsize;		/* ELF header size in bytes */Elf64_Half	e_phentsize;		/* Program header table entry size */Elf64_Half	e_phnum;		/* Program header table entry count */Elf64_Half	e_shentsize;		/* Section header table entry size */Elf64_Half	e_shnum;		/* Section header table entry count */Elf64_Half	e_shstrndx;		/* Section header string table index */
} Elf64_Ehdr;

64位和32位只是个别字段长度不同,比如 Elf64_Addr 和 Elf64_Off 都是64位无符号整数。而Elf32_Addr 和 Elf32_Off是32位无符号整数。这导致ELF header的所占的字节数不同。32位的ELF header占52个字节,64位的ELF header占64个字节。

2. ELF header详解

在这里插入图片描述
(1)e_ident占16个字节。前四个字节被称作ELF的Magic Number。后面的字节描述了ELF文件内容如何解码等信息。等一下详细讲。

(2)e_type,2字节,描述了ELF文件的类型。以下取值有意义:

ET_NONE, 0, No file typeET_REL, 1, Relocatable file(可重定位文件,通常是文件名以.o结尾,目标文件)ET_EXEC, 2, Executable file (可执行文件)ET_DYN, 3, Shared object file (动态库文件,你用gcc编译出的二进制往往也属于这种类型,惊讶吗?)ET_CORE, 4, Core file (core文件,是core dump生成的吧?)ET_NUM, 5,表示已经定义了5种文件类型ET_LOPROC, 0xff00, Processor-specificET_HIPROC, 0xffff, Processor-specific

从ET_LOPROC到 ET_HIPROC 的值,包含特定于处理器的语义。
(3)e_machine,2字节。描述了文件面向的架构,可取值如下(因为文档较老,现在有更多取值,参见/usr/include/elf.h中的EM_开头的宏定义):

 EM_NONE, 0, No machineEM_M32, 1, AT&T WE 32100EM_SPARC, 2, SPARCEM_386, 3, Intel 80386EM_68K, 4, Motorola 68000EM_88K, 5, Motorola 88000EM_860, 7, Intel 80860EM_MIPS, 8, MIPS RS3000... ...

(4)e_version,2字节,描述了ELF文件的版本号,合法取值如下:

 EV_NONE, 0, Invalid versionEV_CURRENT, 1, Current version,通常都是这个取值。EV_NUM, 2, 表示已经定义了2种版本号

(5)e_entry,(32位4字节,64位8字节),执行入口点,如果文件没有入口点,这个域保持0。

(6)e_phoff, (32位4字节,64位8字节),program header table的offset,如果文件没有PH,这个值是0。

(7)e_shoff, (32位4字节,64位8字节), section header table 的offset,如果文件没有SH,这个值是0。

(8)e_flags, 4字节,特定于处理器的标志,32位和64位Intel架构都没有定义标志,因此eflags的值是0。

(9)e_ehsize, 2字节,ELF header的大小,32位ELF是52字节,64位是64字节。

(10)e_phentsize,2字节。program header table中每个入口的大小。

(11)e_phnum, 2字节。如果文件没有program header table, e_phnum的值为0。e_phentsize乘以e_phnum就得到了整个program header table的大小。

(12)e_shentsize, 2字节,section header table中entry的大小,即每个section header占多少字节。

(13)e_shnum, 2字节,section header table中header的数目。如果文件没有section header table, e_shnum的值为0。e_shentsize乘以e_shnum,就得到了整个section header table的大小。

(14)e_shstrndx, 2字节。section header string table index. 包含了section header table中section name string table。如果没有section name string table, e_shstrndx的值是SHN_UNDEF.

**注意:**program header table一般译为程序头表,section header table 一般译为节头表,因为这样的翻译无助于理解,所以我倾向于不翻。

3. e_ident

回过头来,我们仔细看看文件前16个字节,也是e_ident。
在这里插入图片描述
如图,前4个字节是ELF的Magic Number,固定为7f 45 4c 46。
第5个字节指明ELF文件是32位还是64位的。
第6个字节指明了数据的编码方式,即我们通常说的little endian或是big endian。little endian我喜欢称作小头在前,低位字节在前,或者直接说低位字节在低位地址,比如0x7f454c46,存储顺序就是46 4c 45 7f。big endian就是大头在前,高位字节在前,直接说就是高位字节在低位地址,比如0x7f454c46,在文件中的存储顺序是7f 45 4c 46。
第7个字节指明了ELF header的版本号,目前值都是1。
第8-16个字节,都填充为0。

4. readelf读取ELF header

使用readelf -h 可以读取文件的ELF header信息。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/206910.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​极氪,中国传统汽车品牌电动化的样板间

这篇文章早就想写了,因为太忙的原因就一直跳票,正好最近两件事的出现,又触发了想写这篇文章的冲动。 两件事主要是: 一,10 月份各家陆续公布了单月销量以及累计销量; 二,极氪在北京正式发布了 …

jmeter中调用python代码

1、安装pyinstaller pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller 2、将py脚本打包 pyinstaller -F venv/get_image/OCR_jmeter_api.py 3、jmeter中添加OS Process Sampler并调用dist下的程序 4、执行jmeter

【高级网络程序设计】Week2-1 Sockets

一、The Basics 1. Sockets 定义An abstraction of a network interface应用 use the Socket API to create connections to remote computers send data(bytes) receive data(bytes) 2. Java network programming the java network libraryimport java.net.*;similar to…

网络安全之渗透测试入门准备

渗透测试入门所需知识 操作系统基础:Windows,Linux 网络基础:基础协议与简单原理 编程语言:PHP,python web安全基础 渗透测试入门 渗透测试学习: 1.工具环境准备:①VMware安装及使用&#xff1b…

OSG文字-HUD显示汉字示例(3)

显示文字是一种非常实用的技术&#xff0c;可以用来把一些重要的文字始终显示在屏幕上。HUD的全称是HeadsUpDisplay&#xff0c;即抬头显示&#xff0c;这种技术最早应用在军事战斗机上。 创建HUD显示的基本步骤如下: <1> 创建一个osg::Camera对象&#xff0c;设置视图、…

苍穹外卖项目笔记(4)——菜品管理

菜品管理 主要功能模块&#xff1a;新建菜品、修改菜品、启用禁用菜品、菜品的分页查询、删除菜品 代码&#xff1a;GitHub - Echo0701/take-out 1 公共字段自动填充 公共字段指的是业务表中有一些相同的字段&#xff0c;比如创建人、创建时间、修改人、修改时间等&#xff…

赞!优雅的Python多环境管理神器!易上手易操作!

前言 Python 的不同版本之间常常存在依赖关系和兼容性问题&#xff0c;为了方便开发人员在 不同项目中使用不同的版本 。 如果大家使用过Python版本管理工具&#xff0c;肯定大多数人使用的都是Anaconda&#xff0c;它是一个优秀的数据科学开发环境&#xff0c;本身也提供了丰…

有一台电脑一部手机就可以在网上赚钱,这些项目你也可以学会

很多人都希望能够在家中或者闲暇的时候&#xff0c;能够在网上赚钱&#xff0c;而网络给了我们这样的可能。只要有一台电脑和一部手机&#xff0c;你就可以开始你的赚钱之旅。这些项目并不难&#xff0c;只要你肯学&#xff0c;就一定能够成功。 1、美工设计 这个副业主要是推荐…

centos无法进入系统之原因解决办法集合

前言 可爱的小伙伴们&#xff0c;由于精力有限&#xff0c;暂时整理了两类。如果没有你遇到的问题也没有关系&#xff0c;欢迎底下留言评论或私信&#xff0c;小编看到后第一时间帮助解决 一. Centos 7 LVM xfs文件系统修复 情况1&#xff1a; [sda] Assuming drive cache:…

909-2015-T3

文章目录 1.原题2.算法思想2.1.求树的高度2.2.求路径 3.关键代码4.完整代码5.输出结果 1.原题 试编写算法&#xff0c;求给定二叉树上从根节点到叶子节点的一条路径长度等于树的深度减一的路径&#xff08;即列出从根节点到该叶子节点的节点序列&#xff09;&#xff0c;若这样…

利用QRCode.js生成动态二维码页面

文章目录 QRCode.js简介HTML结构JavaScript生成动态二维码拓展功能1. 联系信息二维码2. Wi-Fi网络信息二维码 总结 &#x1f389;利用QRCode.js生成动态二维码页面 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏…

windows系统安装ubuntu22.04虚拟机

镜像文件准备 镜像文件 官网 企业开源和Linux | Ubuntu 镜像下载地址 https://cn.ubuntu.com/download/server/step1 选择合适的版本下载 虚拟机安装 文件-- 新建虚拟机 选择镜像 修改安装路径 修改大小&#xff0c;最好60g&#xff0c;大一点 设置用户信息 设置虚拟机网络…