您尚未登录。

楼主 # 2021-06-14 20:12:29

孤星泪
会员
注册时间: 2020-03-18
已发帖子: 235
积分: 231

终于搞清楚汇编代码的重定位判断语句是怎么实现的了

比如 xboot 这个代码段重定位 https://github.com/xboot/xboot/blob/master/src/arch/arm32/mach-f1c100s/start.S

_speedup:
	nop

	/* Copyself to link address */
	adr r0, _start
	ldr r1, =_start
	cmp r0, r1
	beq 1f
	bl sys_copyself

第一条语句 adr r0, _start 编译后是 基于PC指针把 _start 的位置读到 r0 寄存器,

在哪个位置运行, r0 值就是多少.  比如程序在 0x800 运行, 那么 _start 就是 0x800



第二条语句 ldr r1, =_start 是取 _start 的链接地址, 也就是重定位地址.


如果 r1 与 r0 寄存器不相等, 他们肯定要进行重定位 (代码段复制)



为了证明这个问题, 我用MDK反汇编看了一下:
2021-06-14_200955.png

离线

楼主 #1 2021-06-14 20:19:41

孤星泪
会员
注册时间: 2020-03-18
已发帖子: 235
积分: 231

Re: 终于搞清楚汇编代码的重定位判断语句是怎么实现的了

2021-06-14_201607.png








MDK源码工程下载 (是用GNU GCC工具链): test_copy_self_20210614.7z (带链接脚本和调试初始化脚本)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn