基础技术-ELF系列(1)-ELF文件基础

成就更好的自己

本篇是基础技术系列中ELF相关技术的首篇文章。

尽管网上有许多关于ELF相关内容的文章,但总体而言,要么是一些非常基础且重复性强的内容,要么直接深入探讨相对高深的主题,缺乏系统化分析和解释。

接下来,在本系列和专栏后续文章中,我们将以更加通俗的方式对ELF相关内容进行系统化分析。


目录

ELF的由来与作用

ELF文件的结构

ELF文件作执行用途

ELF文件作链接用途

ELF文件结构


ELF的由来与作用

ELF,叫做可执行可链接格式,是可执行文件、目标代码、共享库和核心转储的通用标准文件格式。

它首先在Unix操作系统版本的应用程序二进制接口(ABI)规范中发布,随后在工具接口标准中发布,它很快被不同的Unix系统供应商所接受。

从设计上来说,ELF格式灵活、可扩展且跨平台。它支持不同的字节序和地址大小,因此不会排除任何特定的CPU或指令集架构。这使得它能够被许多不同硬件平台上的许多不同操作系统采用。

请注意,ELF是一种约定的格式,是一种format!所谓的ELF文件是指遵循ELF的格式进行组建的文件,而不是某种特定的文件!

ELF在不同场景下有着不同的存在文件形式和作用,但这些文件都是遵循ELF的格式进行组建的:

  1. 可执行文件:编译链接出来的可执行文件,通过./就可以运行的那种。
  2. 目标代码:编译打包出来的.o.a文件,通过链接器链接用的。
  3. 共享库:编译出来的可重定位.so文件,也执行时进行LinkLoad用的。
  4. 核心转储:使用gdb调试或段错误时生成的core文件,保存了产生该文件时的某个进程的内存状态映像,用于debug或其他操作。

ELF文件的结构

大多数文章从这里开始就要千篇一律的讲解ELF结构了,这里我先按下不表。为了方便各位看官理解后续内容,我先讲点别的。

ELF之所以叫做可执行可链接格式,就是因为他最主要的作用就是两件事——1.执行2.链接。

ELF文件作执行用途

ELF文件作执行用途的情况一般有这么几个常见场景:

  • 不使用动态链接库编出的可执行文件,elf头如下:

  • 使用动态链接库编出的可执行文件,elf头如下:

  • 编出的动态链接库,elf头如下:

很明显,ELF文件用作执行用途的情况下,不管静态编译还是动态编译出来的,只要他作执行用途,那就会有入口点地址。众所周知,启动一个程序的主要步骤就是创建进程空间(进程控制块什么的)->分配内存页->将可执行文件和动态链接库(可能需要)中的内容(程序与数据)加载到内存->跳转到程序入口点->开始执行程序。

可执行文件和动态链接库都是能被执行的,因此上述过程中的加载待运行的程序与数据到内存这个步骤是ELF文件作为执行用途所必须的。

那程序加载器是如何知道可执行文件中的什么内容应该放到进程内存空间中的什么位置呢?因为用作执行用途的ELF文件中含有一个区域叫做程序头表(program headers tab),这个头表是虚拟出来的概念,是若干程序头(program headers)共同组成的一种表,他会告诉程序加载器将要执行的可执行文件中的各个数据块应该放在进程内存空间的什么位置;可执行文件中所谓的需要进行搬移的各个数据块,就是ELF文件中段(segment)这个概念。

好的,通俗的总结一下:

  1. ELF文件中的程序头和段是ELF文件用作执行用途的基本信息和概念;
  2. 程序加载器将ELF文件中的内容加载到内存的时候就是基于段进行加载的;
  3. 每个段都有一个对应的程序头,用于描述该段的信息,有多少程序头就有多少段;
  4. 可通过图片中Number of program headers 判断有多少程序头,通过Size of program headers判断每个程序头的长度;
  5. 这些程序头在ELF文件中的存放是连续的,存放的起始地址偏移就是图片中的程序头起点;

(上述部分内容涉及到程序加载和进程内存模型,属于计算机基础,不知道的建议买一本黑皮书看看,这里不展开)

ELF文件作链接用途

ELF文件作执行用途的情况一般有这么几个常见场景:

  • 编出的.o文件或静态链接库

很明显,与作执行用途的ELF文件相比,用作链接用途的ELF文件不能进行执行操作,也就没有入口点地址和程序头地址,也没有必要将文件中的内容加载到内存中;因此也就没有程序表头和段的概念。

用作链接用途的ELF文件通常使用在生成可执行程序的链接过程,这个过程简单来讲就是若干个可重定位可链接文件(.o或.a文件)进行相互链接并统一规划程序或数据的地址空间。

