您尚未登录。

楼主 # 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 (带链接脚本和调试初始化脚本)

离线

#2 2021-06-15 19:18:32

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

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

	/* Copyself to link address */
	la t0, _start
	la t1, _image_start
	LREG t1, (t1)
	beq t0, t1, 1f
	la a0, _image_start
	LREG a0, (a0)
	la a2, _image_end
	LREG a2, (a2)
	sub a2, a2, a0
	la a1, _start
	call memcpy
1:	nop

贴一个riscv版本的

离线

#3 2021-06-18 11:39:32

拉轰的脚踏车
会员
注册时间: 2020-03-20
已发帖子: 288
积分: 222

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

xboot 说:
	/* Copyself to link address */
	la t0, _start
	la t1, _image_start
	LREG t1, (t1)
	beq t0, t1, 1f
	la a0, _image_start
	LREG a0, (a0)
	la a2, _image_end
	LREG a2, (a2)
	sub a2, a2, a0
	la a1, _start
	call memcpy
1:	nop

贴一个riscv版本的

这一句没看懂,  LREG t1, (t1)

哪位路过的大佬解释一下。

离线

页脚

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

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