重定位细节[1]
ELF里面重定位项的结构
struct elf32_rel {
Elf32_Addr r_offset;
Elf32_Word r_info; //SYMBOL=r_info>>8 TYPE=r_info&0xff.
} ;
r_offset是需要进行重定位的地址;
SYMBOL是重定位以后需要指向的符号;
TYPE是重定位的类型。
绝对地址指令
c7 44 24 04 00 00 00 00 movl $0x0,0x4(%esp)
相对地址指令
e8 fc ff ff ff call 27<main+0x27>
编译器把这两个地址部分暂时用0x00000000和0xfffffffc代替着
真正的地址计算工作留给了链接器
链接器在完成地址和空间分配之后就已经可以确定所有符号的虚拟地址了,那么链接器就可以根据符号的地址对每个需要重定位的指令进行地址修正
RELOCATION RECORDS FOR [.text] 表示这个重定位表是代码段的重定位表
注意绝对寻址修正和相对寻址修正