韦东山Linux嵌入式课程社区
直播中

李昕羿

7年用户 173经验值
私信 关注

代码重定位问题

学到了第13课002节,不明白链接脚本中的这句代码.data 0x30000000 : AT(0x800) { *(.data) }中的运行时地址(0x3000000)起到了什么作用?
既然我还是需要在Start.S里面手动重定位代码,那么不要这一句也可以吧?

回帖(5)

盛方圆

2019-3-26 14:33:25
不指定0x30000000,代码怎么知道重定位到哪里呢
举报

周丽

2019-3-26 14:48:36
因为Start.S里面指定了啊
    /* 重定位data段 */
    mov r1, #0x800
    ldr r0, [r1]
    mov r1, #0x30000000
    str r0, [r1]
举报

林剑连

2019-3-26 14:57:06
ldr pc,=main是位置有关码,是根据链接地址去跳转的,链接地址在sdram,就跳到sdram里了
举报

李玉英

2019-3-26 15:03:31
      我说的也有问题。应该是,如果链接脚本里面只指定了data段运行时地址没有指定加载地址时,data段是直接放在0x30000000的地方,可以看到编译出来的bin文件很大。和直接在Makefile文件里面直接指定data段地址的效果是一样的,所以为了减少不必要的空间浪费,增加一个加载地址,把data段拼接到代码段的后面,这样编译出来的bin文件就小很多。
      但是这样是运行是访问不到data段的数据的,因为main函数里面访问data段的数据时,是直接访问0x30000000这个地址,而实际上data段被放在了代码段的后面,所以就要在start.S里面做重定位的动作,把data段数据从0x800拷贝到0x30000000。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分