Executable and Linkable Format(ELF)

news2024/9/21 12:48:18

File layout

ELF文件有两种视图。程序头表(Program Header)显示在运行时使用的段(Segments),而节头表(Section Header)则列出了二进制文件的所有节(Sections)的集合。程序头表主要用于运行时加载和链接,而节头表则用于调试和符号表等其他目的。程序头表和节头表都是ELF文件中的重要部分,用于描述和组织文件的结构和内容。

ELF头文件定义了使用32位还是64位地址。该头文件包含三个受此设置影响并偏移其后的其他字段的字段。对于32位和64位二进制文件,ELF头文件分别为52或64字节长。

开头四个字节就是0x7F 接上45 4c 46(elf的ascll)

然后一个字节是看看文件种类是64还是32

该字节被设置为1或2,分别表示小端或大端字节序。这会影响从偏移0x10开始的多字节字段的解释方式。

设置为1表示ELF的原始版本和当前版本。

设置目标平台,通常为0

该字段进一步指定了ABI版本。它的解释取决于目标ABI。Linux内核(至少2.6之后)没有对其进行定义,因此对于静态链接的可执行文件,它会被忽略。在这种情况下,EI_PAD的偏移和大小为8。 如果e_ident[EI_OSABI] == 3,则glibc 2.12+将该字段视为动态链接器的ABI版本:它定义了动态链接器功能的列表,将e_ident[EI_ABIVERSION]视为共享对象(可执行文件或动态库)所请求的功能级别,并且如果请求了未知功能,则拒绝加载它,即e_ident[EI_ABIVERSION]大于已知功能的最大值。

当前未使用,应填充为零。

识别对象文件类型。

指令架构

是进程开始执行的入口点的内存地址。该字段的长度取决于先前定义的格式,可以是32位或64位。

指向程序头表的起始位置。它通常紧随文件头之后,对于32位和64位的ELF可执行文件,偏移量分别为0x34或0x40。

指向节头表的起始位置。

对于目标架构的解释取决于具体情况。

该字段包含此标头的大小,通常为64位格式为64字节,32位格式为52字节。

该字段包含程序头表条目的大小。

该字段包含程序头表中条目的数量。

这是节表的

该字段包含包含节名称的节头表条目的索引。

然后是elf header的结尾

Program header

程序头表告诉系统如何创建进程镜像。它位于文件偏移量e_phoff处,并由e_phnum个条目组成,每个条目的大小为e_phentsize。在32位ELF和64位ELF中,布局略有不同,因为为了对齐原因,p_flags在不同的结构位置上。每个条目的结构如下:

0x00000000 PT_NULL 程序头表条目未使用

0x00000001 PT_LOAD 可加载的段

0x00000002 PT_DYNAMIC 动态链接信息

0x00000003 PT_INTERP 解释器信息

0x00000004 PT_NOTE 辅助信息

0x00000005 PT_SHLIB 保留

0x00000006 PT_PHDR 包含程序头表的段

0x00000007 PT_TLS 线程本地存储模板

0x60000000 PT_LOOS 下面参见

0x6FFFFFFF PT_HIOS

0x70000000 PT_LOPROC

0x7FFFFFFF PT_HIPROC PT_LOOS到PT_HIOS(PT_LOPROC到PT_HIPROC)是保留范围,用于操作系统(处理器)特定的语义。

p_flags 段相关的标志(64位结构的位置)。

p_offset 段在文件镜像中的偏移量。

p_vaddr 段在内存中的虚拟地址。

p_paddr 在物理地址相关的系统中,保留用于段的物理地址。

p_filesz 文件镜像中段的大小(以字节为单位)。可能为0。

p_memsz 内存中段的大小(以字节为单位)。

p_flags 段相关的标志(32位结构的位置)。

p_align 0和1表示无对齐要求。否则应为正的、整数的2的幂,p_vaddr等于p_offset对p_align取模。

程序头的结尾(大小)

程序头部表(phdr)

程序头部表(PHT)主要用于运行时。它描述了程序的各个部分应该如何被加载到内存中。简单地说,PHT告诉操作系统如何创建程序的进程映像。它包含一系列的条目,每个条目都指向ELF文件中的一个段(segment),这些段需要被映射到进程的虚拟地址空间中。比如,它会指明哪一部分是代码,哪一部分是数据,哪一部分需要初始化等等。操作系统根据这些信息,决定如何将文件中的内容加载到内存,以及如何设置内存的访问权限(如只读、可执行等)。

