elf 格式 relocation 概念


author: hjjdebug
date: 2026年 01月 08日 星期四 15:12:21 CST
descrip: elf 格式 relocation 概念


文章目录

  • 1. 查看test 的重定位信息
  • 2. .rela.dyn 区与 .rela.plt 区的区别和联系
  • 3 概括动态绑定的过程
  • 4. 介绍 .rela 结构
  • 5. r_info 的type 有多少种?
  • 6. 补充: 节区表

关于符号的概念,请参考链接:
计算机中符号是什么意思

elf 文件仍然采用链接中hello-world 产生的文件 test

1. 查看test 的重定位信息

$ readelf -r test

重定位节 ‘.rela.dyn’ at offset 0x380 contains 2 entries:
偏移量 信息 类型 符号值 符号名称 + 加数
000000600ff0 000200000006 R_X86_64_GLOB_DAT 0000000000000000 __libc_start_main@GLIBC_2.2.5 + 0
000000600ff8 000300000006 R_X86_64_GLOB_DAT 0000000000000000gmon_start+ 0

重定位节 ‘.rela.plt’ at offset 0x3b0 contains 1 entry:
偏移量 信息 类型 符号值 符号名称 + 加数
000000601018 000100000007 R_X86_64_JUMP_SLO 0000000000000000 puts@GLIBC_2.2.5 + 0

2. .rela.dyn 区与 .rela.plt 区的区别和联系

.rela.dyn 和 .rela.plt 是ELF文件格式中用于动态链接的重定位节,
相同点:
从结构上看, .rela.dyn 和 .rela.plt 的重定位条目结构相同(均基于ELF64_Rela或ELF32_Rela),
RELA结构(包含Addend字段),但用途和处理对象有明确区别。

不同点:前者关联动态符号表(.dynsym节)中的数据符号,后者关联动态符号表(.dynsym节)中的函数符号。

.rela.dyn 处理数据符号(如全局变量、静态变量等)的重定位,其重定位目标通常位于.got节中;
.rela.plt 处理函数符号的重定位,目标位于.got.plt节中。
这种分工源于动态链接机制不同:数据引用和函数调用需要不同的绑定策略。

.rela.dyn 通常在程序加载时完成重定位,用于修正数据符号的地址;
.rela.plt 支持延迟绑定(Lazy Binding),即函数重定位在首次调用时才完成,通过.plt节(过程链接表)和.got.plt节协作实现,以提升程序启动效率。
具体延迟绑定细节可以参考以下链接
elf 文件动态加载过程

3 概括动态绑定的过程

这里概括一下, 外部printf函数由于其只调用了字符串太简单被简化为puts 函数调用. 这部分会形成一小段调用代码位于plt.sec 节中
为 jmp (*addr), 从指定的地址中取出目标地址, 到那个地址中去执行
这部分 plt.sec 是代码区, 是不能改的. 可改的是addr 处存储的地址.
那个地址是函数实际的入口地址, 但第一次调用时还不是,第一次调用存储的是地址解析函数调用地址.
其中 addr 所处的那个节叫 .got.plt, 就是说它将来存储实际函数入口地址,第一次存储地址解析函数地址. 是可更改的.

地址解析函数地址所处的节叫plt 节, 也是代码节,不可更改. 它的代码是这样的.
push 0
jmpq resolve
第二个函数调用则是
push 1
jmpq resolve
resolve地址解析函数很厉害, 它根据槽位号能找到外部绑定的函数名,并能确定外部函数地址,并将结果存储到.got.plt对应位置处.
解析一次,以后就不会跳到这里了,而是直接跳转到真实地址去了.

4. 介绍 .rela 结构

首先, 重定位是对符号的重定位, 所以被重定位的符号名称是一项内容.
被重定位的符号值, 肯定都是0. 不知道为什么要定义它
类型. 是外部变量还是外部函数等.
偏移量. 是说明在内存的什么地址来修改, 把原来的0改为解析到的地址.
信息. 就是其它的属性信息.
有了这些基础,我们再看elf64.h 中的结构定义
结构很简单,三个变量. 都是8bytes 数据
typedef struct
{
Elf64_Addr r_offset; /* Address/
Elf64_Xword r_info; /
Relocation type and symbol index/
Elf64_Sxword r_addend; /
Addend */
} Elf64_Rela;

typedef uint64_t Elf64_Addr;
typedef uint64_t Elf64_Xword;
typedef int64_t Elf64_Sxword;

r_offset指示需要修改的地址
r_info的高32位指向符号表索引,低32位指定重定位类型
符号值 + r_addend得到最终地址
r_addend 一般是0, 不是0的情况以后碰到再给实例吧.

5. r_info 的type 有多少种?

switch(ELF64_R_TYPE(r_info)) { case 1: return "R_X86_64_32"; case 2: return "R_X86_64_PC32"; case 5: return "R_X86_64_COPY"; case 6: return "R_X86_64_GLOB_DAT"; case 7: return "R_X86_64_JUMP_SLOT"; default: return "OTHERS";

6. 补充: 节区表

想看看前边提到的重定位地址 0x600ff0, 0x600ff8, 0x601018属于哪个节区,
可以打出节表, 如下. 即知:
0x600ff0,0x600ff8 属于 .got 区
0x601018 属于 属于 .got.plt 区

$ readelf-S test There are34section headers,starting at offset0x2120:节头:[]名称 类型 地址 偏移量 大小 全体大小 旗标 链接 信息 对齐[0]NULL00000000000000000000000000000000000000000000000000000000000[1].interp PROGBITS000000000040023800000238000000000000001c0000000000000000A001[2].note.ABI-tag NOTE00000000004002540000025400000000000000200000000000000000A004[3].note.gnu.build-i NOTE00000000004002740000027400000000000000240000000000000000A004[4].gnu.hash GNU_HASH000000000040029800000298000000000000001c0000000000000000A508[5].dynsym DYNSYM00000000004002b8000002b800000000000000600000000000000018A618[6].dynstr STRTAB000000000040031800000318000000000000003d0000000000000000A001[7].gnu.version VERSYM00000000004003560000035600000000000000080000000000000002A502[8].gnu.version_r VERNEED00000000004003600000036000000000000000200000000000000000A618[9].rela.dyn RELA00000000004003800000038000000000000000300000000000000018A508[10].rela.plt RELA00000000004003b0000003b000000000000000180000000000000018AI5228[11].init PROGBITS00000000004003c8000003c800000000000000170000000000000000AX004[12].plt PROGBITS00000000004003e0000003e000000000000000200000000000000010AX0016[13].text PROGBITS00000000004004000000040000000000000001720000000000000000AX0016[14].fini PROGBITS00000000004005740000057400000000000000090000000000000000AX004[15].rodata PROGBITS000000000040058000000580000000000000000a0000000000000000A004[16].eh_frame_hdr PROGBITS000000000040058c0000058c000000000000003c0000000000000000A004[17].eh_frame PROGBITS00000000004005c8000005c800000000000001000000000000000000A008[18].init_array INIT_ARRAY0000000000600e1000000e1000000000000000080000000000000008WA008[19].fini_array FINI_ARRAY0000000000600e1800000e1800000000000000080000000000000008WA008[20].dynamic DYNAMIC0000000000600e2000000e2000000000000001d00000000000000010WA608[21].got PROGBITS0000000000600ff000000ff000000000000000100000000000000008WA008[22].got.plt PROGBITS00000000006010000000100000000000000000200000000000000008WA008[23].data PROGBITS00000000006010200000102000000000000000100000000000000000WA008[24].bss NOBITS00000000006010300000103000000000000000080000000000000000WA001[25].comment PROGBITS00000000000000000000103000000000000000290000000000000001MS001[26].debug_aranges PROGBITS00000000000000000000105900000000000000300000000000000000001[27].debug_info PROGBITS000000000000000000001089000000000000031d0000000000000000001[28].debug_abbrev PROGBITS0000000000000000000013a600000000000000e00000000000000000001[29].debug_line PROGBITS00000000000000000000148600000000000000d10000000000000000001[30].debug_str PROGBITS00000000000000000000155700000000000002840000000000000001MS001[31].symtab SYMTAB0000000000000000000017e00000000000000630000000000000001832488[32].strtab STRTAB000000000000000000001e1000000000000001c80000000000000000001[33].shstrtab STRTAB000000000000000000001fd800000000000001430000000000000000001Key to Flags:W(write),A(alloc),X(execute),M(merge),S(strings),I(info),L(link order),O(extra OS processing required),G(group),T(TLS),C(compressed),x(unknown),o(OS specific),E(exclude),l(large),p(processor specific)

参考代码: https://gitee.com/hejinjing/elf-parser.git

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

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

相关文章

给wordpress网站的图片加alt标签

给wordpress网站的图片加alt标签的几种方法&#xff0c;在实际应用中可以根据自己的需求&#xff0c;调用最适合自己的。 直接输出文章标题(和原来一样&#xff0c;仅作占位&#xff0c;无特殊处理) alt"<?php echo esc_attr( get_the_title() ); ?>" 取“…

计算机深度学习毕设实战-基于python-CNN卷积神经网络对盆栽识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

计算机三级-嵌入式组-考点汇总-嵌入式系统软件

四、嵌入式系统软件1.硬件抽象层与板级支持包1-1. 硬件抽象层硬件抽象层(HAL)是在操作系统层与硬件之间设置的独立的接口软件层&#xff0c;是所有直接依赖于硬件的软件。对硬件进行抽象&#xff0c;使上层软件开发人员无须关心底层硬件的具体细节和差异&#xff0c;支持上层软…

【实战案例】火语言RPA获取下拉联想推荐词

一、案例概述 本案例基于火语言 RPA 可视化流程&#xff0c;实现淘宝首页搜索框下拉联想词的自动抓取&#xff0c;并将结果保存至本地文本文件。适用于快速适配各类带下拉联想词的网页场景。 二、实现逻辑 1、启动内置浏览器并访问淘宝首页&#xff1b; 2、处理页面登录弹窗&…

2026 年用什么 CMS 做网站更合适?一些实际对比思考

这几年做网站越来越明显的一个变化是&#xff1a; 建站本身已经不是难点&#xff0c;持续获取搜索流量才是核心问题。 到了 2026 年&#xff0c;选择 CMS 时&#xff0c;单纯“好不好用”已经不够了&#xff0c;更重要的是它是否有利于长期 SEO、内容规模化、以及多站点管理。…

【行业深度】2025中国酒店业法务数字化转型洞察报告:大型集团如何破解“规模负重”难题?

研究领域&#xff1a; 企业合规/法律科技/酒店管理核心案例&#xff1a; 某Top级连锁酒店集团 律杏法务云01. 核心摘要 (Executive Summary)在酒店行业加速连锁化、品牌多元化的今天&#xff0c;大型集团正面临“规模不经济”的法务治理陷阱。随着门店突破千家、万家&#xff…

华为OD技术面真题 - 计算机网络 - 2

文章目录介绍一下TCP和UDPTCPUDP什么时候选择UDP&#xff0c;什么时候选择TCP&#xff1f;TCP连接为什么要三次握手TCP为什么挥手为什么要分为四步基于TCP和UDP常见协议使用UDP传输数据的系统一定不可靠吗&#xff1f;TCP是如何保证可靠传输介绍一下TCP和UDP TCP TCP(Transmi…

计算机中的符号是什么意思?

author: hjjdebug date: 2026年 01月 08日 星期四 12:45:41 CST descrip: 计算机中的符号是什么意思? 文章目录 甲. 什么叫符号?0 下面是测试代码1 用 $ nm test 可列出其所有符号,非常简明2. 用 $ readelf -s test 有对符号更细致的描述.3. 用 $ readelf --dyn-syms test 会…

深度学习毕设选题推荐:基于python-CNN卷积神经网络对盆栽识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

导师严选8个AI论文写作软件,专科生搞定毕业论文+格式规范!

导师严选8个AI论文写作软件&#xff0c;专科生搞定毕业论文格式规范&#xff01; AI 工具助力论文写作&#xff0c;专科生也能轻松应对 在当今学术写作领域&#xff0c;AI 工具正逐步成为学生和科研工作者的得力助手。尤其是对于专科生而言&#xff0c;面对毕业论文的撰写压力&…

导师推荐9个一键生成论文工具,自考本科生轻松搞定毕业论文!

导师推荐9个一键生成论文工具&#xff0c;自考本科生轻松搞定毕业论文&#xff01; AI 工具助力论文写作&#xff0c;自考学生不再焦虑 在当前的学术环境中&#xff0c;越来越多的自考本科生开始借助 AI 工具来辅助完成毕业论文。这些工具不仅能够有效降低 AIGC 率&#xff0c;…

两句话理解 ElasticSearch 搜索引擎数据库的作用

一个有两千万商品的商品表&#xff0c;如何提高根据商品名关键字检索商品的效率&#xff0c;搜索引擎数据库 ElasticSearch 一、个人理解 在 MySQL 数据库中有一个商品表&#xff0c;表中有 2 千万个商品数据&#xff0c;现在要根据商品名称关键字&#xff0c;去查找相关的商品…

程序员必看:Docker+Dify+DeepSeek本地部署大模型+知识库完整教程(含实操,建议收藏)

本文详细介绍了如何使用Docker、Dify和DeepSeek搭建本地大模型系统。通过安装Docker环境&#xff0c;部署Dify平台&#xff0c;配置DeepSeek和bge-large模型&#xff0c;上传私有知识库&#xff0c;最终创建个性化AI助手。这种本地部署方式能让大模型学习个人专业知识&#xff…

SnapShot硬盘备份软件:一款小巧强大的德国军工级数据备份方案

在系统维护、数据迁移和灾难恢复场景中&#xff0c;一款可靠、快速的备份工具至关重要。与Acronis True Image、Ghost等大型商业软件不同&#xff0c;Drive SnapShot​ 以其“小而美”的设计哲学脱颖而出。它用极小的体积实现了专业级备份软件的核心功能&#xff0c;尤其适合技…

【干货收藏】RAG调优完整指南:从基础到GraphRAG,提升大模型回答准确率

文章详解RAG系统调优方法&#xff0c;包括知识库优化&#xff08;检索优化、知识沉淀、健康度检查&#xff09;、高级召回排序技术&#xff08;混合检索、重排序、查询扩展&#xff09;及GraphRAG解决复杂查询。提出三阶段进阶路径&#xff1a;起步期优化分词和混合检索&#x…

mysql的分区表

1.SQL表创建 下面以时间范围进行创建&#xff08;每月一个分区&#xff0c;表中创建了四个月的分区&#xff09; 创建&#xff1a;CREATE TABLE test_table ( id INT NOT NULL AUTO_INCREMENT, content VARCHAR(255), create_time DATETIME NOT NULL,PRIMARY KEY (id, creat…

保姆级教程:使用Dify搭建知识库+Ollama部署本地模型,零基础也能轻松上手!

本文详细介绍了两大步骤&#xff1a;首先讲解如何安装配置Dify并调整文件上传限制&#xff1b;其次指导使用Ollama部署本地模型&#xff0c;包括安装配置、监听设置及模型名称获取。通过本教程&#xff0c;读者可掌握搭建个人知识库和本地AI服务的完整流程&#xff0c;适合想要…

最新APP导航下载页系统源码 带后台

非常好看的一款App导航推荐页源码&#xff0c;带后台&#xff0c;这是一款PHP源码&#xff0c;Thinkphp框架&#xff0c;这款源码安装非常便捷干净&#xff0c;后台添加应用及轮播广告也非常方便&#xff0c;网站自适应PC手机自适应&#xff0c;喜欢的自行部署吧&#xff01;安…

AI产品经理进阶指南+大模型全栈学习路线:104G资源包助你从零到实战

文章详解AI产品经理与通用产品经理的区别、必备技能及转型路径&#xff0c;并系统介绍大模型七大学习阶段&#xff0c;从系统设计到行业应用实战。同时提供100套AI商业化方案、全套视频教程和200本PDF书籍等资源&#xff0c;帮助程序员和小白系统掌握大模型技术&#xff0c;实现…