Linux_ELF文件

目录

前言: 

一、ELF文件的类型

二、ELF文件的组成格式 

1. ELF头部(ELF Header)

2. 节头表(Section Header Table)

3. 程序头表(Program Header Table)

4. 节(Sections)与段(Segments)

 三、ELF文件从形成到加载轮廓

1、ELF可执行文件形成过程

2、 可执行文件从磁盘加载到内存section的变化

1、Section与Segment的基本关系

2、合并机制与内存优化

四、理解动静态库链接和加载 

​编辑

1. 动态链接核心原理

2. 程序启动与动态链接流程

动态链接器:

1. 位置无关代码(PIC)基础原理


前言: 

ELF(Executable and Linkable Format):

是Unix/Linux系统下的标准可执行文件、目标文件和共享库格式。

是一种文件格式的名称

一、ELF文件的类型

ELF文件根据用途可分为以下几种主要类型:

  1. 可重定位文件(Relocatable File)

    • 文件扩展名通常为.o
    • 由编译器生成,包含代码和数据但未指定绝对地址
    • 用于与其他目标文件链接生成可执行文件或共享库
    • 在Linux系统中通过gcc -c命令生成
  2. 可执行文件(Executable File)

    • 通常没有特定扩展名(如Linux中的a.out)
    • 包含可直接执行的程序代码和数据
    • 由链接器处理可重定位文件后生成
    • 包含程序入口点,可直接被操作系统加载执行
  3. 共享目标文件(Shared Object File)

    • 文件扩展名通常为.so
    • 包含可共享的代码和数据,用于动态链接
    • 可在两种情况下使用:
      • 链接时与其他文件链接生成新目标文件
      • 运行时与可执行文件结合作为进程映像的一部分
  4. 核心转储文件(Core Dump File)

    • 由操作系统在程序崩溃时生成
    • 包含程序崩溃时的内存状态和寄存器信息
    • 用于调试和故障排除
类型扩展名主要用途生成方式使用场景
可重定位文件.o链接编译器生成链接阶段
可执行文件无/.out执行链接器生成运行阶段
共享目标文件.so动态链接链接器生成链接和运行阶段
核心转储文件core调试系统生成调试阶段

二、ELF文件的组成格式 

 基本信息如图:

1. ELF头部(ELF Header)

  • 位于文件起始位置,固定大小(32位系统52字节,64位系统64字节)
  • 包含文件的基本信息:
    • 魔数(Magic Number):0x7f 0x45 0x4c 0x46(ASCII为"ELF")
    • 文件类型(可执行/可重定位/共享库等)
    • 目标体系结构(如x86、ARM)
    • 程序入口地址(可执行文件)
    • 节头表和程序头表的位置和大小信息

2. 节头表(Section Header Table)

  • 包含多个节头表条目,每个条目描述一个节(section)的信息
  • 主要作用:
    • 记录各节的名称、类型、文件偏移、大小、读写权限等
    • 主要用于链接过程(链接视图)
    • 对于可重定位文件是必须的,对于可执行文件是可选的

3. 程序头表(Program Header Table)

  • 包含多个程序头表条目,每个条目描述一个段(segment)的信息
  • 主要作用:
    • 描述如何将文件中的段加载到内存
    • 主要用于执行过程(执行视图)
    • 对于可执行文件和共享库是必须的,对于可重定位文件可能为空

4. 节(Sections)与段(Segments)

  • 节(Section)‌:

    • 链接视图的基本单位
    • 常见节包括:
      • .text:可执行代码
      • .data:已初始化的全局/静态变量
      • .bss:未初始化的全局/静态变量
      • .rodata:只读数据
      • .symtab:符号表
      • .strtab:字符串表
      • .rel.text/.rel.data:重定位信息
  • 段(Segment)‌:

    • 执行视图的基本单位
    • 由多个具有相同权限的连续节组成
    • 常见段类型:
      • LOAD:需加载到内存的段(代码段、数据段)
      • DYNAMIC:动态链接信息
      • INTERP:指定动态链接器路径10

 三、ELF文件从形成到加载轮廓

1、ELF可执行文件形成过程

- step-1:将多份 C/C++ 源代码,翻译成为⽬标 .o ⽂件
- step-2:将多份 .o ⽂件section进⾏合并

2、 可执行文件从磁盘加载到内存section的变化

1、Section与Segment的基本关系

ELF文件具有双重视图特性:

  • 链接视图‌:以Section为基本单位,包含.text(代码)、.data(已初始化数据)、.bss(未初始化数据)等,主要用于链接阶段
  • 执行视图‌:以Segment为基本单位,由多个属性相同的Section合并而成,用于运行时加载

