Содержимое МАР-файла
Пример МАР-файла показан в листинге 8-1. Верхняя часть МАР-файла содержит имя модуля, метку даты/времени (timestamp), указывающую, когда LINK.EXE скомпоновал модуль и предпочтительный адрес загрузки. После заголовка расположена информация, которая показывает, какие секции присоединил компоновщик из различных OBJ- и LIB-файлов.
Далее следует информация об общих (public) функциях. Обратите внимание на эту часть. Если в программе есть С-функции, объявленные как статические (static), то они не будут показаны в МАР-файле. К счастью, номера строк все еще будут отражать статические функции.
Важными данными для общих функций являются их имена и информация в колонке Rva+Base, в которой указываются их стартовые адреса. За секцией общих функций следует строчная информация. Строки отображаются следующим образом:
10 0001:00000030
Первое число — номер строки, а второе представляет собой смещение от начала секции кода, в которой находится эта строка. Это выглядит довольно путано, но позже мы рассмотрим способ преобразования адреса в имя исходного файла и номер строки в нем.
Если модуль содержит экспортируемые функции, то они перечислены в заключительной секции МАР-файла. Можно получить эту же информацию, запустив утилиту DUMPBIN с параметром <EXPORTS<ИМЯ_МОДУЛЯ>.
Листинг 8-1.Пример MAP-файла
MapDLL
Timestamp is 37f41936 (Thu Sep 30 22:15:18 1999)
Preferred load address is 03900000
Start Length Name Class
0001:00000000 00001421H .text CODE
0002:00000000 0000012cH .rdata DATA
0002:00000130 00000193H .edata DATA
0003:00000000 00000104H .CRT$XCA DATA
0003:00000104 00000104H .CRT$XCZ DATA
0003:00000208 00000104H .CRT$XIA DATA
0003:0000030с 00000104Н .CRT$XIZ DATA
0003:00000410 00000176H .data DATA
0003:00000588 00000030H .bss DATA
0004:00000000 00000014H .idata$2 DATA
0004:00000014 00000014H .idata$3 DATA
0004:00000028 00000050H .idata$4 DATA
0004:00000078 00000050H .idata$5 DATA
0004:000000c8 00000179H .idata$6 DATA
Address Publics by Value Rva+Base Lib:0bject
0001:00000030 _DllMain@12 03901030 f MapDLL.obj
0001:0000004с ?MapDLLFunction@@YAHXZ 0390104с f MapDLL.obj
0001:00000076 ?MapDLLHappyFunc@@YAPADPAD@Z 03901076 f MapDLL.obj
0001:000000f6 _printf 039010f6 f MSVCRTD:MSVCRTD.dll
0001:000000fc _chkesp 039010fc f MSVCRTD:MSVCRTD.dll
0001:00000110 _CRT_INIT@12 03901110 f MSVCRTD:crtdll.obj
0001:00000220 _DllMainCRTStartup@12 03901220 f MSVCRTD:crtdll.obj
0001:00000314 _free_dbg 03901314 f MSVCRTD:MSVCRTD.dll
0001:0000031a _initterm 0390131a f MSVCRTD:MSVCRTD.dll
0001:00000320 _onexit 03901320 f
MSVCRTD:atonexit.obj
0001:00000360 __atexit 03901360 f
MSVCRTD:atonexit.obj
0001:00000378 _malloc_dbg 03901378 f MSVCRTD:MSVCRTD.dll
0001:0000037e __dllonexit 0390137e f MSVCRTD:MSVCRTD.dll
0002:0000001c ??_C@_08JKC@crtdll?4c?$AA@ 0390301с MSVCRTDrcrtdll.obj
0003:00000000 __xc_a 03904000
MSVCRTD:cinitexe.obj
0003:00000104 __xc_z 03904104
MSVCRTD:cinitexe.obj
0003:00000208 __xi_a 03904208
MSVCRTD:cinitexe.obj
0003:0000030с __xi_z 0390430с
MSVCRTD:cinitexe.obj
0003:0000058с _adjust_fdiv 0390458с <common>
0003:00000598 __onexitend 03904598 <common>
0003:000005a8 __onexitbegin 039045a8 <common>
0003:000005ac _pRawDllMain 039045ac <common>
0004: 00000000 _IMPORT_DESCRIPTOR_MSVCRTD 03905000 MSVCRTD:MSVCRTD.dll
0004:00000014 _NULL_IMPORT_DESCRIPTOR 03905014 MSVCRTD:MSVCRTD.dll
0004:00000078 __imp__malloc_dbg 03905078 MSVCRTD:MSVCRTD.dll
0004:0000007с _imp chkesp 0390507с MSVCRTD:MSVCRTD.dll
0004:00000080 imp free_dbg 03905080 MSVCRTD:MSVCRTD.dll
0004:00000084 _imp initterm 03905084 MSVCRTD:MSVCRTD.dll
0004:00000088 _imp_jjrintf 03905088 MSVCRTD:MSVCRTD.dll
0004:0000008с _imp adjust_fdiv 0390508с MSVCRTD:MSVCRTD.dll
0004:00000090 _imp___dllonexit 03905090 MSVCRTD:MSVCRTD.dll
0004:00000094 _imp onexit 93905094 MSVCRTD:MSVCRTD.dll
0004:00000098 \177MSVCRTD_NULL_THUNK_DATA 03905098 MSVCRTD:MSVCRTD.dll
entry point at 0001:00000220
Line numbers for .\Debug\MapDLL.obj(D:\MapFile\MapDLL\MapDLL.cpp)
segment '. text
10 0001:00000030 12 0001:0000003b 19 0001:00000041 20 0001:00000046' 24 0001:0000004c 25 0001:00000050 26 0001:00000067 27 0001:0000006c 35 0001:00000076 36 0001:0000007a 37 0001:0000007f 38 0001:00000096 39 0001:0000009c 40 0001:0000009f 30 0001:000000a9 31 0001:OOOOOOad 32 0001:000000c4
Line numbers for g:\vc\LIB\MSVCRTD.lib(atonexit.c) segment .text
84 0001:00000320 89 0001:00000324 98 0001:0000035b 103 0001:00000360
104 0001:00000363 105 0001:00000376
Line numbers for g:\vc\LIB\MSVCRTD.lib(crtdll.c) segment .text
135 0001:00000110 140 0001:00000114 141 0001:0000011a 142
0001:00000123
143 0001:00000130 147 0001:00000132 156 0001:00000139 164
0001:00000147
170 0001:0000014d 175 0001:00000175 177 0001:0000017с 179
0001:00000187
184 0001:00000193 189 0001:OOOOOlaS 192 0001:000001b4 219 0001:OOOOOlbc
220 0001:000001c5 222 0001:000001cd 227 0001:OOOOOlel 228 0001:000001e9
236 0001:000001ee 238 0001:00000202 242 0001:0000020c 243 0001:00,000211
251 0001:00000220 252 0001:00000224 258 0001:0000022b 259 0001:0000023a
261 0001:00000241 263 0001:0000024d 264 0001:00000256 266 0001:0000026b
267 0001:00000271 269 0001:00000285 270 0001:0000028b 273 0001:0000028f
276 0001:000002a3 284 0001:000002af 287 0001:000002be 289 0001:000002ca
290 0001:000002df 292 0001:000002e6 293 0001:000002f5 296 0001:ОООООЗОа
297 0001:0000030d '
Exports
ordinal name
1 ?MapDLLFunction@@YAHXZ (int_cdecl MapDLLFunction(void))
2 ?MapDLLHappyFunc@@YAPADPAD@Z (char * _cdecl MapDLLHappyFunc(char *))