Ist es möglich, eine EXE-Datei mit mehr als 4 GB auszuführen?

10

Ich habe in 7-Zip ohne Vorwarnung ein SFX-Archiv mit> 4 GB (die selbstextrahierenden Archive) erstellt. Als der Empfänger versuchte, es zu extrahieren, erhielt er dieses Fehlerband:

Geben Sie hier die Bildbeschreibung ein

Ich fand es, weil das .exegrößer als 4 GB ist. Nach der Installation von 7-Zip konnte er das Archiv extrahieren, aber ich frage mich, warum Windows eine solche ausführbare Datei nicht ausführen kann. Und ist es möglich, über eine Überschreibung?

Louis Waweru
quelle
2
Sie können normalerweise einfach nicht auf 32-Bit-Systemen
Ramhound
1
Um das zu erweitern, was Ramhound gesagt hat, ist es möglich, dass sich der 7-Zip-Selbstextraktor im RAM speichert, der für 32-Bit-Systeme eine maximale Zugriffsgröße von 4 GB hat. Es würde auch erklären, warum 7-Zip extrahieren konnte, da das Archiv nicht vollständig im Speicher gespeichert werden musste (obwohl dies davon abhängen würde, ob das Archiv solide war oder andere Komprimierungseinstellungen hatte).
Doktoro Reichard
Ja, ich dachte zuerst, das sei das Problem, aber er verwendet Win64 mit 16 GB RAM. Ich benutze es auch mit 8 GB.
Louis Waweru

Antworten:

10

Windows unterstützt keine ausführbaren Dateien mit einer Größe von mehr als 4 GB gemäß diesem Thread:

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

Der Kommentator "Igor Pavlov" ist der Schöpfer und Betreuer von 7-Zip. Während dieser Kommentar etwas knapp ist, gibt es in den Sourceforge-Foren andere Threads , die den gleichen Rat wiederholen. Ich glaube nicht, dass das Ausführen der ausführbaren Datei auf einem 64-Bit-Betriebssystem einen Unterschied machen würde, da dies möglicherweise eine Einschränkung der Größe einer ausführbaren Windows- Datei darstellt, dh eine Einschränkung des Windows PE-Formats selbst.

Dieser Artikel zum Schreiben von 64-Bit-Programmen schlägt Folgendes vor:

Das ausführbare "Image" (der im Speicher geladene Code / die Daten) einer Win64-Datei ist auf 2 GB begrenzt. Dies liegt daran, dass die AMD64 / EM64T-Prozessoren für die meisten Anweisungen die relative Adressierung verwenden und die relative Adresse in einem Dword gespeichert ist. Ein Dword kann nur einen relativen Wert von ± 2 GB halten.

Vermutlich hat Igor eine Möglichkeit gefunden, ± 2 GB zu verwenden, um 4 GB zu erreichen.

sahmeepee
quelle
1
Ein signiertes Wort hat eine Reichweite von 2.147.483.647. Ein vorzeichenloses Dword hat einen Bereich von 4.294.967.295, und diese Zahl ist die Quelle der meisten Einschränkungen in Windows und in 32-Bit-Systemen außerhalb davon.
Hashim
@ Hashim ist absolut korrekt, die Grenze ist 4GiB - 1B = 2^32 - 1 bytes = 4,294,967,295 bytes. Ich konnte es unter Windows 10 64-Bit überprüfen, indem ich mit WinRAR selbstextrahierende Archive in Form von EXE-Dateien erstellte. Eine ausführbare Datei mit einer Größe von 4GiBwird nicht gestartet, 4GiB - 1Bfunktioniert aber einwandfrei.
Robin Hartmann
0

Eine selbstextrahierende ausführbare Datei mit mehr als 4 GB ist extrem, da für ausführbare Windows-Dateien wie * .exe, * .dll usw. für PE32 und eine 64-Bit-Version PE32 + (gilt für 32-Bit und 64) eine Beschränkung von 4 GB gilt -bit-Versionen).

Zweitens wird die ausführbare Datei vor der Ausführung vollständig in den Arbeitsspeicher geladen, und selbst wenn Sie nicht durch Windows eingeschränkt sind (aber Sie sind es), können Sie leicht durch die Hardware eingeschränkt werden, die in einem solchen Fall die physische Größe des Arbeitsspeichers darstellt

Nikola Dimitrijevic
quelle
Wie ich weiß, gibt es Möglichkeiten, Windows anzuweisen, nur einen bestimmten Abschnitt der exe-Datei zu laden, nicht die gesamte Datei mit Ressourcen. Ich denke, dass viele große DOS-Programme diesen Trick auch verwenden, da das Limit in 16-Bit x86 zu klein ist
phuclv