Несоответствие адреса точки входа в программу и map-файла

yolki

Проясните, кто-нибудь, пожалуйста.
MS Visual C 2008 Express Edition
a.c:

#include <stdio.h>

int main
{
printf("Hello\n");
return 0;
}

cl /Fm a.c

Оптимизирующий 32-разрядный компилятор Microsoft (R) C/C++ версии 15.00.30729.01 для 80x86
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

a.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.

/out:a.exe
/map:a.map
a.obj

a.map:

a

Timestamp is 4b27821b (Tue Dec 15 15:33:31 2009)

Preferred load address is 00400000

Start Length Name Class
0001:00000000 00008884H .text CODE
...
...
0000:00000000 __except_list 00000000 <absolute>
0000:00000003 ___safe_se_handler_count 00000003 <absolute>
0000:00000000 ___ImageBase 00400000 <linker-defined>
0001:00000000 _main 00401000 f a.obj
0001:00000014 _printf 00401014 f LIBCMT:printf.obj
0001:000000c3 __get_printf_count_output 004010c3 f LIBCMT:printf.obj
0001:00000254 _mainCRTStartup 00401254 f LIBCMT:crt0.obj
0001:0000025e ___iob_func 0040125e f LIBCMT:_file.obj
0001:00000264 ___initstdio 00401264 f LIBCMT:_file.obj
0001:00000315 ___endstdio 00401315 f LIBCMT:_file.obj
0001:00000335 __lock_file 00401335 f LIBCMT:_file.obj
0001:00000376 __lock_file2 00401376 f LIBCMT:_file.obj
0001:000003a8 __unlock_file 004013a8 f LIBCMT:_file.obj
0001:000003e4 __unlock_file2 004013e4 f LIBCMT:_file.obj
0001:00000413 __stbuf 00401413 f LIBCMT:_sftbuf.obj
0001:000004af __ftbuf 004014af f LIBCMT:_sftbuf.obj
0001:000004e3 ?0_Lo@PAUlocalei@@Z 004014e3 f i LIBCMT:output.obj
0001:00000610 __output_l 00401610 f LIBCMT:output.obj
0001:000011a8 __initp_misc_invarg 004021a8 f LIBCMT:invarg.obj
0001:000011b7 __invoke_watson 004021b7 f LIBCMT:invarg.obj
0001:000012df __invalid_parameter 004022df f LIBCMT:invarg.obj
0001:00001305 __get_errno_from_oserr 00402305 f LIBCMT:dosmap.obj
0001:00001347 __errno 00402347 f LIBCMT:dosmap.obj
0001:0000135a ___doserrno 0040235a f LIBCMT:dosmap.obj
0001:0000136d __dosmaperr 0040236d f LIBCMT:dosmap.obj
0001:00001390 __SEH_prolog4 00402390 f LIBCMT:sehprolg4.obj
0001:000013d5 __SEH_epilog4 004023d5 f LIBCMT:sehprolg4.obj
0001:000013f0 __except_handler4 004023f0 f LIBCMT:chandler4.obj
0001:0000157c ?__CxxUnhandledExcep@YGJPAU_EXCEPTIO@@Z 0040257c f LIBCMT:unhandld.obj
0001:000015be ___CxxSetUnhandledExceptionFilter 004025be f LIBCMT:unhandld.obj
0001:000015cc __crt_waiting_on_module_handle 004025cc f LIBCMT:crt0dat.obj
0001:000015fc __amsg_exit 004025fc f LIBCMT:crt0dat.obj
0001:00001625 ___crtCorExitProcess 00402625 f LIBCMT:crt0dat.obj
0001:00001650 ___crtExitProcess 00402650 f LIBCMT:crt0dat.obj
0001:00001668 __lockexit 00402668 f LIBCMT:crt0dat.obj
0001:00001671 __unlockexit 00402671 f LIBCMT:crt0dat.obj
0001:00001697 __initterm_e 00402697 f LIBCMT:crt0dat.obj
0001:000016bb __cinit 004026bb f LIBCMT:crt0dat.obj
0001:0000186c _exit 0040286c f LIBCMT:crt0dat.obj
0001:00001882 __exit 00402882 f LIBCMT:crt0dat.obj
0001:00001898 __cexit 00402898 f LIBCMT:crt0dat.obj
0001:000018a7 __c_exit 004028a7 f LIBCMT:crt0dat.obj
0001:000018b6 __init_pointers 004028b6 f LIBCMT:crt0dat.obj
0001:00001904 __NMSG_WRITE 00402904 f LIBCMT:crt0msg.obj
...

ожидаемое место входа - _mainCRTStartup (0001:00000254)
однакож:


CreateProcess(...,
DEBUG_ONLY_THIS_PROCESS |
PROCESS_VM_READ | PROCESS_VM_WRITE ...);

WaitForDebugEvent(&DebEv...);


...
sprintf(szbuf,"Process started. pid: %d threadid: %d Image base: %p StartAddress: %p",
DebEv.dwProcessId,
DebEv.dwThreadId,
DebEv.u.CreateProcessInfo.lpBaseOfImage,
DebEv.u.CreateProcessInfo.lpStartAddress );

выдаёт следующее:

Process started. pid: 1732 threadid: 1156 Image base: 00400000 StartAddress: 00401254

Откуда лишние 0x1000 ?!?!?!

geja_03

Заголовок PE?

yolki

т.е. ты хочешь сказать, что заголовок PE загружается по адресу 0x400000 ?!
проинспектировал память на 0x400000 - начинается даже с MZ!

geja_03

Ну собственно весь файл маппится по базовому адресу...

yolki

читаю тут:
http://msdn.microsoft.com/en-us/magazine/cc301805.aspx
нужно подумать

yolki

не совсем. я уже нарыл ссылку, где расписан механизм маппинья - там не 1:1.

yolki

http://msdn.microsoft.com/en-us/magazine/ms809762.aspx тоже оказалось по делу.
Оставить комментарий
Имя или ник:
Комментарий: