符号引用重定位 重定位PC相对引用 简单讲解
目录
- 链接符号引用重定位
- 简介
- 例子
- 重定位条目
- 简介
- offset
- type
- symbol
- addend
- 重定位PC相对引用
- 重定位PC绝对引用
链接符号引用重定位
简介
我们知道一个.c文件可以被编译为.o文件,即目标文件,而假如一个.c中引用了别的.c中的函数或者是变量,这时候的.o其实是不知道引用函数实际的内存位置的,也就无法跳转,这就需要【重定位】的操作了,而针对函数名(也是符号)的重定位
例子
我们编写两个.c文件,分别是main.c和func.c,main.c引用了func.c中的func函数
// main.c
int func(int x, int y);int main()
{int c = func(1, 2);return 0;
}
// func.c
int func(int x, int y)
{return 2*x + y;
}
我们使用gcc来编译出两个.o文件,使用如下命令将会生成main.o与func.o
gcc -c main.c func.c
然后我们对main.o与func.o
反汇编,使用如下命令可以生成main_dump.txt与func_dump.txt
的反汇编文件
objdump -d main.o > main_dump.txt
objdump -d func.o > func_dump.txt
因为main.c调用func.c而func.c并未调用其他函数,所以我们查看main.o反汇编结果,如下图蓝色区域,因为在链接之前每个.c相对是独立的,并不知道如何跳转到其他文件的函数,所以无法正确的写成跳转指令
但是我们将两个.o文件进一步编译成可执行文件,并查看其反汇编。执行以下命令做进一步的编译,将main.o和func.o链接进而生成exe可执行的二进制文件
gcc -o exe main.o func.o
如图
我们对exe反汇编,得到exe的汇编代码
objdump -d exe > exe_dump.txt
发现可以正确的跳转到func所指定的地址,这是我们想要的,也是链接中重定位所做的功劳
重定位条目
简介
----引用自《深入理解计算机系统》
但是书上讲的很抽象,而且没有例子,接下来简单解释以下这些条目中各个符号的意义
offset
因为在链接之前,每个.c相当于一个独立的部分,我们称之为【节】,而offset表明这个符号引用相对于【节】起始处的偏移(其实就是相对地址)
值得注意的是,这个offset指向的是callq指令中需要被修改的操作数,而不是callq指令本身
如图 main.c 的节
type
是何种重定位方式,因为编译的时候可以有很多种重定位方式,但是接下来只讨论书上描述的比较难懂的【重定位PC相对引用】
symbol
即这个引用指向的是哪个符号,比如main.c引用func函数那么就指向func函数
addend
在PC+偏移跳转计算实际地址时用到的计算偏移,待会会讲解
重定位PC相对引用
这里是书上讲的比较晦涩的地方,书上直接给出了公式
这个公式很难懂,但是我们可以翻译一下。仍然以main.c引用func.c为例子
符号 | 意义 |
---|---|
ADDR(s) | main节在实际的可执行文件中,位于内存的实际地址 |
ADDR(r.symbol) | func函数在实际可执行文件中,位于内存的实际地址 |
r.offset | 上文提到的offset,计算出需要修改的引用的操作数相对main节的偏移 |
r.addend | 上文提到的addend,计算实际callq语句操作数时需要用到的计算偏移 |
结合exe可执行文件的反汇编代码,我们进一步理解:
现在再来看这个公式,其中offset为0x13,根据上面offset定义推得
refaddr = ADDR(s) + r.offset
要修改的引用的实际地址 = main函数实际地址 + 要修改的引用的相对地址
0x60d = 0x5fa + 0x13
addend是由命令查看精灵 ELF readelf -r main.o
查询得的
*refptr = ADDR(r.symbol) + r.addend - refaddr
修改后的内容x = func函数实际地址 + 计算偏移 - 要修改的引用的实际地址
0xa = 0x61b + -0x4 - 0x60d注:
因为是【PC+偏移】寻址,修改后的内容x就是call的操作数
要想使跳转到func函数,就需要【PC+x = func函数实际地址】
PC + 0xa = 0x611 + 0xa = 0x61b 确实是func函数的地址,达到效果
注:此处r.addend=-4,是因为要修改的操作数地址(refaddr)和该操作数所在指令的下一条指令地址(即PC)相差4字节。因为操作数是4字节的,填充操作数之后,才是下一条指令的地址(PC),所以做差之后,要补偿操作数占用的4字节地址回去。
换句话说,call的操作数有 x 字节,r.addend的就等于 -x
可以看到编译后的结果,也就是链接的时候修改后的结果,确实是0xa(小端表示牢记于心)
附:图解,以main函数调用sum函数为例
现在再看书上的公式是否变简单了?
重定位PC绝对引用
这个简单,没有那么多做差和偏移,直接将实际的func函数的地址赋值给操作数,但是一般用于外部变量数据的引用中
符号引用重定位 重定位PC相对引用 简单讲解相关推荐
- 重定位——重定位的简介与操作(涉及位置无关码)
以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除. 参考博客:位置无关码.位置有关码 - biaohc - 博客园 一.链接地址与运行地址 1.链接地址 链接地址,是指程序员通过Makef ...
- 交叉引用跳转不到后面_参考文献的作用与正确引用避免查重
一.参考文献的作用 引文也叫参考文献,是指为撰写或编辑论著而引用或参考有关文献资料的著录,通常附在论文.图书章节之后,有时也以注释(附注或脚注)形式出现在正文中.引文是学术论著的重要组成部分,它表明文 ...
- 《魔兽3:重制版》 发布PC/Mac最低配置需求
<魔兽3:重制版>发布PC/Mac最低配置需求 上周的暴雪嘉年华上,<魔兽争霸3>正式宣布重制,计划2019年发售,标准版29.99美元,豪华版39.99美元.与此同时,暴雪公 ...
- 论文查重时封面、目录、引用会检测吗?
在目前,高校中论文查重的结果已经成为了毕业论文写作的主要依据,学校更有规定要求,要求毕业论文的相似率在百分之多以以内不能超过这个规定的相似率范围的,否则就别是为是抄袭行为,面对学校的各种苛刻要求,对于 ...
- 【资料补充】元素定位和定位辅助工具
Web页面组成-代码 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...
- 元素定位和定位辅助工具
Web页面组成-代码 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...
- Selenium WebDriver元素定位方式+定位失败原因总结
引包部分 from selenium.webdriver.chrome.webdriver import WebDriver#谷歌浏览器为例 from selenium.webdriver.commo ...
- html中的定位及其定位方式
一.定位(position) - 定位指的就是将指定的元素摆放到页面的任意位置 通过定位可以任意的摆放元素 - 通过position属性来设置元素的定位 -可选值: static:默认值,元素没有开启 ...
- 蓝牙5.1定位--蓝牙定位信标--新导智能
蓝牙历经点对点音频传输运用,BLE 智能穿戴设备运用;Mesh智能家居运用;在昨日宣布正式进入准确认位商场范畴.依据行业观察,蓝牙定位服务的商场时机在过去几年中迅速增长,到2022年蓝牙定位解决计划产 ...
最新文章
- 棋盘格氧化铝标定板漫反射不反光12*9方格视觉光学校正板
- 2018年WiFi、5G和蓝牙的发展以及与VR/AR的联系
- ibm刀片服务器显示器切换,IBM X240 刀片 怎么连上显示屏呢
- [云炬创业学笔记]第一章创业是什么测试15
- LiveVideoStackCon 2019北京你来吗?
- fastreport 打印两个list_Smaller And Smarter Python数据结构:合并两个有序链表
- 电商美工需要的优质PSD素材,减少设计师75%办公加班时间
- 宜昌方言RAP 说唱 《在宜昌》
- 杭电计算机2016年机试真题详解
- php mysql过滤特殊字符_php特殊字符过滤,html标签处理
- 新型超级生物计算机简介,自然形成的超级生物计算机
- Kafka从上手到实践 - 庖丁解牛:Consumer | 凌云时刻
- jsp网上零食销售网站系统
- 信奥中的数学:进位制
- 揭秘如何搭建梦幻西游社交框架
- spring retry, guava retrying 的整合-sisyphus java 重试
- 手把手教你如何PCB板材选型(二)
- 习题6-1 平衡的括号(Parentheses Balence,UVa 673)
- 垂直居中对齐四种样式
- OPPO Watch 2五大亮点加持 定位旗舰全智能手表