Problema en init al iniciar sistema Linux sobre BBB

46 views
Skip to first unread message

Gaspar Santamarina

unread,
Jul 14, 2017, 9:26:37 AM7/14/17
to embeb...@googlegroups.com
Estoy intentando compilar, con fines netamente educativos, un sistema Linux para que corra sobre una plataforma BeagleBone Black, siguiendo la guía del libro "Mastering embedded Linux programming" de Chris Simmonds.

Básicamente utilicé crosstool-NG para generar un toolchain usando la configuración arm-cortex_a8-linux-gnueabi. Luego compilé u-boot y lo mandé a la SD, junto con un kernel y un device tree, compilados según el manual (nada raro).

Por último generé el sistema de archivos root de forma manual, carpeta por carpeta, y le instalé busybox. Además, copié todas las librerías de /x-tools/arm-cortex_a8-linux-gnueabi/arm-cortex_a8-linux-gnueabi/lib a la carpeta lib del sistema de archivos.

Una vez que tuve todo listo, generé la ramdisk y copié todos los archivos a la SD.

Luego de que inició u-boot, utilicé los siguientes comandos para cargar los archivos correspondientes:

fatload mmc 0:1 0x80200000 zImage
fatload mmc 0:1 0x80f00000 am335x-boneblack.dtb
fatload mmc 0:1 0x81000000 uRamdisk

Todo se cargó correctamente.

Para bootear el kernel hice:

setenv bootargs console=ttyO0,115200 rdinit=/bin/sh
bootz 0x80200000 0x81000000 0x80f00000

Dando como resultado un kernel panic. Adjunto la salida del proceso de booteo en un .txt.
La linea que me llamo la atención fue la siguiente:

Starting init: /bin/sh exists but couldn't execute it (error -8)

Además, al ejecutar el siguiente comando:

arm-cortex_a8-linux-gnueabi-readelf -a bin/busybox | grep "program interpreter"

Obtengo:

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

Lo que me llama bastante la atención, dado que mi target es una plataforma arm (obviamente compilé busybox utilizando la crosstool generada, con el parametro ARCH=arm ). Intenté recompilando busybox y nada.
En fin, debe ser un problema de novato que no estoy pudiendo dilucidar. Ilumínenme XD.

Saludos.
boot.txt

Ezequiel Garcia

unread,
Jul 14, 2017, 9:36:18 AM7/14/17
to embebidos32@, gasp...@gmail.com
[..]
>
> Starting init: /bin/sh exists but couldn't execute it (error -8)
>

El exec format error del archivo no es el esperado.

#define ENOEXEC 8 /* Exec format error */

