MSVC链接器生成的映射文件中的“ Rva + Base”是什么意思?

时间:2019-04-08 08:25:04

标签: c linker static-linking

我编译了一个C程序,并与Microsoft链接器 link.exe 链接。 链接器生成了一个* .map文件。以下是一些摘要:

 Start         Length     Name                   Class
 0001:00000000 00000180H .text                   CODE
 0001:00000180 00049158H .text$mn                CODE
 0002:00000000 000090c4H .rdata                  DATA
 0002:000090c4 00000130H .rdata$zzzdbg           DATA
 0003:00000000 00002060H .data                   DATA
 0003:00002060 00001370H .bss                    DATA
 0004:00000000 00002790H .pdata                  DATA
 0005:00000000 000003e4H .xdata                  DATA

  Address         Publics by Value       Rva+Base             Lib:Object
 0002:000000c0       _gVar               0000000000049660     MyLib:File1.obj

我的理解是:

.rdata部分的索引0002的长度为0x90c4

_gVar全局变量的地址类似于0002:000000c0,因此它以{strong>节偏移量 .rdata存在于0xc0中。 / p>

.rdata部分的基地址由加载程序在运行时决定。

我对Rva+Base列感到困惑。

我检查了偏移量为0x49660的二进制文件。它恰好包含我为_gVar分配的值。看来Rva+Base文件开头的偏移量

但是我认为Rva + Base应该等于absolute virtual address,只能由加载程序在运行时确定

怎么可能是文件偏移量?还是列名中有错字?

(顺便说一句,我搜索了很多有关link.exe生成的.map文件的权威参考。但是到目前为止,还没有运气。如果任何人都可以共享一些资源,将不胜感激。)

ADD 1-2019/4/8下午5:31

基于500 - Internal Server Error的评论,我使用CFF Explorer来验证PE部分。如下所示:

PE sections

根据PE sepc

  

虚拟地址:对于可执行映像,当该段为时,该段的第一个字节相对于映像库的地址   加载到内存中。

     

原始地址/ PointerToRawData :指向COFF文件中该部分首页的文件指针。

在我的场景中,这两列具有相同的数据。

在PE可选标头中,ImageBase为 0 (这是由于我的链接标志/BASE:0):

ImageBase

链接器生成.map文件时,它不知道在运行时将图像加载到何处。因此,必须使用ImageBase=0来计算Rva+Base列。

_gVar的绝对虚拟地址= ImageBase(0)+ .rdata虚拟地址(0x495A0)+向.rdata(0xc0)的偏移量= 0x49660

就我而言

  1. Virtual Address列与Raw Address列具有相同的值。
  2. ImageBase = 0具有与file beginning offset = 0相同的作用

因此,最后一个absolute virtual address等于file offset但这仅适用于我的情况

0 个答案:

没有答案