c++ - programa - gcc compilador
Intentar ejecutar un ejecutable compilado cruzado en el dispositivo de destino falla con: No existe tal archivo o directorio (2)
Me atrapó en el no tan soleado mundo de la compilación cruzada.
Estoy tratando de compilar una sencilla aplicación de hello world para mi BeagleBone Black (que ejecuta un procesador TI Cortex-A8).
Antes que nada, compilé y ejecuté con éxito la aplicación hello world en x86 con gcc
Luego cambié mi configuración de compilación a lo siguiente:
arm-linux-gnueabi-gcc -c -O0 -g3 -Wall main.c -o bin/obj/main.o
arm-linux-gnueabi-gcc bin/obj/main.o -o bin/hello_world
Transferí el archivo a través de SCP al BeagleBone y establecí los permisos ejecutables con chmod +x hello_world
Al ejecutarlo ( ./hello_world
), mi única respuesta es:
-bash: ./hello_world: No such file or directory
El resultado del file
coincide con /sbin/init
como era de esperar:
$ file hello_world
hello_world: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x24b659b7a41fe043a6f4649d4ebfb5e692ebf0c7, not stripped
$ file /sbin/init
/sbin/init: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0xd21f6957ec031a27d567b3d5e6aa14b9e0c30c37, stripped
El resultado de ldd
es:
$ ldd hello_world
not a dynamic executable
Traté de agregar una plataforma adecuada y el tipo de CPU, cambiando mi compilación a:
arm-linux-gnueabi-gcc -c -O0 -g3 -Wall -march=armv7-a -mtune=cortex-a8 main.c -o bin/obj/main.o
arm-linux-gnueabi-gcc bin/obj/main.o -o bin/hello_world
Inicialmente, esto comenzó a darme un nuevo error: Text file busy
, pero desde entonces no he podido recuperar ese error nuevamente, ya que ahora devuelve No such file or directory
. Supongo que ese intento en particular fue solo una mala transferencia o algo así.
Dado que nadie de los comentarios publicó la respuesta, creo que tengo el placer;)
No such file or directory
proviene de cuando el kernel intenta invocar el enlazador dinámico especificado por el campo .interp
del ejecutable ELF, pero no existe tal archivo.
El campo .interp
se puede encontrar con el siguiente comando:
objdump -j .interp -s ./hello_world
En el caso de este ejemplo, el campo .interp
del ejecutable era /lib/ld-linux.so.3
, pero el nombre del enlazador dinámico en BeagleBone Black es /lib/ld-linux-armhf.so.3
.
Esto sucedió porque el programa se compiló con una cadena de herramientas ligeramente diferente a la requerida para la plataforma. Debería ser arm-linux-gnueabihf-*
lugar de arm-linux-gnueabi-*
.
Por lo que entiendo, el Cortex-A8 usa operaciones de punto flotante basadas en hardware en ARMv7, pero las versiones anteriores de las instrucciones ARM establecen técnicas basadas en software usadas. Esta es la diferencia entre armhf
y armel
. Como resultado, los programas armel
se ejecutarán en armhf
(¡siempre que el enlazador dinámico esté configurado en la ruta correcta!), Pero no al revés.
Simplemente agregando un enlace simbólico ln -s /lib/ld-linux-armhf.so.3 /lib/ld-linux.so.3
es suficiente para resolver este problema, pero la solución correcta es usar la cadena de herramientas correcta al compilar el programa en primer lugar.
Yo tuve el mismo problema. Descargué e gcc-arm-linuc-gnueabihf
paquete gcc-arm-linuc-gnueabihf
en mi PC Ubuntu desde el repositorio de Ubuntu usando apt-get. Luego compilé un programa de prueba helloworld y lo descargué usando sftp a mi BeagleBone.
Al tratar de ejecutar el programa en BBB, apareció el error: "No hay tal archivo o directorio"
Usando objdump encontré que el campo .interp en el ejecutable ELF era /lib/ld_linux_armhf.so.3
. Mi BBB tenía un enlazador dinámico /lib/ld-linux.so.3
.
Creé un enlace simbólico en BBB:
ln -s /lib/ld-linux.so.3 /lib-linux-armhf.so.3
Ahora la aplicación compilada cruzada funciona en BBB. El BBB está ejecutando la distribución original de Angstrom.
Esta no es la solución ideal. Ahora necesito confgurar la cadena de herramientas en Ubuntu para agregar el nombre del enlazador dinámico correcto a la aplicación, o actualizar el BBB para tener un enlazador dinámico especificado en la cadena de herramientas.
Supongo que el mensaje de error se debe al archivo dinámico del enlazador no encontrado, no es que la aplicación no exista.