Wie erstelle ich ein 32-Bit-Programm aus einer 64-Bit-Version?

1822
Ooker

Viele Software unterstützt nur 64-Bit-Maschinen, da der Markt für 32-Bit derzeit klein ist. Für diejenigen, die mit 32-Bit-Computern nicht weiterkommen, können neuere Versionen nicht installiert werden. Dies kann zu Sicherheitsproblemen führen. Ein Beispiel ist Firefox / Waterfox .

Gibt es im Allgemeinen eine Möglichkeit, ein 32-Bit-Programm aus einer 64-Bit-Installation (.exe, .msi) zu erstellen?


Mehr dazu: Warum sollte die Sicherheit des Browsers Priorität haben?

5
Wenn Sie dies problemlos tun könnten, könnten Softwareanbieter dies auch für Sie tun. gronostaj vor 5 Jahren 3
Es ist auch erwähnenswert, dass, wenn Sie von einem x86-System sprechen, es wirklich wert ist, ein Upgrade durchzuführen, auch wenn es um die Auswirkungen auf die Sicherheit geht. Ein ansonsten identisches x86-System, das 32-Bit im Vergleich zu 64-Bit ausführt, führt (fast) immer zu einer besseren Ausführung von 64-Bit. Austin Hemmelgarn vor 5 Jahren 2
@AustinHemmelgarn Ich dachte, dass x86 eine andere Möglichkeit ist, 32-Bit zu sagen? Ooker vor 5 Jahren 0
Die richtigen Namen sind x86 und x86-64. x86-64 ist eine Obermenge von x86, man könnte also sagen, dass x86-64-Prozessoren auch x86 sind. Die x86-64-CPU kann wie eine x86-CPU verwendet werden, andere x86-64-Erweiterungen können jedoch nicht genutzt werden. gronostaj vor 5 Jahren 0
@gronostaj meintest du, dass x86-64 eine ** Teilmenge ** von x86 ist? Ooker vor 5 Jahren 0
Nein, x86-64 ist ein _superset_ von x86. Es enthält alle Funktionen von x86 + mehr. x86 ist eine Teilmenge von x86-64. gronostaj vor 5 Jahren 1
@Ooker Das hängt vom Kontext ab. Realistisch ausgedrückt bedeutet dies, wenn jemand nur „x86“ ohne bestimmte Qualifikationsmerkmale sagt, die Architektur als Ganzes, nicht nur die 32-Bit-Version. Austin Hemmelgarn vor 5 Jahren 1
@gronostaj Es ist wahrscheinlich erwähnenswert, dass Ihre Aussage nur für die Hardware zutrifft und nicht für einen direkten Vergleich zwischen Langmodus und Legacy-Modus auf 64-Bit-x86-CPUs gilt (zumindest sind einige Segmentregister im Langmodus nicht verwendbar.) ). Austin Hemmelgarn vor 5 Jahren 0
@gronostaj Ich verstehe was du meinst. Ich habe über die Definition von Superset nachgedacht. A ⊂ B ⇔ alle Elemente von A gehören zu B. Wenn Sie also sagen, dass "x86-64-Prozessoren auch x86" sind, kann nur verstanden werden, dass ersterer eine Teilmenge des letzteren ist. Ooker vor 5 Jahren 0
Ooh, ich verstehe es jetzt. Sie denken über Prozessorsets nach, die durch Feature-Sets definiert werden, und ich denke an Feature-Sets. gronostaj vor 5 Jahren 0
64-Bit hat die Systeme eigentlich nicht schneller gemacht. Es wurde mehr realer Speicher adressierbar. Nachdem 32> 64 stattgefunden hatten, war die Performance tatsächlich verlangsamt. Das heißt, ich stimme mit den anderen überein ... Upgrade. So viele Vorteile Hogstrom vor 5 Jahren 0

4 Antworten auf die Frage

12
LPChip

Nein das ist nicht möglich. Der Grund dafür ist ziemlich breit, für SuperUser vielleicht sogar zu breit, da Sie die Grundlagen erläutern müssten, wie x86 und x64 erstellt wurden und wie sich dies auf die Programmierung im Allgemeinen auswirkt.

Um es kurz zu erklären, kommt es darauf an:

In der Vergangenheit hatten wir 16-Bit-Prozessoren. Dann machte Intel den ersten 32-Bit-Prozessor, auch bekannt als x86. Dies ist der 8086, 80286 (kurz 286) usw. Dies war im Wesentlichen eine Modifikation der 16-Bit-Prozessoren mit zusätzlichen Befehlssätzen. Mit jeder neuen Version ihrer Prozessorserie fügte Intel der Prozessorfamilie weitere Befehlssätze hinzu, was dazu führte, dass der Befehlssatz viele Anweisungen enthielt. Intel konnte alte Befehlssätze nicht einfach entfernen, da dies keine Rückwärtskompatibilität zur Folge hätte, und Intel wollte ältere Prozessoren weiterhin unterstützen.

