2014-02-26 46 views
0

我正在使用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代碼時,後者可能會失火。但我已經解決了這個問題。

+0

只是猜測,你訪問全球數據?如果是這樣的代碼可能是一個PIC,但數據仍然綁定到一個可能改變的地址? –

+0

PIC代表位置獨立代碼。指令的選擇使得即使在未鏈接的地址空間加載該代碼塊也能正確執行。 –

+0

我會猜你想要什麼(但不是問題的答案)。參見'-fixed-REG',使用['-msingle-pic-base'](http://gcc.gnu.org/ml/gcc-patches/1999-07n/msg00573.html)和'-mpic-註冊表「,您的調度程序必須將」r9「設置爲指向全局數據。舉例來說,如果沒有MMU,你可以運行多個代碼實例並將'r9'替換爲該任務/線程/進程的全局變量指針。這是一種避免數據重定位的機制。另外,編譯器/鏈接器通常會發出通常不需要的重定位。 –

回答

3

PIC是不是意味着沒有搬遷?

不,它確實是而不是

這只是意味着不需要對.text部分進行重定位(因此可以在多個進程之間共享.text)。

+0

這是真的嗎? 「-fpic生成與位置無關的代碼...此類代碼通過全局偏移表(GOT)訪問所有常量地址。」 http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html – auselen

+0

有'-pic'和['-pie'](http://stackoverflow.com/questions/2463150/fpie-位置無關的可執行選項-GCC-LD)。真的,它將取決於'gcc'配置。我認爲這個答案對於* ARM Linux glibc *類型的環境是正確的。例如,在ARM EABI中有一個* static base *,所有全局變量都可以引用該寄存器。另外,有時候*重定位*記錄實際上沒有做任何事情;也就是說,編譯器/鏈接器輸出一個條目,但在加載時不需要實際修復。 –

+0

由偏移量來判斷,文本部分也有一些重定位。有沒有辦法進一步調查? –