Le problème est que le binaire est un exécutable 32 bits et que vous utilisez une Ubuntu 64 bits. Ce n'est pas un problème, car Ubuntu offre un support pour de multiples architectures.
En cas de doute sur la nature d'un exécutable, ou de tout fichier en général, la commande
file <filename>
offre des informations précieuses. Si la commande n'est pas disponible, elle peut être installée par l'intermédiaire de
sudo apt-get install file
Dans ce cas, il nous indique entre autres informations
ac3d: ELF 32-bit LSB executable[...]
interpreter /lib/ld-linux.so.2
L'interpréteur est le morceau de logiciel responsable du chargement de toutes les bibliothèques partagées dont un binaire a besoin pour fonctionner. S'il est absent, une application ne peut pas fonctionner.
Les exécutables 32 et 64 bits nécessitent des interpréteurs différents et des versions différentes des bibliothèques partagées. Heureusement, Ubuntu (ou plus précisément Debian) a introduit il y a quelque temps un support multi-architecture très sophistiqué. [cit. nécessaire]
Pour s'assurer que le système de paquets est préparé pour une autre architecture, on peut voir l'architecture par défaut du système avec
dpkg --print-architecture
Sur une Ubuntu 64 bits, la valeur par défaut est la suivante amd64
.
dpkg --print-foreign-architectures
affiche toutes les autres architectures que le système de paquets connaît. Pour le support 32bit, la sortie doit contenir i386
. Si ce n'est pas le cas, on peut ajouter un support avec
sudo dpkg --add-architecture i386
Il est nécessaire de mettre à jour la liste des paquets par la suite
sudo apt-get update
Les bibliothèques ou paquets nécessaires dans leur version i386 peuvent maintenant être installés avec
sudo apt-get install <package>:i386
Plus précisément, pour installer l'interpréteur nécessaire, l'installation de l'application GNU C Shared Library
est indiqué :
sudo apt-get install libc6:i386
Dans la plupart des cas, le binaire en question s'exécutera, mais il existe bien sûr de nombreuses bibliothèques dont une application peut être liée dynamiquement, c'est-à-dire dont elle dépend. Celles-ci doivent être installées de la même manière. Si une bibliothèque est manquante, l'éditeur de liens donnera une erreur à l'exécution.
./ac3d: error while loading shared libraries: libGLU.so.1: \
cannot open shared object file: No such file or directory
A ce stade, il faut trouver quel paquet contient ce fichier manquant. Si le paquet correspondant à l'architecture native est déjà installé, on peut rechercher un fichier de type dpkg
dpkg -S libGLU.so.1
libglu1-mesa:amd64: /usr/lib/x86_64-linux-gnu/libGLU.so.1
Nous devrions donc installer libglu1-mesa:i386
. Répétez l'opération jusqu'à ce que toutes les dépendances soient satisfaites.
Mais souvent, une bibliothèque est complètement absente du système. Dans ce cas, on peut soit chercher Le paquetage en ligne d'Ubuntu ou installez l'utilitaire apt-file
et faire
apt-file search <filename>
Un très bon HOWTO sur le support multi-arch sur Debian (même chose pour Ubuntu) peut être trouvé aquí .
Extra : Le paquet binutils
contient des outils très pratiques pour examiner les binaires. En particulier, il contient le ldd
(Liste des dépendances dynamiques) util. Il liste toutes les bibliothèques dynamiques dont un binaire a besoin pour fonctionner.
Ejemplo:
ldd ac3d
produit
linux-gate.so.1 (0xf77b7000)
libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xf76ee000)
libGLU.so.1 => not found
libGL.so.1 => not found
libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xf76c0000)
libXmu.so.6 => not found
libXext.so.6 => not found
libX11.so.6 => not found
libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xf76ba000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xf769e000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf75ac000)
libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xf7566000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7549000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xf739e000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf7381000)
/lib/ld-linux.so.2 (0xf77ba000)
De cette façon, on peut savoir rapidement quelles sont les bibliothèques qui manquent dans le système.