重定位
重定位表
- 鏈接器為了知道有哪些指令需要被重定位守谓,所以需要這樣的一個表
- 一個重定位表往往就是ELF文件中的一個段堰汉,所以也稱為重定位段
- 每個需要重定位的地方都會有一個重定位入口敌蜂,它的定義(在ELF中):
typedef struct {
Elf32_Addr offset;//重定位入口的偏移(對于可重定位文件來說何缓,它要修改的是第一個字節(jié)相對于段起始位置的偏移;對于可執(zhí)行文件來說金赦,它修改的是第一個字節(jié)的虛擬地址)
Elf32_Word R_info;//重定位入口的類型和符號
}Elf32_Rel;
符號解析
- 鏈接符號未定義跷究,最常見的是:鏈接時缺少了某個庫跳昼,或者輸入目標文件路徑不正確般甲,或者符號的聲明和定義不一樣。為什么?因為找不到符號鹅颊,重定位會失敗敷存。
指令修正方式
尋址方式的區(qū)別:
- 近址尋址或遠址尋址
- 絕對尋址或相對尋址
- 尋址長度為8位、16位堪伍、32位锚烦、64位。
對于32位x86平臺下的ELF文件的重定位入口所修正的指令尋址方式:
- 絕對近址32位尋址S+A(修正方式:R_386_32)
- 相對近址32位尋址S+A-P(修正方式:R_386_PC32)
S符號的實際位置帝雇,A保存在被修正位置的值涮俄,P被修正的位置
COMMON塊
多個符號定義類型不一致的情況:
- 兩個或兩個以上的強符號類型不一樣(不需要處理,因為它非法)
- 有一個強符號尸闸,其他的都是弱符號(輸出結果和強符號相同彻亲,如果弱符號大性谐>強符號,會警告)
- 兩個或兩個以上的弱符號類型不一樣(取最大的那個)
編譯器將未初始化的全局變量定義作為弱符號使用苞尝。