Чи можливо запустити файл більше. 4GB .exe?


10

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

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

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


2
Ви, як правило, не можете використовувати 32-бітні системи
Ramhound

1
Щоб розширити те, що сказав Ramhound, можливо, 7-Zip саморозпарювач зберігає себе в оперативній пам'яті, яка для 32-бітових систем має максимальний розмір доступу 4 Гб. Це також пояснило б, чому 7-Zip вдалося витягнути, оскільки архів не потрібно було повністю зберігати в пам'яті (хоча це залежало б від того, чи був архів твердим чи були інші настройки стиснення).
Докторо Рейхард

Так, я спочатку думав, що це проблема, але він використовує Win64 з 16 ГБ оперативної пам’яті. Я також використовую його з 8 Гб.
Луї Ваверу

Відповіді:


10

Windows не підтримує виконувані файли розміром більше 4 Гб відповідно до цієї теми:

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

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

Ця стаття щодо написання 64-розрядних програм пропонує:

Виконане "зображення" (код / ​​дані, завантажені в пам'ять) файлу Win64 обмежена розміром до 2 Гб. Це відбувається тому, що процесори AMD64 / EM64T використовують більшість інструкцій щодо відносної адреси, а відносна адреса зберігається в слові. Dword здатний вмістити лише 2 Гб.

Імовірно, Ігор придумав спосіб використання ± 2 ГБ для досягнення 4 ГБ.


1
Підписаний слово має діапазон 2,147,483,647. Непідписаний dword має діапазон 4,294,967,295, і це число є джерелом більшості обмежень в Windows та 32-бітних системах поза ним.
Хашим

@Hashim абсолютно правильний, межа є 4GiB - 1B = 2^32 - 1 bytes = 4,294,967,295 bytes. Мені вдалося перевірити це в Windows 10 64-розрядному, створивши архіви, що саморозпаковуються, за допомогою WinRAR у вигляді .EXE-файлів. Виконаний файл з розміром 4GiBне запускається, але 4GiB - 1Bпрацює чудово.
Робін Хартманн

0

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

По-друге, виконуваний файл завантажується повністю в оперативну пам’ять перед виконанням, і навіть якщо ви не обмежені Windows (але ви є), ви можете бути легко обмежені апаратним забезпеченням, що є фізичною кількістю оперативної пам'яті в такому випадку


Як я знаю, є способи сказати Windows завантажувати лише певний розділ файлу EXE, а не весь файл з ресурсами. Я думаю, що багато великих програм DOS теж використовують цей трюк, оскільки ліміт у 16-розрядному x86 занадто малий
phuclv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.