动态链接器(十):重定位
ELF文件中有许多种类型的重定位条目,这些重定位条目指导动态链接器在加载或运行时解析符号地址,确保程序能够正确地引用动态库中的函数和变量。
本文主要介绍那些与动态链接有关的重定位条目(主要介绍Rela相关的,Rel相关的不作介绍,且主要针对64位CPU架构)
1 重定位条目的结构
ELF文件中重定位条目的结构如下:
64位ELF文件:
#[repr(C)]
pub struct Elf64_Rela {pub r_offset: u64,pub r_info: u64,pub r_addend: i64,
}
32位ELF文件:
#[repr(C)]
pub struct Elf32_Rela {pub r_offset: u32,pub r_info: u32,pub r_addend: i32,
}
1.1 r_offset
表示需要被修正的目标地址相对于所在动态库的基地址(后文中会使用base来表示基地址)的偏移量,通常指向GOT中的某个条目。
若动态链接器发现一个 R_X86_64_JUMP_SLOT 类型的重定位条目,r_offset 会指向 GOT 中某个需要填充函数地址的位置。
PS:动态库的基地址是指动态库被实际加载的内存起始地址。
1.2 r_info
这里面包含着两个信息:
-
重定位类型(低 32 位):表示当前重定位的类型。例如: R_X86_64_JUMP_SLOT:动态函数跳转(PLT 条目)。
-
符号索引(高 32 位):表示该重定位关联的符号在符号表(.dynsym)中的索引。若符号索引为 0(比如 R_*_RELATIVE类型的重定位条目中符号索引就是0),表示无需符号解析,直接使用基地址和 r_addend 计算。
1.3 r_addend
提供附加的偏移量,用于某些重定位类型的地址计算。动态链接器在计算最终地址时,会将符号值(符号地址)与 r_addend 相加,对于某些重定位类型(如 R_*_RELATIVE),r_addend 直接参与基地址偏移计算。
2 重定位的种类
本节中base表示动态库的基地址,addr表示符号的地址。你可以使用readelf -r来查看动态库中的重定位类型。

