VC的MAP文件是一个文本文件,记录了程序的入口地址、基地址、符号及其对应的地址的一个文本文件。下面对其中的内容做一简要的说明。
DllTwo //―――模块名
Timestamp is 4956e425 (Sun Dec 28 10:27:49 2008) //―――时间戳
Preferred load address is 10000000 //―――默认加载基地址
Start Length Name Class //各节的起始地址、长度、 0001:00000000 00000da6H .text CODE //节名、类型等信息 0001:00000db0 00000053H .text$x CODE 0002:00000000 000000e8H .idata$5 DATA 0002:000000e8 00000004H .CRT$XCA DATA …… 0002:00000100 000000b0H .rdata DATA …… 0002:0000045c 00000782H .idata$6 DATA 0002:00000be0 00000094H .edata DATA 0003:00000000 00000014H .data DATA 0003:00000018 00000354H .bss DATA
//各符号在节内的偏移地址、加载地址及符号出处 Address Publics by Value Rva+Base Lib:Object
0000:00000003 ___safe_se_handler_count 00000003 <absolute> 0000:00000000 ___ImageBase 10000000 <linker-defined> 0001:00000000 ??4CDllTwo@@QAEAAV0@ABV0@@Z 10001000 f i DllTwo.obj …… 0001:00000804 __DllMainCRTStartup@12 10001804 f MSVCRT:crtdll.obj …… 0001:00000cd0 ?CrashFun@@YAHXZ 10001cd0 f DllTwo.obj 0001:00000cf0 _DllMain@12 10001cf0 f DllTwo.obj 0001:00000d00 ?PrintInDllTwo@@YAHXZ 10001d00 f DllTwo.obj
entry point at 0001:00000804 //模块的入口地址
Static symbols //静态符号
0001:00000463 __catch$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z$0 10001463 f i CIL library: CIL module 0001:000004de _pre_c_init 100014de f MSVCRT:crtdll.obj 0001:000006ee ___DllMainCRTStartup 100016ee f MSVCRT:crtdll.obj 0001:00000db0 ……
Exports //导出符号
ordinal name //序号和名称
1 ??4CDllTwo@@QAEAAV0@ABV0@@Z (public: class CDllTwo & __thiscall CDllTwo::operator=(class CDllTwo const &)) 2 ?CrashFun@@YAHXZ (int __cdecl CrashFun(void)) 3 ?PrintInDllTwo@@YAHXZ (int __cdecl PrintInDllTwo(void)) |
说明:
1. Rva+Base地址,是加载地址,其中Rva是相对虚拟地址(Relative Virtual Address,RVA),是指令在所在节内的偏移量;Base是加载的基地址;关于此地址的更多信息,参看动态库的加载部分。
2. VC 8.0生成的Map文件,已经去掉了“导出行”,因此上面的文件,没有源代码行到入口地址之间的映射信息。