каков максимальный размер PE-файла в 64-разрядной Windows?

Мне кажется, что это всегда будет 4GB, потому что он использует тот же тип данных размера (DWORD)? Это не DWORD для SizeOfImage всегда будет 32-бит? Или я ошибаюсь насчет этого ограничения?

ответ

4GB действительно кажется жестким пределом всех портативных исполняемых файлов (32-бит и 64-бит PE+).

2 ответов


по словам spec это 32-бит значение без знака для PE32+ изображения как изображения PE32.

однако в моем тестировании с 32-разрядными и 64-разрядными приложениями (PE32/PE32+ files) в Windows 7 SP1 Home Premium x64 максимальный размер файла для любого из них находится между 1.8-1.85 ГБ.

я протестировал, создав очень простой исполняемый файл C с Visual Studio (~8K для 32-разрядного и 9K для 64-разрядного) и добавил пустой раздел кода в заголовок PE до тех пор, пока Windows больше не загрузит его, а затем двоичный поиск предела. Просмотр процесса с vmmap показал, что почти все первые 2 ГБ адресного пространства были изображением (включая любые впоследствии загруженные библиотеки DLL, такие как kernel32.файл DLL.) Ограничение было одинаковым для меня как с 32, так и с 64-битными процессами. 64-битный процесс имел флаг, установленный в разделе заголовка файла заголовка NT, заявив, что он может обрабатывать адреса >2GB. Он также может выделять память для разделы без изображений выше предела 2GB.

похоже, что изображение должно полностью поместиться в Нижнем 2GB пространства VA для процесса, что означает, что SizeOfImage эффективно обрабатывается 32-разрядным целым числом со знаком загрузчика.


по словам спецификации кофр / ПЭ32, размер изображения для допустимого файла PE32+ (64 бит/(PE+) - 4 байта без знака.