最近重温韦东山老师的嵌入式视频重定位章节,看完重定位整个代码部分后一直在纠结一个问题,先把链接脚本和重定位部分代码贴出来:
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中