关键区别:

特性SectionSegment
用途链接阶段执行阶段
组织结构独立功能单元合并后的内存块
表结构Section Header TableProgram Header Table
必要性可执行文件可选可执行文件必须

2、合并机制与内存优化

合并过程的核心目的是‌减少内存碎片‌,提高页面使用效率:

  1. 为什么要合并

    • 现代系统采用分页加载机制,典型页大小为4KB(4096字节)
    • 示例:未合并时.text(4097B)和.data(1B)占用3页(2+1),合并后仅需2页(4098B)
  2. 合并规则‌:

    • 相同内存属性(可读/可写/可执行)的Section会被合并8
    • 必须具有相同的加载需求(需要运行时申请空间)8
    • 典型合并模式:
      • 代码段:合并.text.rodata等只读可执行Section
      • 数据段:合并.data.bss等可读写Section
  3. 程序头表(Program Header Table)作用‌:

    • 每个表项(Elf32_Phdr/Elf64_Phdr)描述一个Segment的:
      • 类型(p_type):如PT_LOAD(需加载段)
      • 标志位(p_flags):读写执行权限
      • 文件偏移(p_offset)和大小(p_filesz)
      • 内存地址(p_vaddr)和大小(p_memsz)
      • 对齐要求(p_align)8
    • 加载器根据这些信息建立进程内存映像

四、理解动静态库链接和加载 

1、静态库

下面是样例代码 

我们可以通过objdump -d 命令:将代码段(.text)进⾏反汇编查看,其中callq的加载到内存的机械码,而后面跟着的一串0代表访问的函数地址,在链接中才会填充地址,也叫做地址重定位 

静态链接就是把库中的.o进⾏合并,和上述过程⼀样
所以链接其实就是将编译之后的所有⽬标⽂件连同⽤到的⼀些静态库运⾏时库组合,拼装成⼀个独⽴的可执⾏⽂件。其中就包括我们之前提到的地址修正,当所有模块组合在⼀起之后,链接器会根据我们的.o⽂件或者静态库中的重定位表找到那些需要被重定位的函数全局变量,从⽽修正它们的地址。这其实就是静态链接的过程

研究静态链接其实就是研究不同的.o文件是如何链接到一起的,.o类型文件也叫做可重定位目标文件

1. 动态链接核心原理

动态链接的本质是将链接过程推迟到程序加载时完成,这一机制实现了代码共享和内存优化。当执行一个程序时,操作系统会执行以下关键步骤:

  1. 程序加载‌:将程序的可执行代码和依赖的动态库加载到内存
  2. 地址分配‌:为每个动态库动态分配内存地址(ASLR技术确保地址随机化)
  3. 地址空间映射‌:将动态库映射到进程的地址空间
  4. 符号解析‌:解析程序对动态库中符号的引用

动态链接的两个关键阶段:

  • 地址空间映射‌:通过mmap系统调用将动态库映射到进程地址空间
  • 符号绑定‌:通过PLT/GOT机制实现函数调用跳转

2. 程序启动与动态链接流程

C/C++程序的执行并非直接从main函数开始,而是经历以下初始化过程

阶段执行内容负责组件
_start设置堆栈、初始化数据段crt0.o
动态链接加载共享库、符号解析ld-linux.so
__libc_start_main线程初始化、信号处理glibc
main用户代码执行用户程序

详细流程:

  1. 入口点_start‌:由C运行时库提供,建立基本执行环境
  2. 动态链接器调用‌:通过.interp段定位ld-linux.so
  3. 库加载与重定位‌:
    • 解析DT_NEEDED条目加载依赖库
    • 处理.rel.plt和.rel.dyn重定位表
  4. 控制权转移‌:通过__libc_start_main最终调用main函数

动态链接器:


◦ 动态链接器(如ld-linux.so)负责在程序运⾏时加载动态库。
◦ 当程序启动时,动态链接器会解析程序中的动态库依赖,并加载这些库到内存中。
环境变量和配置⽂件:
◦ Linux系统通过环境变量(如LD_LIBRARY_PATH)和配置⽂件(如/etc/ld.so.conf及其⼦配置⽂件)来指定动态库的搜索路径。
◦ 这些路径会被动态链接器在加载动态库时搜索。
缓存⽂件:
◦ 为了提⾼动态库的加载效率,Linux系统会维护⼀个名为/etc/ld.so.cache的缓存⽂件。
◦ 该⽂件包含了系统中所有已知动态库的路径和相关信息,动态链接器在加载动态库时会⾸先
搜索这个缓存⽂件

