本文主要是介绍uboot relocation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
-
relocation重定位定义
uboot运行后会将自身代码拷贝到sdram的另一个位置继续运行。 -
原因
uboot从SDRAM低位拷贝到高位后,各指令存储地址改变,对位置无关指令的执行,不受影响;但位置相关指令的执行会导致程序执行错误,这时即需要relocation来解决。 -
解决
使用-pie选项的compiler,将需要relocate的值(全局变量地址 函数入口地址)的地址存储在rel.dyn段中,uboot运行中relocate_code遍历rel.dyn段,根据rel.dyn中存储的值,对以(这些值+offset)为地址上的值进行了relocate,完成对所有需要relocate的变量的修改 -
应用
考虑3个点:1)link链接地址2)load的加载地址3)运行地址这3个点相同下才会完整运行bin文件。
而relocation后运行地址不同于加载地址 特别是链接地址,ARM的寻址会不会出现问题?
新版uboot跟老版uboot不太一样的地方在于新版uboot不管uboot的load addr(entry pointer)在哪里,启动后会计算出一个靠近sdram顶端的地址,将自身代码拷贝到该地址,继续运行。因此relocation是必须的。
参考:《uboot的relocation原理详细分析》
这篇关于uboot relocation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!