从0学ARM——什么是位置无关码?

从0学ARM——什么是位置无关码?

二、怎么实现位置无关码?

1. 什么是《编译地址》?什么是《运行地址》?

「编译地址:」

32位的处理器,它的每一条指令是4个字节,以4个字节存储顺序,进行顺序执行,CPU是顺序执行的,只要没发生什么跳转,它会顺序进行执行, 编译器会对每一条指令分配一个编译地址,这是编译器分配的,在编译过程中分配的地址,我们称之为编译地址。

「运行地址:」

是指程序指令真正运行的地址,是由用户指定的,用户将运行地址烧录到哪里,哪里就是运行的地址。比如有一个指令的编译地址是0x40008000,实际运行的地址是0x40008000,如果用户将指令烧到0x60000000上,那么这条指令的运行地址就是0x60000000。

当编译地址和运行地址不同的时候会出现什么结果?结果是不能跳转,编译后会产生跳转地址,如果实际地址和编译后产生的地址不相等,那么就不能跳转。

「C语言编译地址:」

都希望把编译地址和实际运行地址放在一起的,但是汇编代码因为不需要做C语言到汇编的转换,可以直接的去写地址,所以直接写的就是他的运行地址,这就是为什么任何bootloader刚开始会有一段汇编代码,因为起始代码编译地址和实际地址不相等,这段代码和汇编无关,跳转用的运行地址。

2. 举例

实现位置无关码主要考虑以下两个方面:

1. 位置无关的函数跳转2. 位置无关的常量访问

下面我们通过两个例子详细讲解。

代码

编译代码使用的连接文件「map.lds」如下:

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS{ . = 0x40008000; . = ALIGN(4); .text : { gcd.o(.text) *(.text) } . = ALIGN(4); .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .bss : { *(.bss) }}

如文件map.lds所示:「0x40008000」就是链接地址,

其他源文件如下:「gcd.s」

.text.global _start_start: ldr sp,=0x70000000 get stack top pointer bl func ldr pc,=func b mainfunc: mv pc,lr

「main.c」

* main.c * * Created on: 2020-12-12 * Author: 一口Linux int aaaa=0; int main(void){ aaaa = 0x11; while(1); return 0;}

「Makefile」

TARGET=gcdTARGETC=mainall: arm-none-linux-gnueabi-gcc -O1 -g -c -o $(TARGETC).o $(TARGETC).c arm-none-linux-gnueabi-gcc -O1 -g -c -o $(TARGET).o $(TARGET).s arm-none-linux-gnueabi-gcc -O1 -g -S -o $(TARGETC).s $(TARGETC).c arm-none-linux-gnueabi-ld $(TARGETC).o $(TARGET).o -Tmap.lds -o $(TARGET).elf arm-none-linux-gnueabi-objcopy -O binary -S $(TARGET).elf $(TARGET).bin arm-none-linux-gnueabi-objdump -D $(TARGET).elf > $(TARGET).disclean: rm -rf *.o *.elf *.dis *.bin反汇编文件「gcd.dis」

如上图所示:

_start对应的链接地址是0x400080009行 bl func对应的指令10行 ldr pc,=pc对应的指令func的链接地址0x40008010全局变量aaaa对应的内存位于bss段0x4000802c19行 aaaa = 0x11 赋值语句对应的机器码

相关推荐

浦东美术馆
365根据什么来封号

浦东美术馆

🗓️ 10-01 👁️ 7509
人可以多久不拉屎?憋了36个月破了世界纪录的人,结果怎样?
日产骐达导航怎么拆卸,骐达导航安装流程
365bet真人体育

日产骐达导航怎么拆卸,骐达导航安装流程

🗓️ 09-23 👁️ 2628
【雕像】塞伯坦的守卫者!Prime 1 Studio:新品 <变形金刚:塞博坦之战> 擎天柱 UT终极版 官图
22款拉杆箱对比测评:9款不够结实;小米、稻草人等获“全五星”
《济南济南》演唱者陈小熊,民谣歌手里“最不正经”的女博士(有福利)
Java集合遍历的方法有哪些
365bet真人体育

Java集合遍历的方法有哪些

🗓️ 10-19 👁️ 674
天文知识:为什么月亮会呈现出各种不同的颜色?
365bet真人体育

天文知识:为什么月亮会呈现出各种不同的颜色?

🗓️ 07-26 👁️ 5097
斤和千克的換算
365bet真人体育

斤和千克的換算

🗓️ 08-25 👁️ 7627
2026世界杯预选赛积分怎么算?详解积分规则与晋级机制
最佳娱乐365bet娱乐场下载

2026世界杯预选赛积分怎么算?详解积分规则与晋级机制

🗓️ 08-09 👁️ 3580
直播间有哪些分类?如何选择适合自己的直播间
最佳娱乐365bet娱乐场下载

直播间有哪些分类?如何选择适合自己的直播间

🗓️ 09-07 👁️ 9489
[求助]请问下,大家对魔技纳米这家公司了吗
最佳娱乐365bet娱乐场下载

[求助]请问下,大家对魔技纳米这家公司了吗

🗓️ 07-11 👁️ 412