> Además, al ejecutar el siguiente comando:
>
> arm-cortex_a8-linux-gnueabi-readelf -a bin/busybox | grep "program
> interpreter"
>
> Obtengo:
>
> [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
>

Acá está el problema. Te falló la cross-compilación. Esto lo podés
verificar con `file`. Por ejemplo, te debería salir algo asi:

$ file output/target/bin/busybox
output/target/bin/busybox: setuid ELF 32-bit LSB executable, ARM,
EABI5 version 1 (SYSV), dynamically linked, interpreter
/lib/ld-linux-armhf.so.3, for GNU/Linux 4.10.0, stripped, with
debug_info

Con que comando estás cross-compilando?
--
Ezequiel García, VanguardiaSur
www.vanguardiasur.com.ar

Gaspar Santamarina

unread,
Jul 14, 2017, 9:54:22 AM7/14/17
to Ezequiel Garcia, embebidos32@
Si, claramente el error esta ahí. La compilación la hice con el comando:

make -j 4 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabi-

Ezequiel Garcia

unread,
Jul 14, 2017, 10:09:20 AM7/14/17
to Gaspar Santamarina, embebidos32@
2017-07-14 10:54 GMT-03:00 Gaspar Santamarina <gasp...@gmail.com>:
> Si, claramente el error esta ahí. La compilación la hice con el comando:
>
> make -j 4 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabi-
>

Y que resultado te tira si usás V=1 ?

make -j 4 V=1 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabi-

(Por favor, no top-postees, asi se puede seguir mejor la discusión)

Gaspar Santamarina

unread,
Jul 14, 2017, 11:06:34 AM7/14/17
to Ezequiel Garcia, embebidos32@
Necesitas el log entero de la compilación?

Gaspar Santamarina

unread,
Jul 14, 2017, 11:11:17 AM7/14/17
to Ezequiel Garcia, embebidos32@
Por las dudas va entero. Acá lo adjunto
log222.txt

Ezequiel Garcia

unread,
Jul 14, 2017, 11:32:30 AM7/14/17
to Gaspar Santamarina, embebidos32@
Hm, bien. Y la salida de file sobre busybox que te tira?

Acá acabo de hacer un make clean && make ARCH CROSS_COMPILE rapido y
resulta bien:

$ file busybox
busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for
GNU/Linux 4.10.0, stripped, with debug_info

Debo decir que hacer todo esto a mano es realmente un excelente
ejercicio, pero tenés que estar listo para renegar. El valor de hacer las
cosas a mano es justamente poder debuggear y aprender de este tipo
de problemas.

No sé si preguntar en un foro es una salida viable, excepto que hayas agotado
unas buenas 1-2 semanas de investigación. Esto parece una obviedad, pero
por las dudas lo aclaro, hay mucha gente que piensa que es soplar y
hacer botellas.
El "tiempo de renegada" promedio con Linux es de 2 semanas :-)

En todo caso, era la salida con V=1, la salida de readelf, de file, de objdump
lo que necesitás aportar cuando hacés una pregunta de este estilo.

Normalmente podría ayudarte sin ninguna información, pero justo mi bola
mágica está rota y no puedo adivinar sin ella.

PS: Respuesta corta, todo apunta a que tu cross compilador está roto.
Probaste cross-compilando otra cosa? (un hello world) ?

Ezequiel Garcia

unread,
Jul 14, 2017, 11:55:43 AM7/14/17
to Gaspar Santamarina, embebidos32@
2017-07-14 12:41 GMT-03:00 Gaspar Santamarina <gasp...@gmail.com>:
>
> Ok, esta tarde cuando vuelva del laburo paso un poco mas de info y pruebo
> compilar un hello world. Sin embargo, el kernel y el bootloader los compile
> con la misma toolchain y parecen estar andando bien. No es esto prueba
> suficiente de que el compilador funciona correctamente?

¡Esa es una excelente pregunta!

Y justamente la diferencia está en el linkeo, que es parte de la toolchain:

$ file vmlinux
vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
statically linked,
BuildID[sha1]=ef9f0845f1a918b9857809cd173d9c7ba69ecbe4, not stripped,
with debug_info

$ file busybox
busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for
GNU/Linux 4.10.0, stripped, with debug_info

Si mal no recuerdo, cuando hacés una toolchain, tenés que hacer dos stages.
Con la primer stage (de nuevo, si mal no recuerdo) ya podés cross-compilar
bootloaders y kernels. La segunda stage es la que necesitás para cross-compilar
binarios ELF linkeados con una libc.

A su vez, fijate que el ELF busybox tiene un interpreter ld (Linux Loader),
mientras que el kernel es un ELF que no necesita que nadie lo "cargue".
A lo sumo necesita que un bootloader lo mueva de flash a RAM y lo
ejecute.

Si estás con ganas de aprender, te recomiendo que leas acerca del proceso
de linkeo y sobre el loader ld: http://www.linuxjournal.com/article/6463.

Gaspar Santamarina

unread,
Jul 14, 2017, 12:59:48 PM7/14/17
to Ezequiel Garcia, embebidos32@
Gracias Ezequiel, muy buena info!
Reply all
Reply to author
Forward
0 new messages