/**************************** makefile **************************/
led.bin: start.o led.o
arm-linux-ld -T leds.lds -o led.elf start.o led.o //靠链接脚本来决定程序的地址和段的排放顺序
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led.dis
start.o : start.S
arm-linux-gcc -o start.o start.S -c
led.o : led.c
arm-linux-gcc -o led.o led.c -c
clean:
rm *.o led.elf led.bin led.dis -f
/******************************** 链接脚本 ********************************/
SECTIONS //段 ( 排放)
{
. = 0x50000000; //当前地址(与.=0生成的反汇编码链接地址的区别,见对比)
.text : { //段名称:text,data,bss任取名字
start.o //放置整个start.o文件
* (.text) //放其他所有文件的.text代码段
}
.data : {
* (.data) //放所有文件的数据段
}
/*bin文件不会包含bss段(否则会浪费内存空间),所以在程序启动之前将bss段所占内存清零(从bss起始清至bss结尾)*/
bss_start = .; //bss段的起始地址(当前地址)
.bss : {
* (.bss) //放所有文件的bss段
}
bss_end = .; //bss段的终止地址(当前地址)
}
bl,b:相对跳转(位置无关码)
bl text:
ldr:绝对跳转(位置相关)
ldr pc,=text
所以一开始程序还没处于链接地址上,又想跳转时,应用相对跳转指令