链接器如何在这些可链接文件中定位查找对应的符号并将指定的程序和数据进行地址重定位呢?因为用作链接用途的ELF文件中含有一个区域叫做节头表(section headers tab),这个头表是虚拟出来的概念,是若干节头(section headers)共同组成的一种表,他会告诉程序链接器需要的符号去哪里找,找到之后怎样如何进行地址重定位;可链接文件中在链接过程中具有相同意义和功能的数据放在了一起作为一个数据块,根据数据块的意义和功能不同得到ELF文件中节(section)这个概念。

好的,通俗的总结一下:

  1. ELF文件中的节头和节是ELF文件用作链接用途的基本信息和概念;
  2. 程序链接器将ELF文件中的内容进行链接时就是以节为单位进行符号查找等功能的;
  3. 每个节都有一个对应的节头,用于描述该节的信息,有多少节头就有多少节;
  4. 可通过图片中Number of section headers 判断有多少节头,通过Size of section headers判断每个节头的长度;
  5. 这些节头在ELF文件中的存放是连续的,存放的起始地址偏移就是图片中的start of section headers;

(上述部分内容涉及到编译过程,属于编译原理,不知道的建议买一本黑皮书看看,这里不展开)

ELF文件结构

现在看到的就是所有文章中基本都会用到的一张很经典的图,ELF文件结构,为了方便理解我做亿些小小的注释:

ELF文件主要结构如下:

  1. ELF头:描述整个ELF文件的头,包含了一些ELF文件的基础信息,就是上文中通过readelf –h看到的那些信息,其中前文那些图中的size of this header表示该文件头的长度。该部分在任何ELF文件中都是必须存在的。
  2. 若干程序头组成的程序头表:包含每个段的描述信息。该部分在没有执行功能的ELF文件中可以不存在。
  3. 若干节(若干段):ELF文件中的主要内容,由若干节的内容组成,在能够被执行的ELF文件中,也可以说是若干段的内容组成。同时站在两边的视角去看,如果段概念存在的情况下,每个段不重复的包含至少0个节。该部分为ELF文件的主体数据内容,必须存在。
  4. 若干节头组成的节头表:包含每个节的描述信息。该部分在一般ELF文件中都会存在,除非通过工具人为删除掉。

好的,通俗的总结一下:

一个未经任何人为修改阉割的ELF文件应至少有ELF头+若干节+若干节头组成;若ELF文件可被执行,则由ELF头+若干程序头+若干节+若干节头组成,其中将节(可以不是所有节)划入若干段的范围内。节是站在链接和文件基本构成的角度考虑的,段则是ELF文件具有被执行能力后,站在执行角度考虑的。

举个例子,下图是通过readelf –a得到的,可以看到该ELF文件有8个段,每个段是由那些节映射组成的。(.tbss等.xxx都是节的名称)。

一个ELF文件若人为阉割了节头,具有链接功能的ELF文件就会失去链接功能;具有执行功能的ELF文件就不可查看ELF文件内符号信息等大部分信息,但不会影响执行功能(因为程序头表还在,但动态链接库除外,动态链接库程序头和节头都需要)。

本篇结束,下一篇ELF文件进阶内容。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++技能进阶指南——多态语法剖析

前言:多态是面向对象的三大特性之一。顾名思义, 多态就是多种状态。 那么是什么的多种状态呢? 这里的可能有很多。比如我们去买火车票, 有普通票, 学生票; 又比如我们去旅游, 有儿童票&#xff…

10款免费黑科技软件,强烈推荐!

1.AI视频生成——巨日禄 网页版https://aitools.jurilu.com/ "巨日禄 "是一款功能强大的文本视频生成器,可以快速将文本内容转换成极具吸引力的视频。操作简单,用户只需输入文字,选择喜欢的样式和模板, “巨日禄”就会…

Nginx - 安全基线配置与操作指南

文章目录 概述中间件安全基线配置手册1. 概述1.1 目的1.2 适用范围 2. Nginx基线配置2.1 版本说明2.2 安装目录2.3 用户创建2.4 二进制文件权限2.5 关闭服务器标记2.6 设置 timeout2.7 设置 NGINX 缓冲区2.8 日志配置2.9 日志切割2.10 限制访问 IP2.11 限制仅允许域名访问2.12 …

【408真题】2009-16

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

qemu+gdb调试linux内核

打开CONFIG_DEBUG_INFO,编译内核 通过图形菜单配置该宏,执行make menuconfig。 kernel hacking —> compile-time checks and compiler options —> compile the kernel with debug info 验证是否打开成功,grep -nr “CONFIG_DEBUG_INFO” .config。 打开成功,然后…

AcWing 3466. 清点代码库(STL:map,vector)

