visual programa pero otra ejecutar ejecuta dev compilar compilador compila como c++ c arm cross-compiling beagleboneblack

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.