kernel não pode executar binários (erro -8)

Sep 19 2020

minha 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

Criei rootfs seguindo este guia .

meu kernel não pode executar nenhum arquivo, mesmo o arquivo init >>> /linuxrcou /sbin/init.

para ter certeza de que o problema não é dos arquivos busybox, eu escrevi um programa em C helloworld com -mcpu=cortex-m7flag e o compilei, arm-linux-gnueabi-gccmas novamente o kernel pegou e lançou o erro -8 (erro de formato Exec).

meus arquivos do busybox estão todos vinculados ao binário do busybox e o binário está compilado corretamente para o braço 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

o erro do 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). ]---

meu 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

o erro do 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 que o kernel não pode executar binários?

Respostas

MahyarShokraeian Oct 13 2020 at 19:59

o problema é que você o está compilando de forma estática. você deve compilá-lo como um executável compartilhado (porque você precisa de um executável independente de posição (FDPIC)).

FDPIC ELF não é do tipo ET_EXEC. é do tipo ET_DYN (significa que é compartilhado).

basta adicionar um -sharedsinalizador a ele ou apenas desligar o binário estático integrado no menu kconfig do busybox.