订阅
纠错
加入自媒体

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

2021-01-13 16:01
一口Linux
关注

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

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  main
func:
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=gcd
TARGETC=main
all:
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).dis
clean:
rm -rf *.o *.elf *.dis *.bin
反汇编文件「gcd.dis」

如上图所示:

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

<上一页  1  2  3  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

    人工智能 猎头职位 更多
    扫码关注公众号
    OFweek人工智能网
    获取更多精彩内容
    文章纠错
    x
    *文字标题:
    *纠错内容:
    联系邮箱:
    *验 证 码:

    粤公网安备 44030502002758号