el kernel no puede ejecutar binarios (error -8)
mi plataforma:
SOC = STM32H743 (ARMv7E-M | Cortex-M7)
Board = Waveshare CoreH7XXI
Linux Kernel = 5.8.10 (stable 2020-09-17)
initial defconfig file = stm32_defconfig
rootfs = built using busybox | busybox compiled using arm-linux-gnueabihf-gcc
He creado rootfs siguiendo esta guía .
mi kernel no puede ejecutar ningún archivo, incluso el archivo init >>> /linuxrco /sbin/init.
para asegurarme de que el problema no proviene de los archivos de busybox, escribí un programa helloworld en C con la -mcpu=cortex-m7bandera y lo compilé, arm-linux-gnueabi-gccpero nuevamente el kernel se asustó y arrojó el error -8 (error de formato Exec).
todos mis archivos de busybox están vinculados al binario de busybox y el binario está correctamente compilado para el brazo de 32 bits:
$ readelf -A bin/busybox
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "Cortex-M7"
Tag_CPU_arch: v7E-M
Tag_CPU_arch_profile: Microcontroller
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_rounding: Needed
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_CPU_unaligned_access: v6
el error del kernel:
[ 0.925859] Run /linuxrc as init process
[ 0.943257] Kernel panic - not syncing: Requested init /linuxrc failed (error -8).
[ 0.950654] ---[ end Kernel panic - not syncing: Requested init /linuxrc failed (error -8). ]---
mi programa helloworld:
$ readelf -A hello
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "7E-M"
Tag_CPU_arch: v7E-M
Tag_CPU_arch_profile: Microcontroller
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_rounding: Needed
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_CPU_unaligned_access: v6
el error del kernel:
[ 1.189550] Run /hello as init process
[ 1.198670] Kernel panic - not syncing: Requested init /hello failed (error -8).
[ 1.205977] ---[ end Kernel panic - not syncing: Requested init /hello failed (error -8). ]---
¿Por qué el kernel no puede ejecutar binarios?
Respuestas
el problema es que lo está compilando en forma estática. debe compilarlo como un ejecutable compartido (porque necesita un ejecutable independiente de la posición (FDPIC)).
FDPIC ELF no es del tipo ET_EXEC. es de tipo ET_DYN (significa que es compartido).
simplemente agregue una -sharedbandera o simplemente apague el binario estático construido en el menú kconfig de busybox.