我正在使用GCC在ARM上爲bada構建ELF SO。編譯器選項包括-fpic。然而,在建文件,當我做readelf -r
,還有一大堆的搬遷紀錄,以下類型:PIC不意味着沒有搬遷?
- R_ARM_RELATIVE
- R_ARM_REL32
- R_ARM_ABS32
- R_ARM_GLOB_DAT
- R_ARM_JUMP_SLOT
我在這裏誤解了什麼?
編輯:從我可以看到,編譯器中的PIC實現不使用GOT。相反,它們使用PC相對尋址,存儲的常量是從使用點到符號地址的偏移量;這由鏈接器解決。像這樣,要讀取全局變量:
ldr r12, OffsetToVar
PointOfUse:
ldr r0, [r12, pc]
# r0 now has the value of MyVar
#...
# At function's end...
OffsetToVar:
.long MyVar-PointOfUse-8
# Compiler can't resolve this, since it doesn't know
# the address of MyVar, but linker can
跨模塊函數調用的相似想法。當一個項目混合使用ARM和Thumb代碼時,後者可能會失火。但我已經解決了這個問題。
只是猜測,你訪問全球數據?如果是這樣的代碼可能是一個PIC,但數據仍然綁定到一個可能改變的地址? –
PIC代表位置獨立代碼。指令的選擇使得即使在未鏈接的地址空間加載該代碼塊也能正確執行。 –
我會猜你想要什麼(但不是問題的答案)。參見'-fixed-REG',使用['-msingle-pic-base'](http://gcc.gnu.org/ml/gcc-patches/1999-07n/msg00573.html)和'-mpic-註冊表「,您的調度程序必須將」r9「設置爲指向全局數據。舉例來說,如果沒有MMU,你可以運行多個代碼實例並將'r9'替換爲該任務/線程/進程的全局變量指針。這是一種避免數據重定位的機制。另外,編譯器/鏈接器通常會發出通常不需要的重定位。 –