位置有关码和位置无关码

Posted 代二毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位置有关码和位置无关码相关的知识,希望对你有一定的参考价值。

什么是位置有关码和位置无关码

位置无关码:地址 = PC + 偏移量
位置有关码 :地址 = 链接地址(通过链接脚本指定)
学习代码重定位的时候涉及这两个概念,简单来说:代码运行的时候,是否和所处内存地址相关。“位置有关码”要求运行时代码必须在特定的地址;而“位置无关码”则没有要求,随便在哪个内存地址都可以运行。
补充:“位置有关码”和“位置无关码”有点类似于“相对路径”和“绝对路径”,这个不一定对,只是个人这么理解。“位置无关码”的地址是相对于当前PC值的偏移量,类似于“相对路径”,只要相对的偏移量是正确的,放在那里都可以;“位置有关码”的地址是指定的链接地址,类似于“绝对路径”,“绝对路径是唯一的”,所以必须把代码放在指定内存地址。至于为什么位置有关码必须在特定的地址,和链接脚本和硬件平台有关,这个比较底层了,我暂时不需要了解这么深入,以后用到再说吧。

怎么判断是位置有关码还是位置无关码

这里简单的总结一下:b、bl、adr、ldr指令是位置无关码,ldr伪指令去加载标号地址是位置有关码。分不清ldr指令和伪指令的可以看博客《LDR指令和LDR伪指令详解》。还想要更深入的了解位置有关码和位置无关码,建议用交叉编译工具链里的objdump工具,通过反汇编文件去查看位置有关码和位置无关码的差异。objdump工具的使用可以参考博客[《反汇编工具objdump的使用以及反汇编文件的解读》]。(https://blog.csdn.net/weixin_42031299/article/details/117577060)

总结:

位置有关码和位置无关码是我在学习代码重定位的时候涉及到的概念,作用就是先运行一段位置无关码,将代码重定位到链接地址,接着执行后续的代码。在代码重定位完成之前,是不能运行位置有关码的,否则会出错。所以在写启动代码的时候,要了解这两个概念,用于重定位功能的代码必须都是位置无关码。

以上是关于位置有关码和位置无关码的主要内容,如果未能解决你的问题,请参考以下文章

s5pv210重定位

重定位与链接脚本

重定位与链接脚本

重定位与链接脚本

代码重定位

位置无关码(BL)与绝对位置码(LDR)