读书人

TQ210裸机编程(十)代码重定位

发布时间: 2013-10-24 18:27:21 作者: rapoo

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  = .;}

Makefile

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

读书人网 >编程

热点推荐