Da der Prozessor 32 Bit hat, gibt es eine obere Grenze, nämlich die höchste 32-Bit-Zahl. Dies bedeutet, dass die Speicherzuordnung nur bis zu 3,5 GB beträgt.

Früher waren Computer nicht so leistungsfähig. Wenn Intel also von Anfang an 64 Bit anstrebte, würde dies bedeuten, dass viel mehr Zeit für die Berechnung der gleichen Zahlen aufgewendet wurde. Die Leistung würde sich dadurch verschlechtern, da die zu berechnenden Zahlen größer sind.

Außerdem haben 32-Bit-Prozessoren lange Zeit gut funktioniert.

Irgendwann trat AMD auf den Markt und führte den 64-Bit-Prozessor ein. AMD erstellte ihre eigenen Befehlssätze, um das Arbeiten mit 64 Bits zu ermöglichen, während die Intel-Befehlssätze für 32 Bits im Takt gehalten werden, um eine Abwärtskompatibilität mit 32 Bits zu ermöglichen.

Da es sich tatsächlich um unterschiedliche Befehlssätze handelt, ruft ein Programmierer, der 32-Bit-Programme erstellt, andere Routinen auf als beim Erstellen von 64-Bit-Programmen.

Nun, da ich erkläre, warum dies schwierig ist, lasst uns das Problem weiterhin aus Programmiersicht erklären.

Wenn Sie ein Programm codieren, schreiben Sie zuerst Ihren Code. Wenn Ihr Code für 32-Bit-Programme abwärtskompatibel ist, können Sie weder 64-Bit-Nummern verwenden noch mehr als 3,5 GB Speicher gleichzeitig adressieren. Grundsätzlich können Sie keine Grenzen überschreiten, denen 32-Bit-Programme ausgesetzt sind, oder Ihr Programm stürzt ab.

Da Sie jetzt über Code verfügen, können Sie Ihr Programm tatsächlich ausführen. Damit andere Personen Ihr Programm ausführen können, müssen Sie den Code in eine ausführbare Datei kompilieren. Dies bedeutet, dass der einfach zu lesende Code in Anweisungen umgewandelt wird, die der Prozessor versteht. Während des Kompilierens geben Sie an, ob Ihr Programm unter x86 oder x64 ausgeführt werden soll, und der Compiler generiert Code unter Verwendung der auf dieser Prozessorarchitektur basierenden Befehlssätze.

Wie Sie sehen, können Sie eine ausführbare Datei nicht einfach ändern und für eine andere ausführbare Datei verwenden. Sie müssen das Programm zunächst in Code dekompilieren und dann mit anderen Anweisungen erneut kompilieren.

Vorausgesetzt, dass ein für x86 kompiliertes Programm nativ auf x64 funktioniert, kann man davon ausgehen, dass ein Programmierer ein x64-Programm erstellt, da er die Grenzen der x86-Architektur überschreiten wird. Selbst wenn Sie aus der x64-Version eine x86-Version machen möchten, ist das Programm wahrscheinlich instabil, da Sie die Einschränkungen der Möglichkeiten eines 32-Bit-Programms aufheben.

Nettes Schreiben. Technisch nicht ganz korrekt, aber als vereinfachte Erklärung wird es gut funktionieren. Tonny vor 5 Jahren 6
Vielen Dank. Ja, es ist schwer, es technisch korrekt zu machen, wenn man sich einschränken muss. Dies ist das Beste, was ich tun kann, um es für SuperUser geeignet zu halten. LPChip vor 5 Jahren 2
9
phuclv

Theoretisch geht das!

Es gibt Möglichkeiten, aus einem neutralen Bytecode / einer internen Darstellung in die Binärdaten einer bestimmten Architektur zu übersetzen, z. B. wie moderne Compiler / JITters funktionieren. Es gibt auch Emulatoren, auf denen Programme für eine andere Architektur der aktuellen ausgeführt werden. Bochs und Qemu sind zwei der bekanntesten. Sehen:

Trotzdem muss ich noch niemanden sehen, der einen solchen Konverter für ein einzelnes Binärprogramm schreibt, denn im Grunde müssen Sie auch alle System- und Bibliotheksaufrufe emulieren, was besser wäre, wenn Sie den gesamten Emulator ohnehin ausführen würden. Qemu kann auch nur den Benutzerraum emulieren, so dass es tatsächlich möglich ist, ein Programm zusammen mit den erforderlichen Bibliotheken ohne ein vollwertiges Betriebssystem auszuführen

