S5PV210汇编代码重定位:
链接脚本:
SECTIONS
{
. = 0xd0024000;
.text : {
start.o
* (.text)
}
.data : {
* (.data)
}
bss_start = .;
.bss : {
* (.bss)
}
bss_end = .;
}
汇编重定位代码:
adr r0, _start //the running addr
ldr r1, =_start //the link addr
ldr r2, =bss_start //the link addr
cmp r0, r1
beq clear_bss //if (r0 == r1) the running addr equal to link addr
//just need to clear bss
//copy all segment except bss, bss segment just need to clear
copy:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r1, r2
bne copy
clear_bss:
ldr r0, =bss_start
ldr r1, =bss_end
cmp r0, r1 //if (sizeof(bss) == 0) not need to clear
beq run_relocate_sram //if not copy,running addr equal to link addr
//led_blink is only one
//if copy, running addr not equal to link addr
//led_blink is two
//so run_relocate_sram to link addr
mov r2, #0x0
clear_bss_loop:
str r2, [r0], #4
cmp r0, r1
bne clear_bss_loop
run_relocate_sram:
ldr pc, =led_blink
b .
我们的链接地址和运行地址是不同的,那么怎么办呢?
把运行地址处的代码拷贝到链接地址处,再跳到链接地址处去运行,这样就能保证有位置有关代码的时候,运行地址和链接地址相同。
ldr pc, =led_blink 是长跳转,有两份led_blink,它会跳转到远的地址去。