Tag: 可移植可执行

VA(虚拟地址)&RVA(相对虚拟地址)

input到链接器的文件称为对象文件 。 链接器产生一个Image文件 ,这个文件又被加载器用作input。 从“ 微软可移植可执行文件和通用目标文件格式规范 ” RVA(相对虚拟地址) 。 在一个图像文件中,将一个项目的地址加载到内存中,并从中减去图像文件的基地址。 一个项目的RVA几乎总是不同于它在磁盘上文件的位置(文件指针)。 在目标文件中,RVA没有意义,因为内存位置未分配。 在这种情况下,RVA将是一个部分(稍后在此表中描述)中的地址,在链接期间稍后将对其应用重定位。 为了简单起见,编译器应该将每个部分中的第一个RVA设置为零。 VA(虚拟地址) 。 与RVA相同,不同之处在于不会减去映像文件的基址。 该地址称为“VA”,因为Windows为每个进程创build独立于物理内存的独特VA空间。 几乎所有的目的,一个VA应该被视为一个地址。 VA并不像RVA那样可预测,因为加载器可能不会将图像加载到其首选位置。 即使阅读了这个,我仍然不明白。 我有很多问题。 任何人都可以用实际的方式来解释它吗? 请遵守所述的Object File和Image File术语。 我所知道的地址就是这样 无论是在对象文件还是在图像文件中,我们都不知道确切的内存位置, 生成目标文件时,汇编程序计算相对于.data & .text (用于函数名称)部分的地址。 以多个目标文件作为input的链接器生成一个图像文件。 在生成时,首先合并每个目标文件的所有部分,并在合并时重新计算相对于每个部分的地址偏移量。 而且,没有什么东西像全球抵消。 如果我所知道的东西有问题,请纠正我。 编辑: 看完弗朗西斯的回答后,我很清楚什么是Physical Address,VA&RVA以及它们之间的关系。 链接器在重定位期间必须计算所有variables和方法的RVA。 那么, (一个方法/variables的RVA的值)==(它从文件开始的偏移量) ? 一定是真的 但令人惊讶的是,它不是。 为什么这样? 我通过在c:\WINDOWS\system32\kernel32.dll上使用PEView检查了这一点,发现: RVA和FileOffset是相同的,直到部分的开始( .text是在这个DLL的第一部分)。 从.text开始.data , .rsrc到最后一节( .reloc )的最后一个字节RVA和FileOffset是不同的。 也是第一段第一个字节的RVA总是显示为0x1000 […]