elf文件简单介绍

文章目录

  • elf 程序示意图
      • ELF文件格式概述
      • ELF的组成结构
        • 1. ELF头部(ELF Header)
        • 2. 程序头表(Program Header Table)与程序头项(Program Header Entry)
        • 3. 节区头表(Section Header Table)与节区头项(Section Header Entry)


elf 程序示意图

在这里插入图片描述


`

ELF文件格式概述

ELF文件格式是UNIX系统实验室开发的,用于定义应用程序二进制接口(ABI)。在Linux系统中,ELF文件主要分为三种类型:

  1. 可重定位文件(Relocatable):由编译器和汇编器生成的.o文件,供链接器处理。
  2. 可执行文件(Executable):链接器处理.o文件后生成的文件,用于创建进程映像。
  3. 共享对象文件(Shared Object):动态库文件,如.so文件。

ELF文件的结构包括以下几个部分:

  • ELF头部(ELF Header):包含文件的基本信息,如体系结构和操作系统等,并指出节区头表和程序头表的位置。
  • 程序头表(Program Header Table):包含运行时各个段(segment)的信息,主要用于运行时。
  • 节区头表(Section Header Table):包含所有节区(section)的信息,主要用于编译和链接。
  • 节区(Sections):程序员可见的节区,供链接器使用。
  • 段(Segments):运行时的段,程序员不可见,由加载器使用。

ELF的组成结构

ELF文件的结构可以通过以下数据结构来描述:

1. ELF头部(ELF Header)

ELF头部包含了文件的基本信息,并指出了节区头表和程序头表的位置。以下是ELF头部的数据结构:

typedef struct {unsigned char e_ident[16]; // ELF标识信息Elf32_Half e_type;         // 文件类型Elf32_Half e_machine;      // 目标体系结构类型Elf32_Word e_version;      // 文件版本Elf32_Addr e_entry;        // 程序入口的虚拟地址Elf32_Off e_phoff;         // 程序头表的偏移量Elf32_Off e_shoff;         // 节区头表的偏移量Elf32_Word e_flags;        // 特定于处理器的标志Elf32_Half e_ehsize;       // ELF头部的大小Elf32_Half e_phentsize;    // 程序头表每个表项的大小Elf32_Half e_phnum;        // 程序头表表项的个数Elf32_Half e_shentsize;    // 节区头表每个表项的大小Elf32_Half e_shnum;        // 节区头表表项的数目Elf32_Half e_shstrndx;     // 节区头表字符串表索引
} Elf32_Ehdr;
2. 程序头表(Program Header Table)与程序头项(Program Header Entry)

程序头表提供了运行时各个段的信息,如段的类型、偏移、虚拟地址等。以下是程序头项的数据结构:

typedef struct {Elf32_Word p_type;   // 段的类型Elf32_Off p_offset; // 段在文件中的偏移Elf32_Addr p_vaddr; // 段的虚拟地址Elf32_Addr p_paddr; // 段的物理地址Elf32_Word p_filesz; // 段在文件中的大小Elf32_Word p_memsz;  // 段在内存中的大小Elf32_Word p_flags;  // 段标志Elf32_Word p_align;  // 段对齐
} Elf32_Phdr;
3. 节区头表(Section Header Table)与节区头项(Section Header Entry)

节区头表包含了文件中的各个节区信息,每个节区都指定了类型和大小。以下是节区头项的数据结构:

typedef struct {Elf32_Word sh_name;       // 节区名称Elf32_Word sh_type;       // 节区类型Elf32_Word sh_flags;      // 节区标志Elf32_Addr sh_addr;       // 节区地址Elf32_Off sh_offset;      // 节区偏移Elf32_Word sh_size;       // 节区大小Elf32_Word sh_link;       // 节区链接Elf32_Word sh_info;       // 节区信息Elf32_Word sh_addralign;  // 节区对齐Elf32_Word sh_entsize;    // 节区项大小
} Elf32_Shdr;
  1. .interp(解释器节区)

    • 这个节区包含了动态链接器(解释器)的路径,是一个ASCII字符串。当一个程序需要动态链接库时,它会使用这个节区中指定的动态链接器来解析和加载所需的共享库。例如,许多Linux程序的.interp节区会指向/lib/ld-linux.so.2/lib64/ld-linux-x86-64.so.2,这是GNU C库的动态链接器。
  2. .data(数据节区)

    • 这个节区包含了程序的初始化数据,是程序中可修改的部分。它通常用于存储变量和数组等。在程序运行时,.data节区的内容会被加载到内存中,并且可以被程序读写。
  3. .rodata(只读数据节区)

    • 这个节区包含了程序的只读数据,它包含了那些在程序运行时不应该被修改的数据,如字符串常量。例如,printf函数中的字符串参数通常存储在.rodata节区。这个节区在程序运行时会被加载到内存中,但是只能被读取,不能被修改。
  4. .init(初始化节区)

    • 这个节区包含了程序启动时执行的代码,通常用于初始化全局变量和执行启动时的设置。当程序开始运行时,.init节区中的代码会在main函数执行之前被调用。
  5. .fini(终止节区)

    • 与.init节区相对应,.fini节区包含了程序终止时执行的代码,用于执行清理工作,如释放资源和关闭文件。当程序结束运行时,.fini节区中的代码会在main函数返回后被调用。
  6. .gnu.hash(GNU散列节区)

    • 这个节区是一个散列表,用于加速符号表的查找。它允许程序在不进行线性搜索的情况下快速定位符号(如函数和变量名)。这对于动态链接器来说非常重要,因为它需要快速解析程序和库中的符号引用。

这些节区是ELF文件格式的一部分,它们共同协作,确保程序能够正确地被加载、链接和执行。了解这些节区的功能对于深入理解程序的内部工作机制和进行系统编程至关重要。

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

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

相关文章

【python系列】开篇:自学python的方法

1.前言 唯有自学才是最高效最省钱的学习编程的方法。最高效是因为你可以按照自己的节奏来进行学习,随时随地随心的学习,最主要的是掌握学习方法,当然培训老师是不会告诉你方法的,总是跟着培训老师在盲人摸象。最省钱是不用投入资…

【论文复现】交通路口智能监测平台实现

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀交通路口智能监测平台实现 1.概述2.工程文件简介2.1 工程文件结构2.2 训练检测模型2.2.1 准备数据集2.2.2 训练自己的权重文件2.2.3 使用自己…

不宽的宽字符

根据提示&#xff0c;通过nc 202.38.93.141 14202来进行连接&#xff0c;可以用自己的机器进行连接&#xff0c;也可以直接点击“打开/下载题目”连接&#xff1a; 意料之中的无法打开flag&#xff0c;看来得下载附件看看源码了 #include <iostream> #include <fstrea…

无脑使用matlab运行YOLOv5模型,实现目标检测

文章目录 前言代码报错解决方法缺点总结 前言 YOLO 是一种经典的一阶段目标检测算法&#xff0c;它将检测问题转化为回归问题。与 Faster R-CNN 不同&#xff0c;YOLO 不是提取 RoI,而是直接通过回归的方法生成每个类的边界框坐标和概率。与 Faster R-CNN相比&#xff0c;大大…

java ssm 高校固定资产管理系统 高校物资管理 资产信息 源码 jsp

一、项目简介 本项目是一套基于SSM的高校固定资产管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&am…

《战国王朝》青铜材料具体作用介绍

《战国王朝》中的青铜材料是游戏里非常重要的金属材料&#xff0c;而青铜材料的具体作用就是青铜用于制作第三层次的工具和武器;它比铜制的更好&#xff0c;但不如铁和钢制的&#xff0c;相比石制和铜制工具&#xff0c;青铜物品的使用寿命更长。 战国王朝青铜材料有什么用 青…

unity3d————延时函数

1.public void InvokeRepeating(string methodName, float time, float repeatRate); 延迟重复执行函数 InvokeRepeating 参数一&#xff1a;函数名字符串 参数二&#xff1a;第一次执行的延迟时间 参数三&#xff1a;之后每次执行的间隔时间 注意&#xff1a; 1-1.延时函数第…

焊接手电钻板子后总结

复用旧工程部分方案注意事项&#xff1a; 粘贴暑假时候做的工程原理图&#xff0c;复制到现在的项目中竟然忘记修改3V3的名称&#xff0c;导致3V3MCU与3V3的区别&#xff0c;这个错误以后一定要注意&#xff1a; 现在工程中的供电3V3&#xff0c;不是3V3MCU: 焊接QFN芯片&…

大模型智能客服比传统智能客服“智”在哪里?

随着人工智能技术的飞速发展&#xff0c;智能客服已成为企业提升服务效率和客户满意度的关键工具。在智能客服的演进过程中&#xff0c;大模型智能客服以其卓越的性能和智能化水平&#xff0c;逐渐崭露头角&#xff0c;更是为客户服务带来了新的变革。那么&#xff0c;大模型客…

Google Play上架/更新被拒的原因及解决方案

Google Play商店是全球Android开发者发布应用的首选平台&#xff0c;但在这个平台上发布或更新应用时&#xff0c;开发者必须遵守严格的规定和政策。如果违反这些规定&#xff0c;应用可能会被拒绝上架或更新&#xff0c;甚至可能导致开发者账号被封禁。本文将总结Google Play上…

docker安装到D盘

双击安装docker默认是安装在c盘&#xff0c;并且安装时我们没法选择位置&#xff0c;如果我们要安装在其他盘可以通过命令行安装 1、下载docker https://docs.docker.com/desktop/setup/install/windows-install/ Docker Desktop 可以使用 WSL 和 Hyper-V任意一种架构&#xf…

Exploring Defeasible Reasoning in Large Language Models: A Chain-of-Thought A

文章目录 题目摘要简介准备工作数据集生成方法实验结论 题目 探索大型语言模型中的可废止推理&#xff1a;思路链 论文地址&#xff1a;http://collegepublications.co.uk/downloads/LNGAI00004.pdf#page136 摘要 许多大型语言模型 (LLM) 经过大量高质量数据语料库的训练&…

山寨一个Catch2的SECTION

Catch2 是一个 C 单元测试库&#xff0c;吹嘘自己比 NUnit 和 xUnit 还要高明&#xff0c; 支持在 TEST_CASE() 中的多个 SECTION&#xff0c; 意思是说 SECTION 外头的代码相当于setup 和 teardown&#xff0c;section 内部则被认为是实际的 test case&#xff0c; 这种写法可…

TensorFlow_T7 咖啡豆识别

目录 一、前言 二、前期准备 1、设置GPU 2、导入数据 3、查看数据图片 三、数据预处理 1、加载数据 2、可视化数据 3、配置数据集 四、构建VGG-16网络 1、VGG优缺点分析 2、自建模型 3、网络结构图 五、编译 六、 训练模型 一、前言 &#x1f368; 本文为&#…

平替备用机!不到 5 元的 410 随身 WiFi 免刷机实现短信转发

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 各位用备用机的&#xff0c;应该有很多只是插上不常用的手机卡&#xff0c;然后装个短信转发的 App 来看看验证码什么的吧。每隔一段时间还要去看看备用机还有没有电&#xff0c;但其实这种需求骁龙 410 芯…

【EmbeddedGUI】脏矩阵设计说明

脏矩阵设计说明 背景介绍 一般情况下&#xff0c;当屏幕内容绘制完毕后&#xff0c;实际应用通常需要更新屏幕中的一部分内容&#xff0c;而不是单纯显示一个静态图片在那。 如下图所示&#xff0c;屏幕中有一个图片控件&#xff08;Img2&#xff09;和一个文本控件&#xf…

网络基础-超文本协议与内外网划分(超长版)

一、超文本协议 1. HTTP协议简介 1.1. 网络架构简单介绍 (1). C/S架构&#xff08;Client/Server架构&#xff09; (2). B/S架构&#xff08;Browser/Server&#xff09; 总结对比 2. HTTP协议版本 2.1. HTTP/0.9 &#xff08;1991年发布&#xff09; 2.2. HTTP/1.0 &a…

5分钟搞懂 Golang 堆内存

本文主要解释了堆内存的概念&#xff0c;介绍了 Linux 堆内存的工作原理&#xff0c;以及 Golang 如何管理堆内存。原文: Understanding Heap Memory in Linux with Go 你想过为什么堆内存被称为 "堆" 吗&#xff1f;想象一下杂乱堆放的对象&#xff0c;与此类似&…

今日 AI 简报 | 开源 RAG 文本分块库、AI代理自动化软件开发框架、多模态统一生成框架、在线图像背景移除等

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程

文章目录 为什么使用协程协程的理解协程优势协程的原语操作yield 与 resume 是一个switch操作&#xff08;三种实现方式&#xff09;&#xff1a; 基于 ucontext 的协程基于 XFiber 库的操作1 包装上下文2 XFiber 上下文调度器2.1 CreateFiber2.2 Dispatch 基于C20的co_return …