可重定位的目标文件phase1.o,在生成执行程序的过程中重定位的方法
gcc -on-pie -fno-PIC main.o phase1.o -o linkbomb1
连接时,在各个.o合并生成了执行程序linkbomb1后,要对linkbomb1进行重定位。
1.查看phase1.o的重定位条目
$readelf -r phase1.o
2.phase1.o中数据节.data的重定位
2.1 查看数据节需要重定位的条目
$readelf -x.rel.data phase1.o
.rel.data
r1=00000000 00000000 01000000 09000000 00000000 00000000
{
offset=0;
type=1; R_X86_64_64
sybmol=9; do_phase
addend=0x0;
}
这个就是void (*phase)()=do_phase; 全局变量phase被初始化为do_phase子程序的起始地址。
而do_phase的地址,只有连接生成执行程序linkbomb1后,各个text合并后,才能确定do_phase的地址,重新对这个变量phase赋初值。
2.2 确定需要重定位的数据位置和长度: 0, 8
$readelf -x.data phase1.o
Hex dump of section ‘.data’:
NOTE: This section has relocations against it