ELF格式的重定位原理分析

(一)固件库 stm32f10x.h 详细分析、同程序更换芯片时需要修改的地方;创建MDK5工程模板 STM32F4-固件库开发(1)固件库(2)CMSIS 标准NVIC(3)STM32F4 官方库包介绍 stm32f407是学习正点原子探索者开发板时所做的知识总结 (1)固件库 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。对于 STM32 这种级别的 MCU,数百个寄存器记起来太难。于是 ST(意法半导体)推出了官方固件库,固件库将这... 阅读详情

前面有篇文章分析了ELF格式,也只是让我们对目标文件有了一个大概的了解,并没有说明一个十分重要的问题:重定位,今天重新看了下重定位的资料,终于弄懂了重定位的过程,下面来做一个分析。

我们将使用下面两个源代码中的文件a.c和b.c展开分析:

//a.c
extern int shared;
int main()
{
	int a=100;
	swap(&a,&shared);
}
//b.c
int shared=1;
void swap(int *a,int *b)
{
	*a^=*b^=*a^=*b;
}


使用命令:gcc -c a.c b.c生成两个可重定位目标文件a.o和b.o,下面就要使用链接器将a.o和b.o链接起来生成执行文件ab,我们分析的就是这个过程。

1.链接的过程

现在的链接器一般都是两步链接,也就是说整个链接过程分两步。

1)符号解析,主要使用ELF里面的符号表节来完成,不做描述。

2)重定位:一旦链接器完成符号解析这一步,它就把代码中的每个符号引用和定义联系起来。在此时,链接器就知道它的输入目标文件中的代码节和数据节的确切大小。现在就可以重定位了,在这个步骤中将合并输入模块,并为每个符号分配运行时地址。重定位由两步组成:

  • 重定位节和符号定义:在这一步中,链接器将所有相同类型的节合并为同一类型的新的聚合节。例如输入文件a.o的.text节和b.o中的.text节合并为可执行文件ab中的.text节。然后链接器将运行时存储器地址赋值给新的聚合节。当这一步完成时,程序中的每个指令和全局变量都有唯一的运行时存储器地址。
  • 重定位节中的符号引用:在这一步中,链接器修改代码节和数据节中对每个符号的引用,试的他们指向正确的运行时地址。为了执行这一步,链接器依赖于重定位条目。稍后我们来重点分析这一步骤的具体实现过程。
我们看到上面是a.o的各个段的分布情况,看到VMA列全都是0,VMA就是虚拟地址的意思,说明a.o中的节确实没有分配存储器运行时地址,根据上面描述,可执行文件ab中应该分配了虚拟地址,事实确实证明了这点:
我们发现VMA不再是0。可执行文件的代码段映射到08048094,数据段映射到08049108。
2.重定位的具体实现分析
先来看下重定位条目的内容:
RELOCATION RECORDS FOR [.text]:
OFFSET   TYPE              VALUE 
0000001c R_386_32          shared
00000027 R_386_PC32        swap
OFFSET的意义:要修改的位置在.text节的偏移量
TYPE:重定位类型
VALUE:重定位符号的名称
R_386_32(绝对寻址修正):  objdump -d a.o
  18:   c7 44 24 04 00 00 00    movl   $0x0,0x4(%esp)
  1f:   00 
movl指令要将shared的地址送到esp+4的位置,但是此时并不知道shared的地址,所以就先放00000000。在重定位条目中的第一项偏移是1c,刚好对应00000000。所以重定位的过程就是修改这个偏移处的内容。其实这个决定寻址修正很简单,只是书上各种符号公式看的让人迷惑。
修正过程:
假设shared符号的运行时地址是0x8049108,即ADDR(shared)=0x8049108。
要该修的位置的地址:就将00000000替换为ADDR(shared)即可。
R_386_PC32(相对寻址xiuzheng):ojbdump -d a.o
26:   e8 fc ff ff ff          call   27 <main+0x27>
 相对寻址的意思就是相对当前IP位置跳转,call实现近转移,当前指令的ip+跳转位移=目标地址