1. 位置无关代码(PIC)基础原理

位置无关代码(Position Independent Code)是动态库能够实现多进程共享的核心技术,其核心特性包括:

  • 地址无关性‌:代码可以在内存任意位置加载执行,无需修改指令
  • 相对寻址‌:所有地址引用都基于当前指令指针或全局偏移表(GOT)
  • 重定位延迟‌:符号解析推迟到加载或运行时完成

PIC的实现主要通过两种机制:

  1. PC相对寻址‌:用于函数内部跳转和局部数据访问
  2. 全局偏移表(GOT)‌:存储外部变量和函数的绝对地址,通过间接访问实现重定位

 

基本过程

  1. 通过mm_struct中的变量找到有关共享区的结构体,根据里面的成员指针变量找到路径
  2. 根据路径找到磁盘中的数据块加载到内存
  3. 发生映射关系关联起来
  4. 得到库的起始虚拟地址
  5. 数据区会有一个名为.GOT的表记录库函数的偏移量,映射过后,表会根据库的起始虚拟地址进行修改得到完整的访问共享区的地址

 --------------------------------------------------------------------------------------------------------------------------

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

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

相关文章

Go语言语法---输入控制

文章目录 1. fmt包读取输入1.1. 读取单个值1.2. 读取多个值 2. 格式化输入控制 在Go语言中,控制输入主要涉及从标准输入(键盘)或文件等来源读取数据。以下是几种常见的输入控制方法: 1. fmt包读取输入 fmt包中的Scan和Scanln函数都可以读取输入&#xf…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-C. 常用SQL脚本模板

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 附录C. 常用SQL脚本模板速查表一、数据清洗与预处理模板二、数据聚合与分析模板三、窗口函数应用模板四、性能优化与监控模板五、数据备份与恢复模板六、权限管理与安全模板七、事务与错误处理模板八、时…

51单片机课设基于GM65模块的二维码加条形码识别

系统组成 主控单元:51单片机(如STC89C52)作为核心控制器,协调各模块工作。 扫描模块:GM65条码扫描头,支持二维码/条形码识别,通过串口(UART)与单片机通信。 显示模块&a…

【OpenGL学习】(二)OpenGL渲染简单图形

文章目录 【OpenGL学习】(二)OpenGL渲染简单图形OpenGL渲染图形流程顶点,图元和片元VAO,VBO ,EBO着色器示例:使用OpenGL渲染三角形 【OpenGL学习】(二)OpenGL渲染简单图形 OpenGL渲…

基于STM32的INA226电压电流检测仪

系统总体框图 功率检测装置原理图功能及模块连接说明 一、系统功能概述 该装置以STM32F103C8T6微控制器为核心,集成功率检测、数据交互、状态显示和用户提示功能,通过模块化设计实现稳定运行。 二、各模块功能及连接方式 按键模块 功能&#xff1a…

YOLOv2目标检测算法:速度与精度的平衡之道

