Sé que hay preguntas similares por ahí, pero no he encontrado una solución ni este caso exacto. El binario fue construido en Arch Linux usando su GCC 4.7. El paquete funciona bien en el sistema de compilación. Los siguientes comandos se ejecutaron en:
Linux vbox-ubuntu 3.2.0-29-generic # 46-Ubuntu SMP vie 27 de julio 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux
El archivo en cuestión se encuentra aquí . Es un compilador cruzado de Linux de 64 bits a Windows de 64 bits. Desentrañarlo ~/
proporciona un único ~/mingw64
directorio que contiene todo lo necesario.
Cuando intento ejecutar ~/mingw64/x86_64-w64-mingw32/bin/as
esto es lo que obtengo:
bash: /home/ruben/mingw64/x86_64-w64-mingw32/bin/as: No such file or directory
Correr file ~/mingw64/x86_64-w64-mingw32/bin/as
me da:
/home/ruben/mingw64/x86_64-w64-mingw32/bin/as: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x0b8e50955e7919b76967bac042f49c5876804248, not stripped
Correr ldd ~/mingw64/x86_64-w64-mingw32/bin/as
me da:
linux-vdso.so.1 => (0x00007fff3e367000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2ceae7e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2ceaac1000)
/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f2ceb0a8000)
Estoy realmente perdido. Cualquier ayuda es muy apreciada.
EDITAR : Algunos detalles más: El sistema de compilación es Arch Linux (actualmente glibc 2.16). La salida de ls -l
es:
-rwxr-xr-x 2 ruben users 1506464 11 aug 23:49 /home/ruben/mingw64/bin/x86_64-w64-mingw32-as
La salida de objdump -p
es:
Version References:
required from libz.so.1:
0x0827e5c0 0x00 05 ZLIB_1.2.0
required from libc.so.6:
0x0d696917 0x00 06 GLIBC_2.7
0x06969194 0x00 04 GLIBC_2.14
0x0d696913 0x00 03 GLIBC_2.3
0x09691a75 0x00 02 GLIBC_2.2.5
La salida de ldd -v
Ubuntu 12.04 es:
linux-vdso.so.1 => (0x00007fff225ff000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fd525c71000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd5258b4000)
/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fd525e9b000)
Version information:
/home/ruben/mingw64/x86_64-w64-mingw32/bin/as:
libz.so.1 (ZLIB_1.2.0) => /lib/x86_64-linux-gnu/libz.so.1
libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libz.so.1:
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
Los otros sistemas operativos probados son Fedora 17 (glibc 2.15) y Ubuntu 12.04 (eglibc 2.15). Se cumplen los requisitos de la versión zlib y glibc.
Respuestas:
Si ejecuto
ldd -v as
en mi sistema, obtengo:Entonces, sí, parece que estos binarios están buscando un
GLIBC_2.14
símbolo, que presumiblemente te falta en tu sistema. Como señaló Svenx, parece que está buscando elmemcpy@@GLIBC_2.14
símbolo. En este informe de errormemcpy
se describe más información sobre por qué se le dio una nueva versión .Instalar una nueva versión de
glibc
en su sistema de destino debería solucionarlo. Si desea intentar reconstruir el binario para que siga funcionando en la versión anteriorglibc
, puede probar trucos como el que se enumera aquí . También podría pasar con una cuña que solo proporciona la versión específica delmemcpy
símbolo que necesita, pero que se vuelve un poco hacky.Después de leer su actualización : tiene razón, ese no era su problema. Pero creo que lo he encontrado: su binario está solicitando el intérprete
/lib/ld-linux-x86-64.so.2
, que no existe en los sistemas Ubuntu 12.04:Si bien
ldd
sabía que debía encontrarlo en su/lib64
lugar, supongo que el núcleo no lo sabe cuando intenta ejecutar el binario y no puede encontrar el intérprete solicitado del archivo. Puede intentar simplemente ejecutarlo a través del intérprete manualmente:No estoy 100% seguro de que esto funcione correctamente: en mi sistema, ejecutarlo de
gcc
esta manera da un error de segmentación. Pero ese es al menos un problema diferente.fuente
:(
/lib64
amd64, y aparentemente Arch parchea manualmente sus fuentes gcc para cambiar esto, garantizando así la incompatibilidad con cualquier otra distribución de Linux. Consulte los comentarios de este informe de errores para conocer su extraño razonamiento. Para mí, esta sería una clara señal de advertencia para mantenerse alejado de Arch Linux.patchelf
funcionó para ellos.Su problema es una variante del mensaje "No encontrado" al ejecutar un binario de 32 bits en un sistema de 64 bits : tiene un ejecutable que menciona un cargador dinámico que no está allí.
En su caso, el cargador dinámico
/lib/ld-linux-x86-64.so.2
existe pero en una ubicación diferente/lib64/ld-linux-x86-64.so.2
. La forma más sencilla de hacer que sus programas funcionen sería crear un enlace simbólico:fuente