Много раз почитал msdn, и http://www.wasm.ru/article.php?article=green2red02 , поглядел кучу файлов разных компиляторов.. Мне не удалось повторить данное число правильно для этих же файлов. Естественно пресчитывал секции с атрибутом IMAGE_SCN_CNT_INITIALIZED_DATA. Пока тупулю с суммой VirtualSize, выравниваю по FileAligment. Получается что то близкое... Что еше нужно туда добавить? Или если не понятно, что я написал выше, вопрос следующий "Как подсчитать IMAGE_OPTIONAL_HEADER.SizeOfInitializedData?" Спасибо.
VS2008 сейчас установил нам это поле как сумму raw size всех секций, кроме секции кода. Но SizeOfInitializedData фактически нигде не используется же, можно и ноль выставить...
Хорошо. файл notepad++.exe 5.0.3 я считаю по VirualSize = 718E4h и того 72000h по RawSize = 66000h откуда линкер берет 73000? Код (Text): FILE HEADER VALUES 14C machine (x86) 4 number of sections 4895C3FF time date stamp Sun Aug 03 18:43:11 2008 0 file pointer to symbol table 0 number of symbols E0 size of optional header 103 characteristics Relocations stripped Executable 32 bit word machine OPTIONAL HEADER VALUES 10B magic # (PE32) 8.00 linker version 74000 size of code 73000 size of initialized data 0 size of uninitialized data 5FF14 entry point (0045FF14) 1000 base of code 75000 base of data 400000 image base (00400000 to 004E7FFF) 1000 section alignment 1000 file alignment 4.00 operating system version 1.00 image version 4.00 subsystem version 0 Win32 version E8000 size of image 1000 size of headers 0 checksum 2 subsystem (Windows GUI) 0 DLL characteristics 100000 size of stack reserve 1000 size of stack commit 100000 size of heap reserve 1000 size of heap commit 0 loader flags 10 number of directories 0 [ 0] RVA [size] of Export Directory 8610C [ C8] RVA [size] of Import Directory 9B000 [ 4CAE0] RVA [size] of Resource Directory 0 [ 0] RVA [size] of Exception Directory 0 [ 0] RVA [size] of Certificates Directory 0 [ 0] RVA [size] of Base Relocation Directory 0 [ 0] RVA [size] of Debug Directory 0 [ 0] RVA [size] of Architecture Directory 0 [ 0] RVA [size] of Global Pointer Directory 0 [ 0] RVA [size] of Thread Storage Directory 7CD48 [ 40] RVA [size] of Load Configuration Directory 0 [ 0] RVA [size] of Bound Import Directory 75000 [ 5FC] RVA [size] of Import Address Table Directory 0 [ 0] RVA [size] of Delay Import Directory 0 [ 0] RVA [size] of COM Descriptor Directory 0 [ 0] RVA [size] of Reserved Directory SECTION HEADER #1 .text name 730C9 virtual size 1000 virtual address (00401000 to 004740C8) 74000 size of raw data 1000 file pointer to raw data (00001000 to 00074FFF) 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 60000020 flags Code Execute Read SECTION HEADER #2 .rdata name 13130 virtual size 75000 virtual address (00475000 to 0048812F) 14000 size of raw data 75000 file pointer to raw data (00075000 to 00088FFF) 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 40000040 flags Initialized Data Read Only SECTION HEADER #3 .data name 11CD4 virtual size 89000 virtual address (00489000 to 0049ACD3) 5000 size of raw data 89000 file pointer to raw data (00089000 to 0008DFFF) 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers C0000040 flags Initialized Data Read Write SECTION HEADER #4 .rsrc name 4CAE0 virtual size 9B000 virtual address (0049B000 to 004E7ADF) 4D000 size of raw data 8E000 file pointer to raw data (0008E000 to 000DAFFF) 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 40000040 flags Initialized Data Read Only
djmans Вообще-то выравнивается каждая секция, а не куча вместе, как попало. Поэтому: 14000 + 12000 + 4D000 = 73000
Сейчас смотрели код линкера, наткнулись на процедуру посчёта размера данных и вспомнили про эту тему. В общем-то, скорее всего это уже не нужно, но пусть будет: упрощённый псевдокод вычисления размера данных в линкере из студии 2008 sp1. Код (Text): Для каждой конечной секции, включаемой в модуль: TmpFlags = SectionFlags & (IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_CNT_UNINITIALIZED_ DATA | IMAGE_SCN_LNK_OTHER); // 0x1E0 if (TmpFlags == IMAGE_SCN_CNT_CODE) SizeOfCode += ALIGNUP(VirtualSize, FileAlignment); else if (TmpFlags == IMAGE_SCN_CNT_INITIALIZED_DATA) if (эта секция - не ".debug" секция) SizeOfInitializedData += ALIGNUP(VirtualSize, FileAlignment); else if (TmpFlags == IMAGE_SCN_CNT_UNINITIALIZED_ DATA) SizeOfUninitializedData += ALIGNUP(VirtualSize, FileAlignment); if (эта секция - не ".debug" секция) ImageSize += ALIGNUP(ALIGNUP(VirtualSize, FileAlignment), SectionAlignment);