Каков максимальный размер PE-файла в 64-битной Windows? - PullRequest
12 голосов
/ 08 августа 2011

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

Ответ

4ГБ действительно является жестким ограничением для ВСЕХ переносимых исполняемых файлов (32-битных и 64-битных PE +).

Ответы [ 2 ]

12 голосов
/ 23 августа 2011

Согласно спецификации это 32-битное значение без знака для изображения PE32 +, как и изображение PE32.

Однако в моем тестировании с 3264-разрядные и 64-разрядные приложения (файлы PE32 / PE32 +) в Windows 7 SP1 Home Premium x64, максимальный размер файла для любого из них составляет от 1,8-1,85 ГБ .

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

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

7 голосов
/ 08 августа 2011

Согласно спецификации COFF / PE32 , размер изображения для действительного файла PE32 + (64 бит / (PE +) - это 4-байтовое значение без знака.

...