一、必须知道的几个概念。

1、链接地址和运行地址。

①运行地址,顾名思义就是程序运行的时候的地址,也就是你用工具将代码下载到RAM的那个地址,也叫加载地址。

②链接地址,由链接脚本指定的地址。为什么需要链接脚本指定地址呢?你想一下,在c语言编程中,当我们需要调用一个A函数的时候,编译器是怎么找到这个A函数?编译器肯定是知道它被放在哪里才可以找到它。那就是链接脚本的作用,链接脚本其实在程序被执行之前都已经指定A函数一个地址编号,以后所有的函数调用我们都会去这个地址编号那里寻找A函数。有点类似于c语言的指针变量。

2、位置有关码与位置无关码。

①位置有关码,就是这句代码的执行正确与否还需要取决于当前的地址,也就是说跟地址已经绑定了的,例如:ldr PC, _main,就是PC指针必须跳转到_main(函数名就是一个地址)这个地址去,代码执行成功与否就相当于受到了这个地址的约束,假如这个地址的内容不存放_main这个函数,就会出错了。

②位置无关码,就是这句代码在哪里运行都可以的,跟所处的地址无关,跟位置有关码相反。

二、重定位需要理解的一些问题。

1、链接地址跟运行地址不同的情况下会出现什么情况?

答:以上面举的函数A为例,当链接地址跟运行地址不同的时候,假如链接地址是0x1000,运行地址(加载地址)是0x0000,链接脚本指定函数A将来是要存放到(基地址+偏移量)=0x1000+0x0001=0x1001地址的,但是程序在下载的时候却把这个程序下载到0x0000,所以函数A的地址实际上是存放在(基地址+偏移量)=0x0000+0x0001=0x0001这个地址的。当程序运行到一行位置有关码例如:ldr PC, A ,编译器首先就会按照链接脚本指定的A的那个地址0x1001寻找A函数,但是因为加载地址跟链接地址不同的原因,实际上A函数已经被放到了0x0001,所以执行就会出错。所以,当这两个地址不同的时候,执行一段位置有关码的时候就会发生不可预估的错误。

2、为什么会出现链接地址跟运行地址不同的情况?

答:当一块芯片启动的时候,依靠内部的SRAM,可以运行一小段代码,而因为DDR还没初始化,注定了开始的运行地址是在内部SRAM中的。当我们需要运行一个操作系统,那么点的内存怎么够运行呢?所以这时候就需要初始化DDR才可,而因为我们知道这代码将来都是在DDR上面运行的,所以链接脚本指定的链接地址肯定是DDR上面的地址,所以这就出现了链接地址跟运行地址不同的情况了。

3、什么是重定位?

答:由于出现1这样的问题,就需要使用重定位这种方式解决上面的问题了。那什么是重定位呢?重定位就是在链接地址跟运行地址不同的情况下,执行一段位置无关码,这段位置无关码的作用就是将原来的那份代码全部复制到链接地址那里去,然后自己再长跳转到新的那份代码的刚刚执行的那个位置。这样就实现了链接地址跟运行地址一致的情况了。

4、为什么需要重定位?

答:就是链接地址跟运行地址不同,在这个情况下我们可以有两种方案:
①全部使用位置无关码。
②进行重定位让这两个地址相同。
我们知道,如果是一个小代码,使用①时可以的,但是一个大的代码文件很难保证全部都使用位置无关码的,这也是不现实的,所以必须使用重定位解决这个问题。

转载于:https://www.cnblogs.com/linhaostudy/p/9115480.html

