位置独立代码讨论 起个头 抛砖引玉 兼论uboot第一阶段
以前一直不是很明白位置无关代码和位置相关代码的区别,这几天抽空突击一下。位置无关代码的核心思是代码编译成可执行文件后,这个可执行文件既可以在0x0000_0000上正确执行,也可以在0x8000_0000上执行,也就是说程序的执行和链接时的链接地址无关。
要写出一个位置无关代码,就必须遵循一些编程规则,核心的思想是不能使用绝对地址跳转。
那么问题来了,这条指令 ldr r0, =SYS_CTRL_REG_BASE 是不是一条绝对地址跳转指令?SYS_CTRL_REG_BASE定义在了platform.h中,值为0x2005_0000。
这条指令的反汇编后的代码为 106c: e59f07d8 ldr r0, [pc, #2008] ; 0x184c 从这里可以看出这是一条相对跳转指令。
那么 ldr 寄存器 =标号 这样的指令什么时候是绝对跳转,什么时候是相对跳转。
ldr pc =标号 是绝对跳转指令码?