digitalmars.D - Re: DMD generated exes' size differ from PE headers
Walter Bright Wrote:bobef wrote:I'm walking the PE header sections to find out the file size. I find the maximum PointerToRawData and add SizeOfRawData of the section to find where the exe ends. It works with the files I've tested. When compiling exe file with DMD 1.055 and -g there are additional four bytes after the last section. Why is that? Is SizeOfRawData wrong or there is something else at the end?
I don't know. Could be alignment padding.
I found some article on MSDN that says that SizeOfRawData includes the alignment padding and something other was indicating the actual size, so this shouldn't be the case. I do like this: uint peFileSize(void[] data) { auto dos_header = cast(PIMAGE_DOS_HEADER)data; if(dos_header.e_magic != IMAGE_DOS_SIGNATURE) return -1; auto nt_header = cast(PIMAGE_NT_HEADERS)&data[dos_header.e_lfanew]; if(nt_header.Signature != IMAGE_NT_SIGNATURE) return -1; uint maxpointer, exesize; PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(nt_header); for(uint i=0; i<nt_header.FileHeader.NumberOfSections; i++, section++) { if(section.PointerToRawData > maxpointer) { maxpointer = section.PointerToRawData; exesize = section.PointerToRawData + section.SizeOfRawData; } } return exesize; } and if I do exesize = section.PointerToRawData + section.SizeOfRawData + section.SizeOfRawData%nt_header.OptionalHeader.SectionAlignment; then I get wrong results don't know why.
Jan 27 2010