64bit - hvad er den maksimale størrelse af en PE-fil på 64-bit Windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Det forekommer mig, at det altid vil være 4 GB, fordi det bruger den samme størrelse datatype (A DWORD)? Er det ikke en DWORD for SizeOfImage altid 32-bits? Eller tager jeg fejl ved denne begrænsning?


Svar



4GB virker faktisk at være den hårde grænse for ALL Portable Executable s (32-bit og 64-bit PE +).

Bedste reference


Ifølge spec er det 32-bit usigneret værdi til et PE32 + billede ligesom et PE32 billede. [2]


Men i min testning med både 32-bit og 64-bit applikationer (PE32/PE32 + -filer) på Windows 7 SP1 Home Premium x64 er den maksimale filstørrelse for enten mellem 1.8-1.85GB .


Jeg testede ved at oprette en meget grundlæggende C-eksekverbar med Visual Studio (~ 8K til 32-bit og 9K for 64-bit) og tilføjede en tom kode sektion til PE-header, indtil Windows ikke længere skulle indlæse det, og derefter søgte binære grænsen. Kig på processen med vmmap viste, at næsten alle de første 2 GB adresserum var billedet (inklusive eventuelle efterfølgende indlæste DLL'er som kernel32.dll). Grænsen var den samme for mig med både 32 og 64-bit processer. 64-bitsprocessen havde flagget angivet i den s sektion, der er skrevet af NT Header, og angiver, at det kunne håndtere adresser> 2 GB. Det kunne også tildele hukommelse til ikke-billed sektioner over 2 GB-grænsen.


Det ser ud til, at billedet er nødvendigt for at passe ind i sin helhed i den nederste 2 GB VA plads til processen, hvilket betyder, at SizeOfImage behandles et signeret 32-bit heltal af lasteren effektivt.

Andre referencer 1


Ifølge COFF/PE32 spec er billedstørrelsen for en gyldig PE32 + (64 bit/(PE +) fil en 4 byte usigneret værdi. [3]