我们先看可执行文件ab的反汇编代码:
也就是说0x8048bf+x=0x80480c8,算得x=9,正好是指令的操作数。
假设P是待修改的位置的虚拟地址,S是符号实际虚拟地址,那么P+4+x=S,所以x=S-P-4,即x=0x8048c8-4-0x8048bb=9.

Linux二进制分析-ELF格式分析及符号重定位 ELF文件类型 ET_NONE:未知类型。 ET_REL:重定位文件。通常是还未被链接到可执行程序中的一段位置独立的代码,例如linux中的.o格式的文件。 ET_EXEC:可执行文件。 ET_DYN:共享目标文件。ELF类型为dynamic,意味着该文件被标记为了一个动态的可连接的目标文件,也称为共享库,这类共享库会在程序运行时被装载并链接到程序的进程镜像中。 ET_CORE:核心文件,在程序崩溃或进程传递了一个SIGSEGV信号(分段违规)时,会在核心文件中记录整个进程的镜像信息。 ELF文件结构 阅读详情

相关推荐

计算机原理系列之四 ——– 可重定位文件详解

欢迎访问我的个人博客: luomuxiaoxiao.com 计算机原理系列之四 -------- 可重定位文件详解 @(F.08 Blogs) 文章目录计算机原理系列之四 -------- 可重定位文件详解一、生成中间文件二、可重定位文件分析2.1 解析文件头,说明文件构成2.2 分析ELF文件各部分2.2.1 ELF header 上篇文章我们从整体上介绍了从C文件到可执行文件的编译过程,并逐...

luomuxiaoxiao98的专栏 3389

嵌入式知识-ARM裸机-学习笔记(4):重定位与链接脚本的使用

