J'ai une application 32 bits (appelée uclsyn) que j'ai reçue d'un professeur d'astronomie. J'ai réussi à le faire fonctionner sur CentOS il y a un an, mais maintenant, lorsque je configure une nouvelle machine virtuelle CentOS, il ne fonctionnera pas et je ne peux pas comprendre pourquoi. Il revient sans cesse avec "Killed".
C'est l'échange sur la ligne de commande:
$ ./uclsyn_linux
Killed
$ ldd ./uclsyn_linux
not a dynamic executable
$ file ./uclsyn_linux
uclsyn_linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
Sur la machine qui s'exécute, "ldd ./uclsyn_linux" retourne toute une liste de dépendances. J'ai trouvé les packages qui fournissent ces bibliothèques partagées, et ils semblent tous être installés.
Forfaits requis
- libSM-1.1.0-7.1.el6.i686
- libX11-1.3-2.el6.i686
- libgcc-4.4.6-3.el6.i386
- glibc-2.12-1.47.el6_2.9.i686
- libuuid-2.17.2-12.4.el6.i686
- libXau-1.0.5-1.el6.i686
- Il y a aussi un tas de bibliothèques locales à l'application que j'ai vérifié et qui sont déjà installées.
Mon environnement
CentOS fonctionnant sous VirtualBox
uname -a
: Linux localhost.localdomain 2.6.32-358.el6.i686 # 1 SMP jeu 21 fév 12:50:49 UTC 2013 i686 i686 i386 GNU / Linux
strace ./uclsyn
sortie? Cela peut nous donner une idée de ce qui manque en premier.strace
un programme qui n'était pas correctement lié.Réponses:
Je viens d'avoir le problème avec un binaire 32 bits, la solution était:
apt-get install gcc-multilib
la source
L'erreur ici était due à un manque de RAM sur la VirtualMachine. Fonctionnement
strace ./programname
indiqué que le programme était en cours de suppression au moment où il a commencé à s'exécuter, avant de charger l'une des bibliothèques. L'augmentation de la quantité de RAM disponible a assuré le fonctionnement du programme.Réponses utiles
Il y a eu quelques réponses utiles d'autres à savoir @slm qui a fourni des commandes utiles pour vérifier que chacune des bibliothèques existait, et @lgeorget qui a suggéré d'essayer la
strace
commande.la source
Pouvez-vous publier certaines des bibliothèques auxquelles il est lié (à partir du système d'origine)? Vous devrez peut-être simplement installer certaines bibliothèques manquantes.
Généralement, sur un système CentOS, il suffit d'exécuter une commande yum comme ceci:
Vous pouvez travailler à l'envers à partir du système d'origine comme ceci:
Dans cette sortie , vous pouvez voir où ma copie
/bin/ls
est ramasser les bibliothèques partagées .donc par exemple de dire,librt.so.1
qui se trouve être situé ici:/lib64/librt.so.1
.Sachant cela, sur le système d'origine, vous pouvez exécuter cette commande pour déterminer quel package fournit cette bibliothèque:
Le package est donc appelé
glibc-2.13-2.x86_64
. Donc, pour l'installer, vous feriez ceci:la source
yum install <package>
ces paquets auxquels vous avez fait référence dans votre question?La réponse est dans votre question: vous essayez d'exécuter une application qui a été compilée pour GNU / Linux il y a un an et vous essayez de l'exécuter avec de nouvelles bibliothèques, qui peuvent ne plus être compatibles ou disponibles.
À ce stade, vous avez deux choix. Si vous pouvez le recompiler (ce dont je doute, si je comprends bien votre cas), il fonctionnera car il sera relié avec des bibliothèques compatibles. Sinon, vous pourriez essayer de construire une sorte de sandbox, une VM fonctionnant avec une ancienne version des bibliothèques GNU par exemple, pour exécuter l'application dans.
la source
file
. Et des messages commeNo package xyz found
suggèrent que les bibliothèques nécessaires ne sont plus disponibles (du moins, pas comme elles l'étaient, dans les mêmes packages). C'est pourquoi je suggère de reconstruire le programme, si c'est possible, ou de l'exécuter dans un système dans lequel il était connu de fonctionner, avec d'anciennes bibliothèques.essayez
readelf -l uclsyn_linux
Demander l'interpréteur de programme vous dira ce que vous manquez.la source
readelf -l <file>
contre un fichier avec le mêmeldd
comportement (not a dynamic executable
), mais je ne vois rien indiquant immédiatement une bibliothèque manquante. Je voisElf file type is EXEC (Executable file)
,Entry point
,Program Headers
etSection to Segment mapping
. Que dois-je rechercher exactement dans la sortie?Dans Arch Linux , si le fichier est un elfe 32 bits, vous pouvez installer lib32-gcc-libs (à partir du référentiel multilib) pour résoudre le problème.
la source