Wenn Ihr PC jedoch nur aus 32 Bit besteht, bedeutet dies, dass er bereits mehr als 10 Jahre alt ist. So ziemlich alle Intel - CPUs ab Pentium 4 Prescott in 2004 weiter (abgesehen von einigen frühen Atom CPUs) und alle AMD - Prozessoren von Athlon 64 in 2003 weiter sind 64-Bit - fähig. Es ist Zeit für ein Update.

Wenn Ihr PC neu genug ist, um x86_64 und VT-x zu unterstützen, können Sie eine virtuelle 64-Bit-Maschine innerhalb des Hosts ausführen. Dies wird jedoch nicht empfohlen und die Leistung ist noch schlechter als die Ausführung eines 64-Bit-Betriebssystems mit 32-Bit VM innen. Ein 64-Bit-Betriebssystem benötigt nicht den doppelten Speicherplatz im Vergleich zu einem 32-Bit-Betriebssystem, wie viele glauben. Daher ist ein 64-Bit-Betriebssystem selbst mit nur 2 GB RAM in der Regel noch schneller, da es doppelt so viele Register gibt andere Dinge. Zwischen 1 und 2 GB RAM ist fraglich, aber ich würde 64-Bit verwenden


In Bezug auf Sicherheitsmaßnahmen sind 32-Bit-Betriebssysteme bei Sicherheits-Patches jedoch häufig zu spät . Zum Beispiel werden die Patches Meltdown und Specter mehr als ein halbes Jahr nach dem Patch von 64-Bit-Linux für 32-Bit-Linux gepusht . Meltdown Patches werden für 64-Bit - Windows 10 bereitgestellt Build 1507 und bis aber 32-Bit - Benutzer sind erst seit Build 1511 geschützt . Und selbst wenn sie gepatcht werden, werden solche alten Maschinen in der Regel viel mehr Auswirkungen auf die Leistung haben, da sie nicht über die neuen Anweisungen und Funktionen verfügen, um die Verlangsamung auszugleichen. Aus diesem Grund aktiviert MS den Patch auf einigen alten PCs nicht, es sei denn, der Benutzer hat dies ausdrücklich gesagt.

Manchmal werden sie überhaupt nicht gepatcht, da nicht genügend Benutzer vorhanden sind, und daher wenig Anreiz, die enorme Anstrengung aufzuwenden. Das Problem lässt sich auch ohne Hardware-Support nicht beheben, wenn es sich um einen Hardwarefehler handelt. Bei jüngsten Seitenkanalangriffen wie Specter oder L1TF ist beispielsweise auch ein aktualisierter Mikrocode erforderlich. Wenn also der Hersteller der CPU und / oder des Mainboards kein Firmware-Update veröffentlicht, haben Sie kein Glück! Diese Fehler betreffen CPUs in den letzten zwei Jahrzehnten. Es ist jedoch nicht möglich, Patches für sehr alte Systeme bereitzustellen. Windows 7 hat auch die Pentium 3-Unterstützung eingestellt, weil es ohne SSE2-Unterstützung zu schwierig zu patchen ist oder weil zu wenige Personen auf diesen CPUs arbeiten.

32-Bit-Windows ist auch anfälliger, weil:

Wenn Sie ein 64-Bit-Betriebssystem in einem Emulator ausführen, ist es sogar langsamer. Selbst wenn Sie die Crawling-Geschwindigkeit akzeptieren und einen Emulator verwenden, können Malware auf dem Host die virtuelle Maschine in einem solchen anfälligen System dennoch angreifen. Zeit für ein Update, wenn Sie wirklich Wert auf Sicherheit legen, oder Sie müssen mit einem weniger sicheren System auf unbestimmte Zeit leben

Lesen Sie weiter:

