Impossible d'exécuter un programme 32 bits sur une machine virtuelle 64 bits

12

J'ai compilé un petit programme C "hello world" sur une machine Ubuntu 10.04 32 bits. Ensuite, j'ai mis l'exécutable (a.out) sur la machine virtuelle VMWare Ubuntu 12.10 (64 bits) et j'ai essayé de l'exécuter (./ a.out). Le système d'exploitation n'identifie pas le fichier et indique «Aucun fichier ou répertoire de ce type». Mais quand je mets le même exécutable sur un Ubuntu 12.10 (64 bits) fonctionnant sur un ordinateur portable 64 bits, il fonctionne bien et j'obtiens la sortie souhaitée. La machine virtuelle s'exécute sur des serveurs lames IBM. Je voulais savoir pourquoi les résultats pour une VM?

Geai
la source

Réponses:

20

Le message No such file or directoryne se réfère pas à votre fichier exécutable: a.out. Au lieu de cela, il fait référence à un programme d'aide qui est nécessaire pour exécuter l' exécutable lié dynamiquement 32 bits a.out.

Maintenant, j'ai trouvé tout cela très bien expliqué dans ce bel article:

Liaison statique et dynamique

Il existe deux types d'exécutables binaires: ceux liés statiquement et ceux liés dynamiquement. Tout d'abord sur les liens statiques : lorsqu'un programme veut appeler une fonction de bibliothèque, il s'y réfère par son nom. Lors de la création du programme à partir de la source, toutes les fonctions de bibliothèque utilisées dans le programme sont copiées de la bibliothèque dans le programme. Le programme contient alors son propre code ainsi que le code des fonctions de bibliothèque qu'il utilise. Ensuite, dans les lieux d'appel, le nom est changé en l'adresse de la fonction correspondante dans le programme. Ce processus est appelé liaison car il relie le nom d'une fonction à la fonction elle-même, son implémentation. C'est ce qu'on appelle statique , car le lien ne peut pas être modifié après la construction du programme.

Les programmes liés dynamiquement fonctionnent différemment: le programme fait également référence aux fonctions de bibliothèque par leur nom. Lors de la construction du programme, deux listes sont assemblées et stockées avec le programme: une liste des fonctions de bibliothèque utilisées à quels endroits et une liste des bibliothèques contenant les fonctions utilisées par le programme. C'est tout pour construire le programme.

Plus tard, au moment de l'exécution , un programme d'aide spécial, le soi-disant éditeur de liens dynamiques, recherche dans des endroits spécifiques du système de fichiers chaque bibliothèque de la liste des bibliothèques et la charge en mémoire. L'éditeur de liens dynamique sait maintenant à quelles adresses de mémoire les fonctions de bibliothèque sont disponibles. Il utilise la première liste pour écrire l'adresse correcte dans tous les endroits qui appellent des fonctions de bibliothèque. Ensuite, le programme lié dynamiquement peut être exécuté.

Radu Rădeanu
la source
3
Ce message d'erreur "Aucun fichier trouvé" m'a aussi troublé la première fois ° ͜ °, puis j'ai compris que cela signifiait qu'un fichier requis par l'application était manquant.
Ramchandra Apte
@Radu Rădeanu, comment appelez-vous un programme d'aide ? Je suppose qu'une bibliothèque liée dynamiquement. Si c'est le cas, l'appeler un programme d'aide embrouille simplement l'explication.
golem
Voici un lien que j'ai trouvé utile pour comprendre ce problème - Obtenir un message «Introuvable» lors de l'exécution d'un binaire 32 bits sur un système 64 bits
Golem