TQ210裸机编程(10)——代码重定位
关于重定位的理论知识推荐大家观看韦东山的视频《6410裸板视频》中的第5章(位置无关码、重定位)。
下载地址:http://pan.baidu.com/share/link?uk=2520074993&shareid=483439#dir/path=%2F%E9%9F%A6%E4%B8%9C%E5%B1%B1Linux%E8%A7%86%E9%A2%91%E7%AC%AC1%E6%9C%9F_S3C6410%E8%A3%B8%E6%9D%BF
在S5PV210上的实验方法:烧写程序到SD的第1块,从SD启动,程序的链接地址为0xD0024000,在程序中将程序拷贝到0xD0024000地址处,然后跳转到main函数去执行。
运行效果如下:
before relocate
after relocate
t = 0
t = 1
t = 2
t = 3
t = 4
t = 5
8eeà????????
在重定位之前,用自己实现的puts函数打印字符串“before relocate”,重定位后,循环打印t的值。
注意这里在重定位前不能使用printf("before relocate")这样的操作,因为字符串"before relocate"是放在数据段中的,而程序中访问数据段的内容使用的是链接地址(0xD0024000之后),而这时程序还位于0xD0020010。具体怎么处理见代码。
start.S
SECTIONS{. = 0xD0024000;.text : {start.o* (.text)} .data : {* (.data)}bss_start = .; .bss : {* (.bss)}bss_end = .;}uart.bin: start.o clock.o uart.o main.o
arm-linux-ld -Tlink.lds -o uart.elf $^
arm-linux-objcopy -O binary uart.elf $@
arm-linux-objdump -D uart.elf > uart.dis
%.o : %.c
arm-linux-gcc -c $< -o $@
%.o : %.S
arm-linux-gcc -c $< -o $@
clean:
rm *.o *.elf *.bin *.dis
烧写过程见《TQ210裸机编程(5)——系统时钟配置》
转载请注明来源:http://blog.csdn.net/zjhsucceed_329/
QQ:783692389