J'ai compilé un petit programme C "hello world" sur une machine Ubuntu 10.04 32 bits. Ensuite, j'ai placé 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 dit "Aucun fichier ou répertoire de ce type". Mais lorsque je mets le même exécutable sur un Ubuntu 12.10 (64 bits) fonctionnant sur un ordinateur portable 64 bits, tout fonctionne correctement et j’obtiens le résultat souhaité. La VM s'exécute sur les serveurs IBM Blade. Je voulais savoir pourquoi les résultats pour une VM?
Le message No such file or directory
ne fait pas référence à votre fichier exécutable: a.out
. Au lieu de cela, il fait référence à un programme auxiliaire nécessaire pour exécuter l'exécutable 32 bits lié dynamiquement a.out
.
Maintenant, j'ai trouvé tout cela très bien expliqué dans cet article de Nice:
Liaison statique et dynamique
Il existe deux types d’exécutables binaires: liés statiquement et dynamiquement. Tout d’abord sur les liens liés statiquement : quand un programme veut appeler une fonction de bibliothèque, il y fait référence 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é pour l'adresse de la fonction correspondante dans le programme. Ce processus s'appelle linking car il relie le nom d'une fonction à la fonction elle-même, son implémentation. Il s’appelle statique , car le lien ne peut plus être modifié une fois le programme construit.
Les programmes liés dynamiquement fonctionnent différemment: le programme fait également référence aux fonctions de la bibliothèque par leur nom. Lors de la création du programme, deux listes sont assemblées et stockées avec le programme: une liste des fonctions de bibliothèque utilisées dans quels emplacements et une liste des bibliothèques contenant les fonctions utilisées par le programme. C’est tout pour la construction du programme.
Plus tard, à temps d'exécution , un programme d'assistance spécial, appelé éditeur de liens dynamique, recherche des emplacements spécifiques dans le système de fichiers pour chaque bibliothèque de la liste et les charge en mémoire. . L'éditeur de liens dynamique sait maintenant à quelles adresses de mémoire les fonctions de la bibliothèque sont disponibles. Il utilise la première liste pour écrire la bonne adresse dans tous les endroits qui appellent des fonctions de bibliothèque. Ensuite, le programme lié dynamiquement peut être exécuté.