Можно ли запустить файл размером более 4 ГБ .exe?

10

Я создал SFX-архив размером более 4 ГБ (самораспаковывающиеся архивы) в 7-Zip без предупреждения. Когда получатель попытался извлечь его, он получил эту ленту ошибок:

введите описание изображения здесь

Я нашел это, потому что .exeбольше, чем 4 ГБ. После установки 7-Zip он смог извлечь архив, но мне интересно, почему Windows не может запустить такой исполняемый файл? И возможно ли через какое-то переопределение?

Луи Ваверу
источник
2
Обычно вы можете просто не на 32-битных системах
Ramhound
1
Чтобы расширить сказанное Ramhound, возможно, что самораспаковщик 7-Zip хранит себя в оперативной памяти, которая для 32-разрядных систем имеет максимальный размер доступа 4 ГБ. Это также объясняет, почему 7-Zip удалось извлечь, поскольку архив не нужно было полностью хранить в памяти (хотя это будет зависеть от того, был ли архив твердым или имел другие параметры сжатия).
Доктор Рейхард
Да, сначала я подумал, что это проблема, но он использует Win64 с 16 ГБ ОЗУ. Я использую это тоже с 8GB.
Луи Ваверу

Ответы:

10

Windows не будет поддерживать исполняемые файлы размером более 4 ГБ в соответствии с этим потоком:

http://sourceforge.net/p/sevenzip/discussion/45798/thread/337fc13e/

Комментатор "Игорь Павлов" является создателем и разработчиком 7-Zip. Хотя этот комментарий несколько краткий, на форумах sourceforge есть другие темы, которые повторяют тот же совет. Я не верю, что запуск исполняемого файла в 64-битной ОС будет иметь какое-либо значение, так как это может быть ограничением размера исполняемого файла Windows, то есть ограничением самого формата Windows PE .

Эта статья о написании 64-битных программ предполагает, что:

Размер исполняемого «образа» (код / ​​данные, загруженный в память) файла Win64 ограничен 2 ГБ. Это связано с тем, что процессоры AMD64 / EM64T для большинства команд используют относительную адресацию, а относительный адрес хранится в слове. Меч может удерживать только относительное значение ± 2 ГБ.

Предположительно, Игорь нашел способ использовать ± 2 ГБ для получения 4 ГБ.

sahmeepee
источник
1
У подписанного меча есть диапазон 2 147 483 647. Беззнаковое слово имеет диапазон 4 294 967 295, и это число является источником большинства ограничений в Windows и в 32-разрядных системах за ее пределами.
Хашим
@ Хашим абсолютно прав, предел есть 4GiB - 1B = 2^32 - 1 bytes = 4,294,967,295 bytes. Я смог проверить это в Windows 10 64-bit, создав самораспаковывающиеся архивы с WinRAR в виде .EXE-файлов. Исполняемый файл размером 4GiBне запускается, но 4GiB - 1Bработает нормально.
Робин Хартманн
0

Крайне важно иметь самораспаковывающийся исполняемый файл размером более 4 ГБ, поскольку существует ограничение в 4 ГБ для исполняемых файлов Windows, таких как * .exe, * .dll и т. Д. Для PE32 и 64-разрядной версии PE32 + (применяется к 32-разрядным и 64-разрядным версиям). версии).

Во-вторых, исполняемый файл полностью загружается в оперативную память перед выполнением, и даже если вы не ограничены Windows (но вы есть), вы можете быть легко ограничены аппаратным обеспечением, которое в данном случае является физическим объемом оперативной памяти.

Никола Димитриевич
источник
Как я знаю, есть способы заставить Windows загружать только определенный раздел exe-файла, а не весь файл с ресурсами. Я думаю, что многие большие программы для DOS тоже используют этот прием, так как ограничение в 16-битном x86 слишком мало
phuclv