一、YOLOv2的核心改进:从V1到V2的蜕变 YOLOv2作为YOLO系列的第二代算法,在继承V1端到端、单阶段检测的基础上,针对V1存在的小目标检测弱、定位精度低等问题进行了全方位升级,成为目标检测领域的重要里程碑。 (一&am…

将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector

作者: Andre Luiz 讨论如何以及何时使用 semantic_text、dense_vector 或 sparse_vector,以及它们与嵌入生成的关系。 通过这个自定进度的 Search AI 实践学习亲自体验向量搜索。你可以开始免费云试用,或者在本地机器上尝试 Elastic。 多年来…

uniapp取消浏览自动填充

为了防止浏览器自动将记住的密码回填进type"password"输入框&#xff0c;所以在type"password"输入框上面加了两行代码&#xff0c;使浏览器将密码填充到新加的输入框里&#xff0c;并将这两个input隐藏掉 <input type"password" autocomple…

从数据包到可靠性:UDP/TCP协议的工作原理分析

之前我们已经使用udp/tcp的相关接口写了一些简单的客户端与服务端代码。也了解了协议是什么&#xff0c;包括自定义协议和知名协议比如http/https和ssh等。现在我们再回到传输层&#xff0c;对udp和tcp这两传输层巨头协议做更深一步的分析。 一.UDP UDP相关内容很简单&#xf…

显卡、Cuda和pytorch兼容问题

这里写目录标题 驱动与CUDA版本兼容性问题1. **驱动与CUDA版本兼容性问题**2. **任务特性与硬件适配差异**3. **优化策略与框架配置差异**4. **散热与功耗限制**5. **数据传输与CPU瓶颈**排查建议总结 查询PyTorch中实际使用的CUDA版本**1. 查询PyTorch中实际使用的CUDA版本***…

DeepSeek 大模型部署全指南:常见问题、优化策略与实战解决方案

DeepSeek 作为当前最热门的开源大模型之一&#xff0c;其强大的语义理解和生成能力吸引了大量开发者和企业关注。然而在实际部署过程中&#xff0c;无论是本地运行还是云端服务&#xff0c;用户往往会遇到各种技术挑战。本文将全面剖析 DeepSeek 部署中的常见问题&#xff0c;提…

Hadoop的目录结构和组成

Hadoop 目录结构 bin 目录&#xff1a;包含了 Hadoop 的各种命令行工具&#xff0c;如hadoop、hdfs等&#xff0c;用于启动和管理 Hadoop 集群&#xff0c;以及执行各种数据处理任务。etc 目录&#xff1a;存放 Hadoop 的配置文件&#xff0c;包括core-site.xml、hdfs-site.xm…

Python Matplotlib 库【绘图基础库】全面解析

让AI成为我们的得力助手&#xff1a;《用Cursor玩转AI辅助编程——不写代码也能做软件开发》 一、发展历程 Matplotlib 由 John D. Hunter 于 2003 年创建&#xff0c;灵感来源于 MATLAB 的绘图系统。作为 Python 生态中最早的可视化工具之一&#xff0c;它逐渐成为科学计算领…

车载以太网驱动智能化:域控架构设计与开发实践

title: 车载以太网驱动专用车智能化&#xff1a;域控架构设计与开发实践 date: 2023-12-01 categories: 新能源汽车 tags: [车载以太网, 电子电气架构, 域控架构, 专用车智能化, SOME/IP, AUTOSAR] 引言&#xff1a;专用车智能化转型的挑战与机遇 专用车作为城市建设与工业运输…

图论模板(部分)

图论模板&#xff08;部分&#xff09; maincpp #include <iostream> #include <climits> #include <limits>typedef unsigned long long ull; typedef long long ll; typedef long double ld; typedef std::pair<int, int> PII;#define rep(i, n) f…

2025年【道路运输企业安全生产管理人员】考试题库及道路运输企业安全生产管理人员考试内容

一、考试概述 2025年道路运输企业安全生产管理人员考试题库由【安全生产模拟考试一点通】平台发布&#xff0c;涵盖安全生产法律法规、车辆技术管理、从业人员管理、应急预案编制等核心领域。考试重点考察考生对安全生产主体责任、风险管控、隐患排查等实务操作的掌握程度&…

分贝计在噪音污染源识别中的用途

分贝计在噪音污染源识别中的作用 噪音污染是现代社会面临的一个普遍问题&#xff0c;尤其在城市化进程加快的背景下&#xff0c;交通、工业、建筑和娱乐活动等产生的噪音对人们的生活质量和健康造成了严重影响。为了有效管理和控制噪音污染&#xff0c;首先需要准确识别噪音的…

deepin v23.1 搜狗输入法next配置中文输入法下默认用英文标点

deepin23.1下, fcitx5的 deepin next搜狗输入法的属性页无法配置中文状态下默认用英文标点, 但是可以改以下配置来实现这一点. 搜狗输入法运行期间&#xff0c;用户修改的配置被存储在以下位置&#xff1a; ~/.config/cpis/module/im/fcitx5/com.sogou.ime.ng.fcitx5.deepin/k…

C语言:在 Win 10 上,g++ 如何编译 gtk 应用程序

在 Windows 10 上使用 g&#xff08;或 gcc&#xff09;编译基于 GTK 的 C 语言程序是完全可行的&#xff0c;且相比 Tcc 更为推荐&#xff0c;因为 g&#xff08;GNU 编译器套件&#xff09;对 GTK 的支持更加完善&#xff0c;配置也更简单。以下是详细步骤和注意事项&#xf…

84.评论日记

原链接 这个视频我发了四五条评论。评论内容甚至和下面这个视频内的其他评论一样。 找了另外的账号也发了。 发现&#xff0c;无论是我这个账号&#xff0c;还是其他的账号&#xff0c;评论都无法看到。 我大胆猜测有一种机制&#xff0c;某些官号会被设置成一种高检测的等…