Ein 32-Bit-Programm kann auf einer 64-Bit-VM nicht ausgeführt werden

12

Ich habe ein kleines "Hallo Welt" C-Programm auf einer Ubuntu 10.04 32-Bit-Maschine kompiliert. Dann legte ich die ausführbare Datei (a.out) auf Ubuntu 12.10 (64 Bit) VMWare Virtual Machine und versuchte, sie auszuführen (./ a.out). Das Betriebssystem erkennt die Datei nicht und sagt 'Keine solche Datei oder kein solches Verzeichnis'. Aber wenn ich die gleiche ausführbare Datei auf ein Ubuntu 12.10 (64 Bit) lege, das auf einem 64-Bit-Laptop läuft, läuft sie einwandfrei und ich erhalte die gewünschte Ausgabe. Die VM wird auf IBM Blade Servern ausgeführt. Ich wollte wissen, warum die Ergebnisse für eine VM?

Jay
quelle

Antworten:

20

Die Meldung No such file or directorybezieht sich nicht auf die ausführbare Datei: a.out. Stattdessen bezieht er sich auf ein Hilfsprogramm , das die 32 - Bit laufen benötigt dynamisch verknüpfte ausführbare Datei a.out.

Nun, ich fand all dies in diesem schönen Artikel sehr gut erklärt:

Statische und dynamische Verknüpfung

Es gibt zwei Arten von ausführbaren Binärdateien: statisch verknüpfte und dynamisch verknüpfte. Zunächst zu den statisch verknüpften : Wenn ein Programm eine Bibliotheksfunktion aufrufen möchte, verweist es mit seinem Namen darauf. Beim Erstellen des Programms aus dem Quellcode werden alle im Programm verwendeten Bibliotheksfunktionen aus der Bibliothek in das Programm kopiert. Das Programm enthält dann seinen eigenen Code sowie den Code der von ihm verwendeten Bibliotheksfunktionen. In den aufrufenden Stellen wird dann der Name in die Adresse der entsprechenden Funktion im Programm geändert. Dieser Prozess wird als Verknüpfung bezeichnet, da er den Namen einer Funktion mit der Funktion selbst, ihrer Implementierung, verknüpft. Es heißt statisch , da die Verknüpfung nicht mehr geändert werden kann, nachdem das Programm erstellt wurde.

Dynamisch verknüpfte Programme funktionieren anders: Das Programm verweist auch namentlich auf Bibliotheksfunktionen. Beim Erstellen des Programms werden zwei Listen zusammen mit dem Programm zusammengestellt und gespeichert: eine Liste der Bibliotheksfunktionen, die an welchen Stellen verwendet werden, und eine Liste der Bibliotheken, die die vom Programm verwendeten Funktionen enthalten. Das ist alles für den Aufbau des Programms.

Später, zur Ausführungszeit , sucht ein spezielles Hilfsprogramm, der sogenannte dynamische Linker, an bestimmten Stellen im Dateisystem nach jeder Bibliothek in der Bibliotheksliste und lädt sie in den Speicher. Jetzt weiß der dynamische Linker, an welchen Speicheradressen die Bibliotheksfunktionen verfügbar sind. Es verwendet die erste Liste, um an allen Stellen, an denen Bibliotheksfunktionen aufgerufen werden, die richtige Adresse zu schreiben. Dann kann das dynamisch verknüpfte Programm ausgeführt werden.

Radu Rădeanu
quelle
3
Diese Fehlermeldung "Keine Datei gefunden" hat mich auch beim ersten Mal verwirrt ° ͜ °, dann habe ich verstanden, dass eine von der App benötigte Datei fehlte.
Ramchandra Apte
@Radu Rădeanu, wie nennt man ein Hilfsprogramm ? Ich vermute eine dynamisch verknüpfte Bibliothek. Wenn dies der Fall ist , führt der Aufruf eines Hilfsprogramms die Erklärung nur durcheinander.
Golem
Hier ist ein Link, den ich nützlich fand, um dieses Problem zu verstehen - Die Meldung "Nicht gefunden" beim Ausführen einer 32-Bit-Binärdatei auf einem 64-Bit-System
Golem