PS:本节中的重定位类型并不完整,还有一些与线程局部存储(tls)相关的重定位类型,我打算之后专门写一篇介绍ELF线程局部存储的文章,然后在那篇文章中介绍它们。
2.1 R_*_GLOB_DAT
用途:用于全局变量或函数的重定位。当可执行文件或共享库引用其他共享库中的全局变量时,动态链接器通过此条目将GOT(Global Offset Table)中的对应项更新为变量的实际地址。
处理方式:动态链接器直接将符号地址(addr)写入r_offset+base处,后续访问通过GOT间接寻址。
*(r_offset + base) = addr
示例:
-
x86_64: R_X86_64_GLOB_DAT
-
aarch64: R_AARCH64_GLOB_DAT
PS:不过不是所有指令集都有这个类型的重定位条目,比如riscv64和loongarch64就没有这个。
2.2 R_*_JUMP_SLOT
用途:用于函数调用的延迟绑定(Lazy Binding)。当程序调用共享库中的函数时,首次调用会触发动态链接器解析函数地址并更新GOT中的跳转槽。
处理:与该条目相关的详细内容可以看:
动态链接器(七):深入理解PLT和GOT_plt got-CSDN博客
https://blog.csdn.net/justdoyaya/article/details/145717000?spm=1001.2014.3001.5501
延迟绑定时:*(r_offset + base) = *(r_offset + base) + base
非延迟绑定时:*(r_offset + base) = addr
示例:
-
x86_64: R_X86_64_JUMP_SLOT
-
riscv64: R_RISCV_JUMP_SLOT
2.3 R_*_RELATIVE
用途:处理地址无关代码(PIC)中的绝对地址重定位。共享库中可能包含需要基于加载地址(基地址)调整的绝对地址。
处理:动态链接器将重定位地址计算为 基地址 + 偏移量,无需符号查找。
*(r_offset + base) = base + r_addend
示例:
-
riscv64: R_RISCV_RELATIVE
-
x86_64: R_X86_64_RELATIVE
2.4 R_*_COPY
用途:处理可执行文件与共享库中重复定义的全局符号。当可执行文件定义了一个全局符号(如变量),而共享库也引用了同名符号时,动态链接器将共享库的引用指向可执行文件中的副本。
处理:动态链接器将符号从可执行文件拷贝到共享库的指定地址。
memcpy(base + r_offset, addr, addr_size)
PS:addr_size指的是符号的大小(比如符号是函数的话就是整个函数的大小)。这种类型的重定位很少见到,我到现在也就见到过几次。
2.5 R_*_IRELATIVE
用途:处理IFUNC(间接函数)的重定位。IFUNC允许在运行时选择最优的函数实现(如根据CPU特性选择memcpy版本)。
处理:动态链接器调用预定义的解析函数,获取实际函数地址并填充到GOT。
*(r_offset + base) = (base + addr)()
示例:
-
x86_64: R_X86_64_IRELATIVE
-
riscv64: R_RISCV_IRELATIVE
PS:这里的 (base + addr)()指的是将base+addr所指的地址当作一个不传任何参数的函数指针来使用。使用glibc的程序有时会有这种类型的重定位,使用musl的程序不会出现这种类型的重定位。
2.6 R_*_64
这种类型的重定位与R_*_GLOB_DAT功能类似,不过在处理时有所差别,它会在符号地址的基础上加上r_addend。
*(r_offset + base) = addr + r_addend
示例:
-
x86_64: R_X86_64_64
-
riscv64: R_RISCV_64
3 具体实现
本文所讲的这些重定位类型的处理方式在elf_loader中均有实现:
elf_loader:一个使用Rust编写的ELF加载器-CSDN博客
https://blog.csdn.net/justdoyaya/article/details/145766162?spm=1001.2014.3001.5501具体实现可以看下面这个链接中的代码:
rust_elfloader/src/relocation.rs at main · weizhiao/rust_elfloader
https://github.com/weizhiao/rust_elfloader/blob/main/src/relocation.rs想了解不同指令集中的重定位类型可以看这里:
rust_elfloader/src/arch at main · weizhiao/rust_elfloader
https://github.com/weizhiao/rust_elfloader/tree/main/src/arch
相关文章:
动态链接器(十):重定位
ELF文件中有许多种类型的重定位条目,这些重定位条目指导动态链接器在加载或运行时解析符号地址,确保程序能够正确地引用动态库中的函数和变量。 本文主要介绍那些与动态链接有关的重定位条目(主要介绍Rela相关的,Rel相关的不作介…...
EGO-Planner的无人机视觉选择(yolov5和yolov8)
EGO-Planner的无人机视觉选择(yolov5和yolov8) 效果 yolov5检测效果 yolov8检测效果 一、YOLOv8 vs YOLOv5:关键差异解析 1. 训练效率:为何YOLOv8更快? 架构轻量化 YOLOv8采用C2f模块(Cross Stage Partia…...
IO标准函数和时间函数
1、将当前的时间写入到time. txt的文件中,如果ctrlc退出之后,在再次执行支持断点续写 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止,再次执行程序 4.2022-04-26 20:00:00 5.2022-04-26 20:00:0…...
为AI聊天工具添加一个知识系统 之133 详细设计之74通用编程语言 之4 架构及其核心
本篇继续讨论 通用编程语言。 说明:本阶段的所有讨论都是围绕这一主题展开的,但前面的讨论分成了三个大部分(后面列出了这一段的讨论题目的归属关系)-区别distinguish(各别): 文化和习俗。知识…...
【零基础到精通Java合集】第二十三集:G1收集器深度解析
课程标题:G1收集器深度解析——面向大内存与低延迟的现代垃圾回收器(15分钟) 目标:掌握G1核心设计思想、运行机制与调优策略,理解其如何平衡吞吐量与低延迟 0-1分钟:课程引入与G1设计目标 以“城市交通智能调度”类比G1核心思想:将堆内存划分为多个区域(Region),动…...
似然函数与极大似然估计
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 📚 1. 似然函数&a…...
QSFP(Quad Small Form-factor Pluggable)详解
1. QSFP的定义 QSFP(Quad Small Form-factor Pluggable)是一种四通道热插拔光模块/电模块,专为高速网络传输设计。其名称中的“Quad”表示模块集成4个独立通道,每个通道支持1Gbps至10Gbps速率(总带宽可达40Gbps&#…...
WDM_OTN_基础知识_波分系统基本构成-无源器件
在波分系统中通常将发光,对光进行放大以及产生光电转换的器件称之为有源器件,例如光放,激光器,与此相反,将那些不发光,不对光进行放大,也不产生光电转换的器件称之为无源器件,波分系统中的无源器…...
【音视频】ffmpeg音视频处理基本流程
一、ffmpeg音视频处理基本流程 首先先看两条命令 ffmpeg -i 1.mp4 -acodec copy -vcodec libx264 -s 1280x720 2.flv ffmpeg -i 1.mp4 -acodec copy -vcodec libx265 -s 1280x720 3.mkv-i :表示输入源,这里是1.mp4,是当前路径下的视频文件-acodec copy…...
【网络编程】之TCP实现客户端远程控制服务器端及断线重连
【网络编程】之TCP实现客户端远程控制服务器端及断线重连 TCP网络通信实现客户端简单远程控制主机基本功能演示通信过程代码实现服务器模块执行命令模块popen系列函数 客户端模块服务器主程序 windows作为客户端与服务器通信#pragma comment介绍 客户端使用状态机断线重连代码实…...
云原生容器编排:构建智能弹性应用的自动化引擎
引言:重构应用部署范式 Google Borg系统管理着超2500万容器实例,每日处理200亿个任务。阿里巴巴双十一使用Kubernetes实现300万Pod秒级弹性,资源利用率达65%。CNCF 2023报告显示全球Kubernetes生产采用率突破92%,CRI-O容器启动速…...
centos虚拟机安装
以下是一个详细的 VMware CentOS 虚拟机安装教程,结合了最新的信息和步骤: 一、准备工作 1. 下载 VMware 软件 访问 VMware 官方网站:VMware Workstation 官网。点击“现在安装”并下载适合您操作系统的 VMware Workstation。 2. 下载 Ce…...
社会力模型:Social force model for pedestrian dynamics
Social Force Model——社会力模型-CSDN博客 简介: 时间:1995 期刊:《Physical Review E》 作者:Dirk Helbing and Peter Molnar 摘要: 提出一种描述行人运动的“社会力模型”。认为行人的运动可看作是受到一系列…...
机器学习数学通关指南
✨ 写在前面 💡 在代码的世界里沉浸了十余载,我一直自诩逻辑思维敏捷,编程能力不俗。然而,当我初次接触 DeepSeek-R1 并领略其清晰、系统的思考过程时,我不禁为之震撼。那一刻,我深刻意识到:在A…...
【Mac】2025-MacOS系统下常用的开发环境配置
早期版本的一个环境搭建参考 1、brew Mac自带终端运行: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" Installation successful!成功后运行三行命令后更新环境(xxx是mac的username&a…...
# C# 中堆(Heap)与栈(Stack)的区别
在 C# 中,堆和栈是两种不同的内存分配机制,它们在存储位置、生命周期、性能和用途上存在显著差异。理解堆和栈的区别对于优化代码性能和内存管理至关重要。 1. 栈(Stack) 1.1 定义 栈是一种后进先出(LIFO࿰…...
ubuntu离线安装nvidia-container-runtime
参考文章 ubuntu系统docker20.4版本安装nvidia-container-runtime3.11.0-1版本(离线安装nvidia-docker) - jokerMM - 博客园 https://zhuanlan.zhihu.com/p/15194336245 一、软件地址 Index of /nvidia-docker/libnvidia-container/stable/ 从上述地地址——进入对应系统—…...
用Python+Flask打造可视化武侠人物关系图生成器:从零到一的实战全记录
用PythonFlask打造可视化武侠人物关系图生成器:从零到一的实战全记录 一、缘起:一个程序小白的奇妙探索之旅 作为一个接触Python仅13天的编程萌新,我曾以为开发一个完整的应用是遥不可及的事情。但在DeepSeek的帮助下,我竟用短短…...
学习笔记-DeepSeek在开源第四天发布DualPipe和EPLB两项技术
在AI模型训练的进程中,优化并行策略对于提升训练效率和资源利用率至关重要。DeepSeek在开源周第四天发布的DualPipe和EPLB两项技术,为V3/R1训练场景下的并行优化提供了创新解决方案。 DualPipe:双向管道并行算法 技术原理: Dua…...
C++入门基础知识1
今天,我们正式来学习C,由于C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C学习有一定的帮助。 现在我们这篇主要是: 1. 补充C语言语法…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
