Czy można uruchomić plik .exe większy niż 4 GB?

10

Utworzyłem archiwum SFX> 4 GB (archiwa samorozpakowujące) w 7-Zip, bez ostrzeżenia. Kiedy odbiorca próbował go wyodrębnić, dostał tę wstążkę błędu:

wprowadź opis zdjęcia tutaj

Znalazłem to, ponieważ .exejest większy niż 4 GB. Po zainstalowaniu 7-Zip był w stanie rozpakować archiwum, ale zastanawiam się, dlaczego Windows nie może uruchomić takiego pliku wykonywalnego? Czy można to zrobić za pomocą obejścia?

Louis Waweru
źródło
2
Zwykle nie można po prostu korzystać z systemów 32-bitowych
Ramhound,
1
Aby rozwinąć to, co powiedział Ramhound, możliwe jest, że 7-Zip samorozpakowujący przechowuje się w pamięci RAM, która dla systemów 32-bitowych ma maksymalny rozmiar dostępu 4 GB. Wyjaśniałoby to również, dlaczego 7-Zip był w stanie wyodrębnić, ponieważ archiwum nie musiało być w pełni przechowywane w pamięci (choć to zależałoby od tego, czy archiwum było pełne, czy miało inne ustawienia kompresji).
Doktoro Reichard
Tak, na początku myślałem, że to jest problem, ale używa Win64 z 16 GB pamięci RAM. Używam go również z 8 GB.
Louis Waweru

Odpowiedzi:

10

System Windows nie obsługuje plików wykonywalnych większych niż 4 GB zgodnie z tym wątkiem:

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

Komentator „Igor Pawłow” jest twórcą i opiekunem 7-Zip. Chociaż ten komentarz jest nieco ostry, na forach sourceforge są inne wątki, które powtarzają tę samą radę. Nie sądzę, aby uruchomienie pliku wykonywalnego w 64-bitowym systemie operacyjnym miało jakąkolwiek różnicę, ponieważ może to być ograniczenie rozmiaru pliku wykonywalnego systemu Windows , tj. Ograniczenie samego formatu Windows PE .

Ten artykuł na temat pisania programów 64-bitowych sugeruje, że:

Plik wykonywalny (obraz / kod załadowany do pamięci) pliku Win64 ma ograniczony rozmiar do 2 GB. Wynika to z faktu, że procesory AMD64 / EM64T używają adresowania względnego dla większości instrukcji, a adres względny jest przechowywany w dworze. Dword może utrzymywać jedynie względną wartość ± 2 GB.

Prawdopodobnie Igor wymyślił sposób wykorzystania ± 2 GB, aby osiągnąć 4 GB.

sahmeepee
źródło
1
Podpisany dword ma zasięg 2 147 483 647. Dwór bez znaku ma zakres 4 294 967 295, a liczba ta jest źródłem większości ograniczeń w systemie Windows i systemach 32-bitowych poza nim.
Hashim
@ Hashim jest absolutnie poprawny, limit wynosi 4GiB - 1B = 2^32 - 1 bytes = 4,294,967,295 bytes. Udało mi się to zweryfikować w 64-bitowym systemie Windows 10, tworząc samorozpakowujące się archiwa za pomocą WinRAR w postaci plików .EXE. Plik wykonywalny o rozmiarze 4GiBnie uruchamia się, ale 4GiB - 1Bdziała dobrze.
Robin Hartmann
0

Posiadanie samorozpakowującego się pliku wykonywalnego większego niż 4 GB jest ekstremalne, ponieważ istnieje limit 4 GB na pliki wykonywalne systemu Windows, takie jak * .exe, * .dll itp. Dla PE32 i 64-bitowej wersji PE32 + (dotyczy wersji 32-bitowych i 64 wersje bitowe).

Po drugie, plik wykonywalny jest ładowany całkowicie do pamięci RAM przed wykonaniem i nawet jeśli nie jesteś ograniczony przez system Windows (ale jesteś), możesz łatwo zostać ograniczony przez sprzęt, który w takim przypadku jest fizyczną ilością pamięci RAM

Nikola Dimitrijevic
źródło
Jak wiem, istnieją sposoby, aby powiedzieć Windowsowi, aby ładował tylko określoną sekcję pliku exe, a nie cały plik z zasobami. Myślę, że wiele dużych programów DOS również używa tej sztuczki, ponieważ limit w 16-bitowym x86 jest zbyt mały
phuclv 31.10.13