嵌入式知识-ARM裸机-学习笔记(4):重定位与链接脚本的使用 一、重定位 1. 一些基本概念的引入 位置有关编码: 汇编源码编码成二进制可执行程序后和内存地址是有关的。(大部分代码都是位置有关的,即受地址影响) 位置无关编码(PIC,position independent code): 汇编源文件被编码成二进制可执行程序时编码方式与位置(内存地址)无关。 链接地址: 链接时指定的地址(指定方式...

qq_42826337的博客 4085

深入解析ELF文件格式:从链接、加载到动态链接的完整指南

在计算机系统中,可执行文件是程序运行的载体,其内部结构决定了操作系统如何加载和执行代码。ELF(Executable and Linkable Format)作为Linux和类Unix系统的标准二进制文件格式,通过其精密的节(Section)与段(Segment)结构,定义了代码、数据、符号等信息的组织方式。这种结构化设计不仅解决了多文件编译时的符号解析与地址重定位问题,实现了高效的静态链接,还通过程序头表为操作系统加载器提供了清晰的“装载指南”,确保了程序能正确映射到内存。在工程实践中,动态链接技术进一步

weixin_34302561的博客 432

ELF重定位

在工作和学习中,越发发现ELF文件格式的重要性,今天简单谈谈ELF重定位。重定位技术实际上是给二进制打补丁的机制,如果使用了动态连接器,可以使用重定位在内存打热补丁。 ELF重定位重定位技术实际上是给二进制打补丁的机制,如果使用了动态连接器,可以使用重定位在内存打热补丁。https://mp.weixin.qq.com/s?__biz=MzAxNjIyNDgzNw==&mid=2247488904&idx=1&sn=78cb9a50f76b471d760e37be0527a02..

RToax 2929

Python-Exodus工具轻松实现Linux ELF二进制文件移植

可执行与可链接格式(ELF)是类Unix系统中用于存储程序和对象文件的标准二进制格式。它不仅包含了程序的代码和数据,还涵盖了程序的元信息,如符号表和重定位信息,这对于程序的加载和链接至关重要。虚拟化技术允许在单一硬件上同时运行多个虚拟机(VM),每个VM拥有自己独立的操作系统和应用程序环境。Python-Exodus支持虚拟化环境中的ELF文件移植,这对于云服务提供商和测试工程师来说,有着重要的意义。

weixin_33773084的博客 1065

从问卷到结论:手把手教你用SPSS 28完成一份完整的社科数据分析报告

本文详细介绍了如何使用SPSS 28完成社会科学研究中的数据分析报告,从问卷数据导入、清洗到描述性和推断性统计分析,再到结果呈现与报告撰写。通过实际案例演示,帮助研究者掌握SPSS 28的核心功能,提升数据分析效率与报告质量。

weixin_28717431的博客 248

elf 格式分析----函数解析

https://github.com/elfmaster/libelfmaster 这里是个不错的解析elf的c代码。 寻找导出函数对应偏移 我感觉文字没有代码明白,看下别人怎么写的,立马明白了。 mem指向elf文件加载的地址连续空间。 typedef struct { unsigned char e_ident[EI_NIDENT]; /* Magic number and other i...

inquisiter 1754

LightRAG实战:5分钟快速搭建一个轻量级法律问答系统(附完整代码)

本文通过实战指南,详细介绍了如何使用LightRAG技术快速搭建一个轻量级法律问答系统。该方案通过构建扁平化实体关系网络和混合检索策略,在5分钟内即可完成从环境准备到智能问答的完整流程,并附有完整代码,为中小团队和个人开发者提供了高效、低成本的AI应用解决方案。

time3的博客 277

链接加载原理及ELF文件格式

作者简介:伟林,中年码农,从事过电信、手机、安全、芯片等行业,目前依旧从事Linux方向开发工作,个人爱好Linux相关知识分享。原理概述为什么要研究链接和加载?写一个小的main函数用户态程序,或者是一个小的内核态驱动ko,都非常简单。但是这一切都是在gcc和linux内核的封装之上,你只是实现了别人提供的一个接口,至于程序怎样启动、怎样运行、怎样实现这些机制你都一无所知。接着你会对程序出现的一...

Peter的专栏 761

一文详解心电图(ECG)监测原理

介绍心电图的监测原理,从心电信号产生、获取到心电图的基本组成

m0_50146396的博客 3286

【物联网】基于LORA组网的远程环境监测系统设计(ThingsCloud云平台版)_资料编号34

实现一主多从的LORA组网远程通信,主机和两个从机都配备了STM32F103单片机与 LoRa 模块,主机作为中心设备及WIFI网关,负责接收和发送数据到远程物联网平台和手机APP,两个从机则负责采集数据并通过各自的 LoRa组网将数据发送给主机。

嵌入式阿齐Archie 1万+

Linux ELF 详解:从定义到底层原理

ELF 是 Linux 系统底层的「二进制文件标准」,其核心价值在于统一链接和加载的接口对开发者:编译(gcc)生成.o目标文件,链接(ld)生成可执行文件 / 共享库,无需关注底层格式细节。对系统:加载器(内核)和动态链接器()通过 ELF 头部和表结构,标准化地完成程序加载和运行。理解 ELF 的结构和流程,是深入掌握 Linux 程序运行原理、动态链接、调试崩溃问题的关键基础。建议结合readelfobjdump工具实际分析一个简单的 C 程序(如hello.c编译后的a.out。

我的博客主要是用来给我自己复习的,主要是上传一些知识点,小型的项目和功能模块,如果有什么问题或错误麻烦联系我! 1087

Python爬虫实战:新浪财经股票金融数据全方位抓取教程

本教程系统介绍了新浪财经股票数据爬取技术,从静态网页解析、实时接口请求到异步爬取和数据存储,帮助你搭建了一个完整的金融数据采集流程。未来,可以结合深度学习模型进行行情预测,或者将数据接入量化交易系统,实现自动化投资。

2201_76125261的博客 2209

可执行文件(ELF)格式的理解

ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。可以说,ELF是构成众多xNIX系统的基础之一,所以作为嵌入式Linux系统乃至内核驱动程序开发人

Al_xin的专栏 1947

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiR

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM等

静谧、淡雅 2389

LLM的MCP协议:初识MCP,搭建第一个MCP Server

MCP(Model Context Protocol),是一个开发的协议,标准化了应用程序如何为大模型提供上下文。MCP提供了一个标准的为LLM提供数据、工具的方式,使用MCP会更容易的构建Agent或者是基于LLM的复杂工作流。

Criss@陈磊 2万+

C语言的本质(30)——C语言与汇编之ELF文件格式

ELF(Executable and Linking Format)文件格式是一个开放标准,各种UNIX系统的可执行文件都采用ELF格式,ELF是一种对象文件的格式,用于定义不同类型的对象文件(Object files)的内容是什么、以及都以怎样的格式去存放这些内容。它有三种不同的类型:1、  可重定位的目标文件(Relocatable)这是由汇编器汇编生成的 .o 文件。后面的链接器把一个或多个

尹成的技术博客 6213

Ubuntu 22.04+/WSL2 中解决 `error: externally-managed-environment` 并成功安装 PyTorch + vLLM 的完整指南

Ubuntu 22.04+/WSL2 因遵循 PEP 668 规范,系统 Python 被标记为“外部管理”,导致直接使用 pip install 安装包时报错 externally-managed-environment。解决方案是创建虚拟环境: 通过 python3 -m venv ~/vllm-env 创建隔离环境 激活环境后安装 PyTorch(CUDA 12.1)和 vLLM 避免使用 sudo pip 或 --break-system-packages,防止破坏系统依赖 关键点: 虚拟环

刘一说的IT专栏 296

链接原理

链接原理 (2012-04-20 00:28) 标签:  链接  目标文件  重定位 ELF  分类: linux C程序设计 1.链接器的任务 链接器将多个目标文件(可重定位目标文件)链接成一个完整的,可加载的,可执行的目标文件。 主要任务: (1)符号解析:将目标文件内的引用符号和该符号的定义联系起来 (2)将符号定义与存储器的位置联系起来,

hubi0952的专栏 837

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ELF文件及android hook原理

可执行和可链接格式(Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档、目的档、共享库和核心转储的标准文件格式。

A blog 6809

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

重定位类型分析(2)

本节分析R_386_GOTPC,R_386_GOT32,R_386_GLOB_DAT和R_386_PLT32 PIC位置无关代码,使用-fPIC参数就可以编译得到 >>>>>>>>>>>>>>>>>R_386_GOTPC 看看第一个重定位符号的重定位信息 汇编代码:        call    .L3 //.L3地址压栈.L3:      

ruixj的专栏 3618

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++编译知识笔记(二)——Linux ELF文件解析

这篇文章会以一个目标文件为实例来详细聊一下Linux下的目标文件里究竟有什么,以及它和可执行文件所用到的格式ELF(Executable Linkable Format)

wxj1992的博客 2973

ELF文件

ELF文件格式是一个开放标准,各种UNIX系统的可执行文件都采用ELF格式,它有三种不同的类型:可重定位的目标文件(Relocatable,或者Object File)可执行文件(Executable)共享库(Shared Object,或者Shared Library)共享库留到第 4 节 “共享库”再详细介绍,本节我们以例 18.2 “求

zhwfnh的专栏 3806

MT3引擎libgame.so修改实战:从ELF结构到重定位避坑指南

ELF文件格式是动态库修改的基础,其内部包含代码段、数据段和重定位表等关键结构。重定位机制在加载时修正地址,若修改位置被重定位覆盖,则修改无效甚至导致崩溃。理解这些原理能显著提升修改成功率,避免闪退。在游戏逆向、安全分析及移动端性能优化中,掌握ELF与重定位知识至关重要。本文聚焦MT3引擎的libgame.so,分享从定位到验证的完整修改流程与实战避坑经验。

weixin_29190651的博客 299

程序员的自我修养——库与链接的原理

连接原理      简介:开发大型程序的时候,往往要多人协作,编写库进行共享,从而提高效率。那么库的原理是什么?和每个源程序是如何结合在一起的?程序的装载过程是什么样的?本文主要解释了这些问题,链接的原理和库文件的编写和使用。 1.1连接器的任务 连接器将多个目标文件连接成为一个完整的、可加载的、可执行的目标文件。其输入是一组可重定位目标文件。任务如下: 符号解析:将目标文件内

河西无名式 2354
上一篇: as编写hello,world
下一篇: Linux下的bochs安装
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值