我想弄清楚重定位是如何工作的,但我似乎無法擺脫困境。 This document描述了重定位ELF文件時可能遇到的不同類型。在ARM Cortex-M3上的ELF重定位
例如,我們以R_ARM_ALU_SB_G0_NC
(#70)爲例。
- 類型:靜態
- 類:ARM,描述了被搬遷的地點類型(我不明白)
- 操作:((S + A)| T) - B(S))
我猜數學表達式是我正在尋找的操作。但是,我並不完全理解這如何適合我的功能。 其中重定位發生的方法,如下所示:
int elfloader_arch_relocate(int input_fd, struct elfloader_output *output,
unsigned int sectionoffset, char *sectionaddr, struct elf32_rela *rela, char *addr)
input_fd
對於ELF文件的文件描述符,*output
被寫入輸出段時使用的,sectionoffset
是文件偏移量,重定位可以發現,*sectionaddr
是段開始地址(絕對運行時間),*addr
是重定位地址。 32位重定位結構看起來像這樣
struct elf32_rela {
elf32_addr r_offset;
elf32_word r_info;
elf32_sword r_addend;
};
在上述26中提到document的命名法是說明頁:
- S(單獨使用時)是符號的地址。
- A是重新安置的加數。
- 如果目標符號S具有類型STT_FUNC並且符號尋址Thumb指令,則T爲1;否則爲0。
- B(S)是輸出段定義符號
所以我的問題是,其在重定位函數的參數的對應於式中所使用的那些的尋址原點?
你在哪裏做重定位,你有一個在cortex-m3上有一個elf分析器的操作系統嗎? –
我正在使用Contiki OS 2.7,因此我只需要編寫一些與處理器相關的函數,如'elfloader_arch_relocate()' – boortmans
我不清楚您是在實現_linker_還是_loader_。鏈接器作爲編譯的最後階段運行,將「目標文件」轉換爲「可執行文件」和「共享庫」。加載程序作爲執行的第一階段運行,以便在將可執行程序和共享庫引入內存時「修復」它們。鏈接器必須處理比裝載器更多的重定位類型。請說出你的意思。 – zwol