3466. 清点代码库 需要求有几种不同数列&#xff0c;每种有多少个&#xff0c;可以想到用map。它的键是一个数列&#xff0c;可以把它放在vector里。也就是map<vector<int>,int> 要满足要求的输出序列&#xff0c;就要想把它放在其他容器&#xff0c;或数组里&…

【Linux】信号之信号的保存和处理详解

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误或者有写的不好的地方的话&…

仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码

码名称&#xff1a;仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码自动采集 - 我爱模板网源码名称&#xff1a;仿《Q极速体育》NBACBA体育直…

编程实战:自己编写HTTP服务器(系列3:处理框架)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 系列入口&#xff1a;编程实战…

需求分析部分图形工具

描述复杂的事物时,图形远比文字叙述优越得多,它形象直观容易理解。前面已经介绍了用于建立功能模型的数据流图、用于建立数据模型的实体-联系图和用于建立行为模型的状态图,本节再简要地介绍在需求分析阶段可能用到的另外3种图形工具。 1 层次方框图 层次方框图用树形结…

LaTex 模板 - 东北师范大学申研申博推荐信

文章目录 NENU-Letter-Template项目地址示例特性项目结构如何使用main.texletterContent.tex 如何编译方式 1 &#xff1a;在线编译方式 2 &#xff1a;本地编译 参考 NENU-Letter-Template NENU’s recommendation letter template. 东北师范大学推荐信模板 项目地址 GitHu…

Spring框架学习笔记(五):JdbcTemplate 和 声明式事务

基本介绍&#xff1a;通过 Spring 框架可以配置数据源&#xff0c;从而完成对数据表的操作。JdbcTemplate 是 Spring 提供的访问数据库的技术。将 JDBC 的常用操作封装为模板方法 1 JdbcTemplate 使用前需进行如下配置 1.1 在maven项目的pom文件加入以下依赖 <dependencies…

Windows安装并启动Redis服务端(zip包)

一、Redis简介 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的基于内存的 Key - Value结构的数据库&#xff0c;遵守 BSD 协议&#xff0c;它提供了一个高性能的键值&#xff08;key-value&#xff09;存储系统&#xff0c;常用于缓存、消息队列、会话存储…

c# sqlite使用

安装包 使用 const string strconn "Data Sourcedata.db"; using (SQLiteConnection conn new SQLiteConnection(strconn)) {conn.Open();var cmd conn.CreateCommand();cmd.CommandText "select 1";var obj cmd.ExecuteScalar();MessageBox.Show(ob…

Python小游戏——打砖块

文章目录 打砖块游戏项目介绍及实现项目介绍环境配置代码设计思路代码设计详细过程 难点分析源代码代码效果 打砖块游戏项目介绍及实现 项目介绍 打砖块游戏是一款经典的街机游戏&#xff0c;通过控制挡板来反弹小球打碎屏幕上的砖块。该项目使用Python语言和Pygame库进行实现…

鲁教版七年级数学上册-笔记

文章目录 第一章 三角形1 认识三角形2 图形的全等3 探索三角形全等的条件4 三角形的尺规作图5 利用三角形全等测距离 第二章 轴对称1 轴对称现象2 探索轴对称的性质4 利用轴对称进行设计 第三章 勾股定理1 探索勾股定理2 一定是直角三角形吗3 勾股定理的应用举例 第四章 实数1 …

【实际项目精选源码】ehr人力资源管理系统实现案例(java,vue)

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化人力资源管理系统&#xff0c;涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块&#xff0c;解决了从人事招聘到酬薪计算的全周期人力资源管理&#xff0c;符合当下大中小型企业组织架构管理运…

心链2---前端开发(整合路由,搜索页面,用户信息页开发)

心链——伙伴匹配系统 接口调试 说书人&#x1f4d6;&#xff1a;上回书说到用了两种方法查询标签1.SQL查询&#xff0c;2.内存查询&#xff1b;两种查询效率是部分上下&#xff0c;打的是难解难分&#xff0c;是时大地皴裂&#xff0c;天色聚变&#xff0c;老祖斟酌再三最后决…

(十一)统计学基础练习题五(50道选择题)

本文整理了统计学基础知识相关的练习题&#xff0c;共50道&#xff0c;适用于想巩固统计学基础或备考的同学。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-统计学二&#xff09;。序号之前的题请看往期文章。 201&#xff09; 202&#xff09; 203&#xff09; 2…

指纹识别概念解析

目录 1. 指纹是物证之首 1.1 起源于中国 1.2 发展于欧洲 1.3 流行于全世界 2. 指纹图像 3. 指纹特征 4. 指纹注册 5. 指纹验证 6. 指纹辨识 1. 指纹是物证之首 指纹识别技术起源于中国、发展于欧洲、流行于全世界。自20世纪以来&#xff0c;指纹在侦破刑事案件、解决诉…