什么是重定位?为什么需要重定位?【转】相关推荐

  1. 标准h5的定位_H5中的定位

    这次给大家带来H5中的定位,H5中定位的注意事项有哪些,下面就是实战案例,一起来看一下. 一.定位流分类 1.1相对定位 1.2绝对定位 1.3固定定位 1.4静态定位 二.什么是相对定位? 相对定位 ...

  2. css定位页面元素,页面元素定位-CSS元素基本定位

    基本定位 """属性定位 一 """ # #通过id # driver.find_element_by_css_selector(" ...

  3. 【新无人机数据集】从 行人重识别 到 无人机目标定位

    论文题目:University-1652: A Multi-view Multi-source Benchmark for Drone-based Geo-localization 论文地址:http ...

  4. C2371 “imaxdiv_t”: 重定义;“_abs64”: 重定义;不同的链接

    C2371 "imaxdiv_t": 重定义:"_abs64": 重定义:不同的链接 原因:ffmpeg的变量与vs的变量冲突了, 解决方法: https:// ...

  5. winform 在panel怎么实现锚点定位_高德网络定位之“移动WiFi识别”

    导读 随着时代的发展,近10年来位置产业蓬勃发展,定位能力逐渐从低精度走向高精度,从部分场景走向泛在定位.设备和场景的丰富,使得定位技术和能力也不断的优化更新.定位能力包括GNSS.DR(航迹推算). ...

  6. Android定位开发之百度定位、高德定位、腾讯定位,三足鼎立一起为我所用!

    这几天的项目不是非常紧.于是想为未来可能要做的项目做一些技术储备. 下一个项目非常有可能是定位开发,须要用到手机定位功能,于是查了查如今比較流行的第三方定位,最火的基本上就是百度定位>高德定位& ...

  7. 【Android 逆向】逆向修改游戏应用 ( 分析应用结构 | 定位动态库位置 | 定位动态库中的修改点 | 修改动态库 | 重打包 )

    文章目录 一.应用结构分析 二.定位动态库位置 三.定位动态库中的修改点 四.修改动态库 五.重打包 一.应用结构分析 分析上一篇博客 [Android 逆向]逆向修改游戏应用 ( APK 解析工具 ...

  8. 【STM32】端口复用和重映射,完全重映射,部分重映射

    文章目录 端口复用 端口复用函数总结 端口重映射 完全重映射 完全重映射函数总结 部分重映射 端口复用 当 PA9,PA10 引脚作为串口 1 的 TX,RX 引脚使用的时候,那就是端口复用(相较于作 ...

  9. 【自动驾驶】定位方式:RTK定位与激光融合定位

    对于自动驾驶定位技术更详细的介绍,可以参考这篇博客:自动驾驶定位技术(Localization)-GNSS 定位分为RTK定位和融合定位. RTK(Real Time Kinematic)定位: 实时 ...

  10. 定位漏水与非定位漏水的区别?

    前言 随着我国邮电.金融系统在机房管理上的日趋完善,无人值守集中监控系统得到了广泛应用,实现了对各种环境设备.动力设施的绿色控制,各种设备得到合理.有效地应用,其中泄漏检测也逐渐成为监控系统中必不可少 ...

最新文章

  1. nginx四层端口转发
  2. 停止linux下正在执行的ping命令
  3. 单片机按键软硬件设计技巧!
  4. python 网络服务器框架_Django是Python下的一款网络服务器框架
  5. const修饰是指针和常量
  6. oracle怎么判断地址相似,如何查看oracle数据文件的地址
  7. MySQL(6)---数据库 管理
  8. 也写Jquery插件,拖动布局
  9. 支持向量机原理(四)SMO算法原理
  10. Log42j 源代码分析:日志回滚
  11. plotting and saving over line in paraView
  12. 计算机考医学考研方向,医学考研科目都有哪些方向
  13. C语言编程之学习putpixel画点
  14. 《WINDOWS游戏编程之从零开始》第四章学习笔记
  15. html页面实现右下角弹窗提示,JS 实现右下角弹窗
  16. 我的iPad/iPhone App推荐列表
  17. 评论系统--开发总结
  18. 整理外企常用英语及其缩写
  19. vue elementUI 时间控件优化 选择起始时间不能在结束时间之后,结束时间不能在起始时间之前
  20. Centos7 本地IOS配置本地yum源

热门文章

  1. 无盘服务器配置2018,遥志CCBoot无盘软件
  2. 大型企业局域网监控的设计与实现
  3. 百家讲坛: 曾国平教授 EQ IQ 演讲 精典摘录
  4. 自主招生面试计算机专业知识,中高职对口自主招生计算机类专业上机模拟考试一.docx...
  5. openGL之API学习(一八九)gl_Position gl_Vertex
  6. 上海滩 Java_非遗传承人陶一的诗词被荣获吉尼斯记录的《上海滩诗叶》收录
  7. 【Cell报表】设计模板
  8. [附源码]JAVA+ssm计算机毕业设计财务管理系统(程序+Lw)
  9. 视频信号传输标准 BT656
  10. 靠自学算法进入大厂和做算法带队人的就是他!