节头部表(shdr)

节头部表(SHT)则主要用于链接时和调试时。它描述了文件中所有的节(section)的属性和位置。每个节包含了程序的不同类型的数据,比如代码、数据、符号表、重定位信息等。SHT中的每个条目都定义了一个节的名称、大小、类型等信息。链接器(Linker)利用这些信息来处理符号解析和重定位,而调试器(Debugger)则可以利用这些信息来提供程序的调试功能。

区别与作用总结

  • 目的不同:phdr面向的是程序的执行过程,主要用于运行时;而shdr面向的是程序的结构和链接过程,主要用于链接时和调试时。
  • 内容不同:phdr关注于如何将程序加载到内存并执行;shdr包含了更详细的程序结构信息,包括代码、数据、调试信息等。
  • 使用者不同:phdr主要由操作系统的加载器(Loader)使用,shdr则主要由链接器和调试器使用。

在一些情况下,一个ELF文件可能只包含程序头部表而没有节头部表,特别是在那些只需加载执行而不需要进行链接或调试的环境中,这样可以减小文件的大小,加快加载速度。例如,很多嵌入式系统和操作系统的内核就是这样处理的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SCT2633STER:4.5V-60V Vin,3A,高效降压DCDC转换器

•宽输入范围:4.5V-60V •高达3A的连续输出电流 •1.221V1%反馈参考电压 •集成220mΩ高压侧MOSFET •低静态电流为300uA •轻负载下的脉冲跳过模式(PSM) •最小接通时间100ns •内置12ms软启动时间 •简易内部补偿 •固定频率500KH…

使用Docker搭建一款实用的个人IT工具箱——It-Tools

作为程序员,在日常工作中,需要借助一些工具来提高我们工作效率,IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能,使开发者能以更高效方式完成任务。经由IT-Tools,开发人员能轻松应对各类技术挑战&…

怎么抠图把把人物扣下来?简单快捷的抠图方法

相信很多新手小白在初入设计行业时,对于抠图怎么把人物扣下来都是一头雾水。抠图作为设计中常用的一种技术,能够帮助我们快速提取图片中的某个部分,进行合成或者修改。对于老手来说,抠图或许是再熟悉不过的操作,但对于…

WPF中如何设置自定义控件

1.圆角按钮的设置: 众所周知在WPF中自带有提示信息,当我问创建Button时,点击空格出现如下可选设置 带有小扳手🔧图标为相应的属性,如果Button有CornerRadius(角半径)属性就能够直接设置Button实…

Unity中URP实现水体(整理优化)

文章目录 前言一、优化水的深度1、我们把 水流动的方向 和 水深浅过渡值,整合到一个四维变量中2、修改 水体流动方向3、在片元着色器中,修改使用过渡变量 二、优化泡沫三、优化水下的扭曲1、修复原本扰动UV的计算 四、优化水面高光1、把高光强度、光滑度…

如何用ai智能写作?推荐5款优秀的AI写作神器

写作是件繁琐的事情,也是需要耗费精力和时间的,还好目前有了ai写作神器的出现,帮助我们解决了不少的写作难题。这些AI写作工具不仅可以帮助我们提高写作效率,还能够生成高质量的内容。在本文中,我将向你推荐5款优秀的A…

MATLAB中strel函数用法

