我有以下程序:
BITS 32
section .data
_num1: dd 5
section .text
global _start
_start:
push ebp
mov ebp, esp
mov eax, 9
add eax, [_num2]
sub eax, [_num1]
leave
ret
_num2: dd 7
汇总到下面的x86指令中:
0x00401000 <+0>: push ebp
0x00401001 <+1>: mov ebp,esp
0x00401003 <+3>: mov eax,0x9
0x00401008 <+8>: add eax,DWORD PTR ds:0x401016
0x0040100e <+14>: sub eax,DWORD PTR ds:0x402000
0x00401014 <+20>: leave
0x00401015 <+21>: ret
现在,sub
和add
指令的地址似乎非常固定(绝对)。实际上,.data部分的VirtualAddress
是0x2000
,但如果程序没有加载到其首选地址并且必须应用重定位,该怎么办?
在这种情况下,由于VirtualAddress
是RVA,因此这些部分保持相对,但上述地址是固定的。
加载程序如何知道必须更改这些地址以指向正确的数据项?