Delphi映射文件报告相对于包含它的段的起始符号的地址。地图文件的开头是这样的:
Start Length Name Class
0001:00401000 00AD87A4H .text CODE
也就是说,代码段起始地址为00401000
。我相信00400000
和00401000
之间是PE元数据。
地图文件看起来像这样的后续部分:
Detailed map of segments
0001:00000000 0000E174 C=CODE S=.text G=(none) M=System ACBP=A9
0001:0000E174 00000734 C=CODE S=.text G=(none) M=SysInit ACBP=A9
....
通知的地址是怎么写的。因此,0001:0000E174
意味着从该段开始的段0001
,偏移0000E174
。一旦模块被加载,绝对地址就是通过获取段基地址,并将该偏移量加到符号上而形成的。所以SysInit模块从00401000 + 0000E174 = 0040F174
开始。
根据我的经验,链接器总是将代码段放置在与模块基址相同的偏移处。但是你不需要假设。您可以从地图文件中读取信息。
地址001BD81F
位于不同的模块中。也就是说,该地址,如果它确实是代码,则是来自您的可执行文件加载的DLL的代码。所以,你将无法在你的可执行文件的映射文件中找到它的符号。您需要首先确定地址在哪个模块中,然后找到该模块的符号映射。
使用像madExcept,EurekaLog或JclDebug这样的工具来提供这样的信息是非常容易的。您将通过这种方式获得更丰富的信息。
安装Eurekalog并让它为您完成工作 – 2015-02-10 08:04:52