最近重温韦东山老师的嵌入式视频重定位章节,看完重定位整个代码部分后一直在纠结一个问题,先把链接脚本和重定位部分代码贴出来:
SECTIONS{
.= 0x30000000;
.= ALIGN(4);
.text : { *(.text) }
.= ALIGN(4);
.rodata : { *(.rodata) }
.= ALIGN(4);
.data : { *(.data) }
.= ALIGN(4);
_bss_start = .;
.bss : { *(.bss) *(.COMMON) }
_end = .;
}
mov r1, #0
ldr r2, =_start
ldr r3, =_bss_start
cpy:
ldr r4, [r1]
str r4, [r2]
add r1, r1, #4
add r2, r2, #4
cmp r2, r3
ble cpy
我所纠结的问题是:我们明明可以在重定位代码中直接将r2赋值为0x3000,0000,这样也能将代码重定位到0x3000,0000处,然后ldr pc, =main绝对跳转命令跳到SDRAM执行,那么问题来了,在链接脚本中指定的链接地址有什么用?有没有必要?
想了很久终于找到了问题,如果不在链接脚本指定链接地址,ldr pc, =main凭什么可以跳到0x3000,0000处运行?我们的重定位代码可没有这个能力,它只是把程序复制到0x3000,0000开始的地址处,所以指定链接地址的作用就是定位main的运行地址为0x3xxx,xxxx,这样重定位之后执行ldr pc, =main绝对跳转就可以跳到SDRAM中