我编译了一个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文件的权威参考。但是到目前为止,还没有运气。如果任何人都可以共享一些资源,将不胜感激。)
基于500 - Internal Server Error
的评论,我使用CFF Explorer来验证PE部分。如下所示:
根据PE sepc:
虚拟地址:对于可执行映像,当该段为时,该段的第一个字节相对于映像库的地址 加载到内存中。
原始地址/ PointerToRawData :指向COFF文件中该部分首页的文件指针。
在我的场景中,这两列具有相同的数据。
在PE可选标头中,ImageBase为 0 (这是由于我的链接标志/BASE:0
):
链接器生成.map文件时,它不知道在运行时将图像加载到何处。因此,必须使用ImageBase=0
来计算Rva+Base
列。
_gVar
的绝对虚拟地址= ImageBase(0)+ .rdata虚拟地址(0x495A0)+向.rdata(0xc0)的偏移量= 0x49660
就我而言
Virtual Address
列与Raw Address
列具有相同的值。 ImageBase = 0
具有与file beginning offset = 0
相同的作用因此,最后一个absolute virtual address
等于file offset
,但这仅适用于我的情况。