码迷,mamicode.com
首页 > 其他好文 > 详细

代码重定位和位置无关码

时间:2017-12-17 22:24:47      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:必须   为什么   image   工具   有关   star   分享   定位   color   

通过前面的学习,我们知道,把可执行程序从一个位置复制到另一个位置的过程叫做重定位。

现在有两种方式,第一种是只重定位data段到内存(sdram),为什么需要重定位?因为有些flash的写操作,不是简单地内存访问,通常我们使用sdram这个介质作为程序运行的载体。但是只重定位data段这种方式存在弊端。第一,我们的调试工具通常不支持这种分体形式(比如我们的之前的代码在0地址开始存放text和rodata段,而在间隔很远处sdram 0x30000000存放data段,这就是分体的形式)的代码;第二,这种分体方式需要能够直接运行程序的flash比如nor flash才可以工作,但是有些板子根本连nor flash都没有,那么只能通过第二种方式进行开发了。

技术分享图片

第二种方式是把整个程序都复制到内存(sdram),这种方式所有数据都是紧挨着的,以后我们都使用这种方式。

现在思考一个问题,关于第二种方式,我们的bin文件是由连接脚本指定了运行地址为sdram(0x30000000)的,但是这个bin文件我们烧写在nor flash,是从0地址开始运行的,那么在nor flash上的代码就需要把整个bin文件拷贝到sdram中去,这就是重定位,但这就要求我们必须做到,在重定位之前的代码必须是位置无关码。(连接脚本指定我们程序的运行地址为0x30000000,为什么我们的在nor flash上的代码从0地址开始运行也能工作?这就是建立在我们这部分代码必须是位置无关码的基础上的,0地址处运行和0x30000000处运行达到同样效果,需要我们保证,在重定位之前,也就是复制操作没有完成之前的代码,必须是位置无关的,重定位之后,就没有限制了,可以位置有关,也可以位置无关)。

现在修改我们之前的连接脚本和启动文件:

 

SECTIONS
{
    . = 0x30000000;

    . = ALIGN(4);
    .text      :
    {
      *(.text)
    }

    . = ALIGN(4);
    .rodata : { *(.rodata) }

    . = ALIGN(4);
    .data : { *(.data) }

    . = ALIGN(4);
    __bss_start = .;
    .bss : { *(.bss) *(.COMMON) }
    _end = .;
}

上面是连接脚本,我想此时应该都不需要备注了吧,基本语法。表示0x30000000处是我们的运行地址。

未完待续。。。

代码重定位和位置无关码

标签:必须   为什么   image   工具   有关   star   分享   定位   color   

原文地址:http://www.cnblogs.com/yangguang-it/p/8053124.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!