动态链接下,无论时可执行文件还是共享对象,一旦对其他共享对象有依赖,也就是所有导入的符号时,那么代码或数据中就会有对于导入符号的引用。而在编译时期这些导入符号的确切地址时未知的。只有在运行期才能确定真正确切的地址
静态编译下,这些未知的地址会被编译器一一修正。
对于动态链接来说,共享文件有两种编译方式(gcc -shared 和 gcc -fPIC -shared)
如果不使用PIC模式编译,那么装载时肯定是要重定位的,而且时每个进程都有一个副本(相对比较占用内存)
如果使用PIC模式编译,将会在编译期生成地址无关代码(PIC Position-Independent Code),则代码段可以实现多程序共享,而仅数据段部分会在每个程序中有一个副本(节省内存)
对于这两种模式来说都是要重定位的,当相对PIC模式编译的模块仅需要对数据段进行重定位(因为代码段中的绝对地址引用部分被分离到了GOT中,而GOT是数据段的一部分;数据段中也可能包含绝对地址的引用,正好重定位数据段)
静态链接中,目标文件里面包含有用于重定位的表:代码段重定位表“.rel.text”;数据段重定位表“.rel.data”。
动态链接中,目标文件的重定位表:“.rel.dyn”对数据引用的修正,修正的位置位于“.got”和数据段;“.rel.plt”对函数引用的修正,修正位置位于“.got.plt”。
可以通过readelf 查看一个动态链接文件的重定位表
readelf -r XXX.so
这里可以看到几种重定位入口类型:
R_386_RELATIVE R_386_GLOB_DAT 和 R_386_JUMP_SLOT
R_386_GLOB_DAT(.rel.dyn中针对.got) 和 R_386_JUMP_SLOT(.rel.plt中针对.got.plt)表示被修正的位置只需要直接将符号的地址填入。
而在重定位表中的列Offset 表明了当前符号在“.got" 或“.got.plt”中的偏移,可以根据该值在两个GOT表中寻找对应的位置,填入(连接器在全局符号表中查找)真实的外部符号地址。
R_386_RELATIVE 是基址重置。有些共享对象的数据段是无法做到地址无关的,比如:
static int a;
static int *p = &a;
由于共享对象编译时,基址是从0开始的,所以a的地址(在未重定位时)是相对与起始地址0的偏移(假设为B),则此时p的值为B;
而当共享对象装载到指定进程中的地址C时,则变量a的地址将编程B+C,即p的值需要加上装载的地址B。
R_386_RELATIVE 类型就是专门用来重定位指针变量p这种类型的。
ELF 动态链接 - so 的 重定位表的更多相关文章
-
ELF动态链接
为什么要使用动态链接? 在现代的linux系统中,假设一个普通的程序会使用到c语言静态库至少1MB以上,那么,如果我们的机器运行100个这样的程序,就用浪费近100MB的内存:如果磁盘有2000个这样 ...
-
ELF 动态链接 - so 的 .dynamic 段
动态链接文件中最重要的段就是 .dynamic段 这个段里保存了动态链接器需要的最基本的信息 比如:1. 依赖于哪些共享对象, d_tag = DT_NEED, d_ptr 表示共享对象文件名 2 ...
-
Reverse Core 第二部分 - 16&;17章 - 基址重定位表&;.reloc节区
第16-17章 - 基址重定位表&.reloc节区 @date: 2016/11/31 @author: dlive 0x00 前言 这几天忙着挖邮箱漏洞,吃火锅,马上要被关禁闭,看书进度比较 ...
-
PE格式第七讲,重定位表
PE格式第七讲,重定位表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首先, ...
-
PE文件 03 重定位表
0x01 重定位表结构 重定位表是由数据目录表中的第六个成员指出的: typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; D ...
-
基址重定位表&;.reloc节区
第16-17章 - 基址重定位表&.reloc节区 @date: 2016/11/31 @author: dlive 0x01 PE重定位 若加载的是DLL.SYS文件,且在ImageBase ...
-
逆向-PE重定位表
重定位表 当链接器生成一个PE文件时,会假设这个文件在执行时被装载到默认的基地址处(基地址+RVA就是VA).并把code和data的相关地址写入PE文件.如果像EXE一样首先加载就是它image ...
-
PE结构之重定位表
什么是重定位: 重定位就是你本来这个程序理论上要占据这个地址,但是由于某种原因,这个地址现在不能让你占用,你必须转移到别的地址,这就需要基址重定位.你可能会问,不是说过每个进程都有自己独立的虚拟地址空 ...
-
PE知识复习之PE的重定位表
PE知识复习之PE的重定位表 一丶何为重定位 重定位的意思就是修正偏移的意思. 如一个地址位 0x401234 ,Imagebase = 0x400000 . 那么RVA就是 1234. 如果Im ...
随机推荐
-
luogu2038[NOIP2014 T4]无线网络发射器选址
题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...
-
word-wrap,word-break和white-space总结
最近网页布局中遇到得比较多,所以打算总结总结. word-wrap: 1.normal(使用浏览器默认的换行规则) 2.break-word(内容将在边界内换行,但是英文换行会按词断句) word-b ...
-
x:Name标记特性与Name属性
本文转载自silvergingko的专栏 在Xaml中定义了一个元素后,如果后面要使用该元素,则必须为该元素定义一个元素名称,在随后的Xaml中,通过元素名称来使用该元素. 在Xaml中,元素的名称定 ...
-
KMP--路过
HDU 1358:弄清楚了NEXT,就好解决,还有不要再循环中用strlen;会超 ----------------------我是凑字数的------------------还是不会KMP----- ...
-
做一个完整的纯react-naitve安卓应用【从环境安装到应用发布】
前提:从来没有写过android 跟 ios 应用,是一个小前端.前一段时间玩了一下 react-native 感觉还不错,应用代码还未开源. 环境: win7 成果: ...
-
计算生日是星期几-soj
编写一个程序,只要输入年月日,就能回答那天是星期几. 输入一个日期,包括年.月.日.(一组测试数据) 输出这个日期是星期几. 输入: 1 1 1 2 1 1 2006 7 10 输出: Monday ...
-
Django应用:学习日志网站
目录 一.创建虚拟环境(Windows) 二.创建项目 三.创建应用程序 四.创建网页:学习笔记主页 五.创建其他网页 六.用户输入数据 七.用户账户 八.让用户拥有自己的数据 九.设置应用程序样式 ...
-
SSM整合配置(Spring+Spring MVC+Mybatis)
一.配置准备 通过Maven工程,在eclipse中整合SSM,并在Tomcat服务器上运行 在进行配置前,先理清楚要配置哪些文件,如图,除web.xml外,其余三个配置文件名称均可自定义: 如图 ...
-
【win7 + win server 2008】设置定时任务,设置.bat 文件去执行php脚本 == 用来配合爬虫程序简直不要太爽
Windows Server 2008中使用计划任务定时执行BAT bat进行PHP脚本的执行 一.首先进行任务管理器设置 每隔1分钟执行.BAT 文件配置 首先Windows Server 200 ...
-
prepareEditor
@Override public Component prepareEditor(TableCellEditor editor, int row, int column) { final Compon ...