目录 语法 说明 任意邻域形状 二维几何邻域形状 三维几何邻域形状 示例 创建正方形结构元素 创建线形结构元素 创建盘形结构元素 创建三维球形结构元素 参数说明 属性 strel函数的功能是形态学结构元素。 语法 SE strel(nhood) SE strel("diamond",r…

BUUCTF AWD-Test1

打开靶场是这个有些简陋的界面。 随便点点,找到这个东西。 看到ThinkPHP,思路瞬间清晰,老熟人了。这个就是ThinkPHP漏洞。根据版本我们去找一下poc。 /index.php/?sIndex/\think\View/display&content%22%3C?%3E%3C?php%20phpinfo();…

Git工具Clone项目报错:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054

目录 问题现象: 解决方法: 问题现象: 今天在项目中使用git工具clone远程库的项目地址时,遇到了如下报错,导致无法克隆项目代码到本地: OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054 解决方法&#…

【从Python基础到深度学习】9.Python 语法基础

一、常量与变量 常量:程序中使用的具体的数、字符。在运行过程中,值无法更改 变量:表示一一个存储单元,其中存储的值可以修改 如:a5,b6 变量命名: 1、只能包含字母、数字、下划线 2、只能以字母、下划线开头 3、不要使用关键字作为变量名称 …

浅谈mysql mvcc

目录 前言 mvcc 是如何工作的? 数据的更新 前言 mvcc 与一个事物的隔离级别有关,未提交读永远读的是当前值,串行化是通过加锁实现,这两种隔离级别都与mvcc 没有任何关系。只要一提到mvcc应该想到的是读提交以及可重复读&#…

【YOLO系列】YOLOv9论文超详细解读(翻译 +学习笔记)

前言 时隔一年,YOLOv8还没捂热,YOLO系列最新版本——YOLOv9 终于闪亮登场! YOLOv9的一作和v7一样。v4也有他。 他于2017年获得台湾省National Central University计算机科学与信息工程博士学位,现在就职于该省Academia Sinica的…

vue3+ts+vite使用mock数据

安装以下命令 npm i vite-plugin-mock --save-dev npm i mockjs --save-dev 在根路径下创建mock文件夹 mock\user.ts const menuList [{path: /system,component: Layout,name: system,meta: {title: 系统管理,icon: Setting,roles: [sys:manage]},children: [{path: /depar…

曾桂华:车载座舱音频体验探究与思考| 演讲嘉宾公布

智能车载音频 I 分论坛将于3月27日同期举办! 我们正站在一个前所未有的科技革新的交汇点上,重塑我们出行体验的变革正在悄然发生。当人工智能的磅礴力量与车载音频相交融,智慧、便捷与未来的探索之旅正式扬帆起航。 在驾驶的旅途中&#xff0…

卷积神经网络基本概念补充

卷积(convolution)、通道(channel) 卷积核大小一般为奇数,有中心像素点,便于定位卷积核。 步长(stride)、填充(padding) 卷积核移动的步长(stride…

【Qt学习】QLCDNumber的介绍与实例使用(倒计时功能)

文章目录 1. 介绍2. 实例 - QLCDNumber倒计时3. 资源文件 1. 介绍 QLCDNumber是Qt框架中用于显示数字的控件,它模拟了一个液晶数字显示屏。 在Designer界面中显示如下: 有以下 常用属性: 属性描述intValue获取或设置QLCDNumber显示的整数…

前端架构: 脚手架包管理工具之lerna的全流程开发教程

Lerna 1 )文档 Lerna 文档 https://www.npmjs.com/package/lernahttps://lerna.js.org [请直达这个链接] 使用 Lerna 帮助我们做包管理,并不复杂,中间常用的命令并不是很多这里是命令直达:https://lerna.js.org/docs/api-referen…

nodejs配置环境变量后不生效(‘node‘ 不是内部或外部命令,也不是可运行的程序或批处理文件)

一、在我们安装Node.js后,有时候会遇到node命令不管用的情况,关键是在安装时候已经添加配置了环境变量,向下面这样 但是还是不管用,这是因为环境变量配置不正确,权重不够,或者是命令冲突导致,解…

SpringCloud搭建微服务之Consul服务配置

1. 概述 前面有介绍过Consul既可以用于服务注册和发现,也可以用于服务配置,本文主要介绍如何使用Consul实现微服务的配置中心,有需要了解如何安装Consul的小伙伴,请查阅SpringCloud搭建微服务之Consul服务注册与发现 &#xff0c…

人工智能驱动的自拍时代:短视频美颜SDK技术的发展趋势

在短视频自拍的过程中,美颜技术的应用已经成为了许多人的必备工具,其中短视频美颜SDK技术的发展更是推动了自拍时代的进步。 1.人工智能技术的崛起 传统的美颜功能主要是通过简单的图像处理和滤镜效果来实现,但是这种方法往往会导致照片失真…