從0學ARM——什么是位置無關碼?
二、怎么實現位置無關碼?
1. 什么是《編譯地址》?什么是《運行地址》?
「編譯地址:」
32位的處理器,它的每一條指令是4個字節(jié),以4個字節(jié)存儲順序,進行順序執(zhí)行,CPU是順序執(zhí)行的,只要沒發(fā)生什么跳轉,它會順序進行執(zhí)行, 編譯器會對每一條指令分配一個編譯地址,這是編譯器分配的,在編譯過程中分配的地址,我們稱之為編譯地址。
「運行地址:」
是指程序指令真正運行的地址,是由用戶指定的,用戶將運行地址燒錄到哪里,哪里就是運行的地址。比如有一個指令的編譯地址是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 賦值語句對應的機器碼
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
-
10月31日立即下載>> 【限時免費下載】TE暖通空調系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯網產業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
推薦專題