Impossibile eseguire un programma a 32 bit su VM a 64 bit


12

Ho compilato un piccolo programma C "ciao mondo" su Ubuntu 10.04 a 32 bit. Quindi ho inserito l'eseguibile (a.out) sulla macchina virtuale VMWare Ubuntu 12.10 (64 bit) e ho provato a eseguirlo (./ a.out). Il sistema operativo non identifica il file e dice "Nessun file o directory". Ma quando metto lo stesso eseguibile su un Ubuntu 12.10 (64 bit) in esecuzione su un laptop a 64 bit, funziona bene e ottengo l'output desiderato. La VM è in esecuzione su IBM Blade Server. Volevo sapere perché i risultati per una VM?

Risposte:


20

Il messaggio No such file or directorynon si riferisce al file eseguibile: a.out. Si riferisce invece a un programma di supporto necessario per eseguire l' eseguibile a 32 bit collegato in modo dinamicoa.out .

Ora, ho trovato tutto ciò ben spiegato in questo bell'articolo:

Collegamento statico e dinamico

Esistono due tipi di eseguibili binari: staticamente collegati e dinamicamente collegati. Prima di tutto quelli staticamente collegati : quando un programma vuole chiamare una funzione di libreria, si riferisce ad essa per nome. Quando si crea il programma dalla sorgente, tutte le funzioni di libreria utilizzate nel programma vengono copiate dalla libreria nel programma. Il programma contiene quindi il proprio codice e il codice delle funzioni di libreria che utilizza. Quindi nei posti di chiamata il nome viene cambiato nell'indirizzo della funzione corrispondente nel programma. Questo processo è chiamato collegamento perché collega insieme il nome di una funzione con la funzione stessa, la sua implementazione. Si chiama statico , perché il collegamento non può essere modificato dopo la creazione del programma.

I programmi collegati dinamicamente funzionano in modo diverso: il programma fa riferimento anche alle funzioni di libreria per nome. Quando si crea il programma, due elenchi vengono assemblati e memorizzati insieme al programma: un elenco di quali funzioni di libreria vengono utilizzate in quali posizioni e un elenco di librerie che contengono le funzioni utilizzate dal programma. Questo è tutto per la costruzione del programma.

Successivamente, al momento dell'esecuzione , uno speciale programma di supporto, il cosiddetto linker dinamico, cerca in posizioni specifiche nel file system per ciascuna libreria nell'elenco delle librerie e lo carica in memoria. Ora il linker dinamico sa a quale memoria sono disponibili le funzioni di libreria. Utilizza il primo elenco per scrivere l'indirizzo corretto in tutti i luoghi che richiamano le funzioni di libreria. Quindi è possibile eseguire il programma collegato dinamicamente.


3
Anche questo messaggio di errore "Nessun file trovato" mi ha confuso la prima volta ° ͜ °, quindi ho capito che mancava qualche file richiesto dall'app.
Ramchandra Apte,

@Radu Rădeanu, come si chiama un programma di aiuto ? Immagino una libreria collegata dinamicamente. In tal caso, chiamarlo un programma di aiuto confonde la spiegazione.
Golem,

Ecco un link che ho trovato utile per comprendere questo problema - Ottenere il messaggio "Not found" quando si esegue un binario a 32 bit su un sistema a 64 bit
golem
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.