Tengo una aplicación de 32 bits (llamada uclsyn) que recibí de un profesor de astronomía. Logré ejecutarlo en CentOS hace un año, pero ahora, cuando estoy configurando una nueva máquina virtual CentOS, no se ejecutará y no puedo entender por qué. Sigue volviendo con "Asesinado".
Este es el intercambio en la línea de comando:
$ ./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
En la máquina que se ejecuta, "ldd ./uclsyn_linux" devuelve una lista completa de dependencias. He encontrado los paquetes que proporcionan estas bibliotecas compartidas, y todos parecen estar instalados.
Paquetes requeridos
- 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
- También hay un montón de bibliotecas locales para la aplicación que he verificado y que ya están instaladas.
Mi entorno
CentOS corriendo bajo VirtualBox
uname -a
: Linux localhost.localdomain 2.6.32-358.el6.i686 # 1 SMP jue 21 de febrero 12:50:49 UTC 2013 i686 i686 i386 GNU / Linux
strace ./uclsyn
salida? Eso puede darnos una pista sobre lo que falta primero.strace
un programa que no esté correctamente vinculado.Respuestas:
Acabo de tener el problema con un binario de 32 bits, la solución fue:
apt-get install gcc-multilib
fuente
El error aquí se debió a no tener suficiente RAM en VirtualMachine. La ejecución
strace ./programname
indicaba que el programa estaba siendo eliminado justo cuando comenzó a ejecutarse, antes de cargar cualquiera de las bibliotecas. El aumento de la cantidad de RAM disponible aseguró que el programa pudiera funcionar.Respuestas útiles
Hubo algunas respuestas útiles de otros, a saber, @slm, que proporcionó comandos útiles para comprobar que cada una de las bibliotecas existía, y @lgeorget, que sugirió probar el
strace
comando.fuente
¿Puedes publicar algunas de las bibliotecas a las que enlaza (desde el sistema original)? Es posible que solo necesite instalar algunas bibliotecas faltantes.
Por lo general, en un sistema CentOS, solo se trata de ejecutar un comando yum así:
Puede trabajar hacia atrás desde el sistema original así:
En esa salida se puede ver en mi copia de
/bin/ls
, está recogiendo las bibliotecas compartidas .so por ejemplo, por ejemplolibrt.so.1
, que pasa a estar ubicado aquí:/lib64/librt.so.1
.Sabiendo esto, en el sistema original, puede ejecutar este comando para averiguar qué paquete proporciona esta biblioteca:
Entonces se llama el paquete
glibc-2.13-2.x86_64
. Entonces para instalarlo harías esto:fuente
yum install <package>
esos paquetes a los que hizo referencia en su pregunta?La respuesta está en su pregunta: intenta ejecutar una aplicación que se compiló para GNU / Linux hace un año e intenta ejecutarla con nuevas bibliotecas, que pueden no ser compatibles o no estar disponibles.
En este punto, tienes dos opciones. Si puede volver a compilarlo (lo cual dudo, si entiendo bien su caso), se ejecutará porque se volverá a vincular con bibliotecas compatibles. De lo contrario, podría intentar construir una especie de sandbox, una VM que se ejecute con una versión anterior de las bibliotecas GNU, por ejemplo, para ejecutar la aplicación.
fuente
file
. Y mensajes comoNo package xyz found
sugieren que las bibliotecas necesarias ya no están disponibles (al menos, no como estaban, en los mismos paquetes). Es por eso que sugiero reconstruir el programa, si es posible, o ejecutarlo en un sistema en el que se sabía que funcionaba, con bibliotecas antiguas.intente
readelf -l uclsyn_linux
Solicitar intérprete de programa le dirá lo que falta.fuente
readelf -l <file>
con un archivo con el mismoldd
comportamiento (not a dynamic executable
), pero no veo nada que indique inmediatamente que falta una biblioteca. VeoElf file type is EXEC (Executable file)
,Entry point
,Program Headers
ySection to Segment mapping
. ¿Qué debo buscar exactamente en la salida?En Arch Linux , si el archivo es elfo de 32 bits, puede instalar lib32-gcc-libs (desde el repositorio multilib) para resolver el problema.
fuente