"Solche alten Maschinen werden viel mehr Auswirkungen auf die Leistung haben, da sie nicht über die neuen Anweisungen und Funktionen verfügen, um die Verlangsamung auszugleichen." - ** Das stimmt nicht ganz. ** Es gibt absolut keinen Grund, ich könnte kein 32-Bit-Betriebssystem mit einem i7 8086K und Windows 10 ausführen. Nur weil das System ein 32-Bit-Betriebssystem ausführt bedeutet nicht, dass es uralt ist. Ramhound vor 5 Jahren 2
Auf diesen Systemen ist es besser, ein 64-Bit-Betriebssystem auszuführen. Falls ein 32-Bit-Betriebssystem wirklich benötigt wird, führen Sie es einfach in einer VM aus. Ich habe bereits gesagt, dass diese nur für ** 32-Bit-Systeme gelten. ** phuclv vor 5 Jahren 0
+1 für den Hinweis auf die Emulation (mit binärer Übersetzung) könnte dies tun. Bob vor 5 Jahren 0
Weitere Informationen: [Warum sollte die Sicherheit des Browsers Priorität haben?] (Https://security.stackexchange.com/q/194345/94500) Ooker vor 5 Jahren 0
@Ramhound nimmt das Thema etwas zu niedrig an. Es ist nicht nur so, dass Sie ein 32-Bit-Betriebssystem auf einem neuen System installieren können. Am unteren Ende des PC-Marktes (z. B. Atom mit 2 GB RAM) haben sich einige Systeme noch mit 32-Bit-Windows innerhalb der letzten 2 oder 3 Jahre verkauft wenn sie eine 64bit-fähige CPU hätten. Dies ist vermutlich zum Teil darauf zurückzuführen, dass diese Systeme sehr kleine SSDs aufweisen und win32 eine geringere Standfläche als win64 aufweist, und zum anderen, weil MS die billigste Windows-Lizenzierungsstufe für große OEMs ist (dies ist nicht dasselbe wie bei der OEM-Installation, die Sie als Verbraucher kaufen können ) war (ist ???) nur 32bit. Dan Neely vor 5 Jahren 1
5
Bob

Dies ist technisch möglich; Der Vorgang wird als binäre Übersetzung bezeichnet .

Am häufigsten wird dies mit Emulatoren für unterschiedliche Plattformen (z. B. ARM unter x86, x86 auf ARM) oder Virtualisierung, bei denen keine Hardwarebeschleunigung verfügbar ist, in die Praxis umgesetzt.

Das größte Problem ist, dass Sie die meisten Programme nicht einfach im Vakuum ausführen können. Sie hängen von der ABI des Betriebssystems ab, die normalerweise zwischen den Architekturen variiert. Dies bedeutet, dass Sie am Ende eine Übersetzungsebene für alle Interaktionen mit dem Betriebssystem (API-Aufrufe usw.) hinzufügen müssen. Dann können Sie auch das gesamte Betriebssystem emulieren ... was in der Antwort von phuclv beschrieben wird.

1
Ángel

Kompilieren Sie das Programm auf ein 32-Bit-Ziel

Ihre Frage wurde als 64-Bit-Binärdatei bezeichnet, die als 32-Bit-Binär ausgeführt werden soll. Dies ist ziemlich schwierig und Sie müssen am Ende einen Emulator oder andere komplexe Probleme verwenden.

Wenn Sie jedoch den Originalcode in einer Hochsprache (wie bei Firefox) haben, können Sie ihn wahrscheinlich in 32-Bit-Code kompilieren.

Dem letzten Absatz der LPChip-Antwort, dem Programmierer, der ein x64-Programm erstellt, bin ich nicht einverstanden , weil er die Grenzen der x86-Architektur überschreiten wird . Sie könnten dies tun, weil es das Standardziel ist, um sich an die native Architektur anzupassen oder einfach davon zu profitieren, dass mehr Speicher verwendet werden kann, wenn der Benutzer über genügend Arbeitsspeicher verfügt.

Einige Funktionen, wie z. B. 64-Bit-Zähler, die aus 32-Bit-Zählern bestehen, sind etwas langsamer als bei Verwendung eines nativen Registers. Wenn das Programm 64-Bit-spezifische Funktionen verwendet (z. B. Inline-64-Bit-Assembly), funktioniert es nicht. Die Aufgabe des Compilers liegt in erster Linie in der jeweils verwendeten Hochsprache (und dem Code, der gut geschrieben ist, sodass er von Anfang an tragbar ist).

Wenn wir uns auf das Erstellen von Firefox / Waterfox konzentrieren, ist dies für Neulinge kein einfaches Unterfangen (heutzutage sind Browser wie ein eigenes Betriebssystem), weniger bei Firefox Quantum, das zusätzlich einen Rost-Compiler erfordert. Linux-Distributionen kompilieren immer noch 32-Bit-Versionen von Firefox, was zeigt, dass es unter 32 Bit laufen kann.

Ich mag diese Antwort im Allgemeinen, aber leider ist sie oftmals nicht so einfach wie eine Neukompilierung: Zwar sollten Entwickler plattformagnostische Typen verwenden (z. B. `int32_t` oder` int64_t` anstelle von `long` oder` long long '). das ist leider nicht immer gefolgt. Wenn Annahmen über die Wortgröße bestehen, funktioniert das Kompilieren für eine andere Architektur nicht. Ebenso, wenn x86_64-spezifische Optimierungen vorhanden sind. Beachten Sie, dass x86_64 viel mehr allgemeine Register als x86 bietet. Es unterscheidet sich nicht nur die Zeigergröße. Bob vor 5 Jahren 0