内核无法执行二进制文件(错误-8)

内核无法执行二进制文件(错误-8)

我的平台:

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

我通过以下方式创建了 rootfs本指南

我的内核无法执行任何文件,甚至是 init 文件 >>>/linuxrc/sbin/init.

为了确保问题不是来自 busybox 文件,我编写了一个带有-mcpu=cortex-m7flag 的 C helloworld 程序并使用它进行编译,arm-linux-gnueabi-gcc但内核再次出现恐慌并抛出 -8 错误(Exec 格式错误)。

我的 busybox 文件都链接到 busybox 二进制文件,并且该二进制文件已针对 32 位 arm 正确编译:

$ 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

内核错误:

[    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). ]---

我的你好世界程序:

$ 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

内核错误:

[    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). ]---

为什么内核不能执行二进制文件?

答案1

问题是您正在以正常的静态 elf 格式编译它。您应该将其编译为 FDPIC-ELF 可执行文件(因为缺少 MMU,您需要位置无关的可执行文件 (FDPIC))。

FDPIC ELF 不是 ET_EXEC 类型。它是 ET_DYN(这意味着它是共享的)类型,由 Linux 动态加载器加载。

只需添加一个-mfdpic标志并关闭构建静态二进制文件在 busybox 的 kconfig 菜单中。

请注意,-mfdpic 标志在arm-uclinux-fdpicabi 工具链中默认处于启用状态。

相关内容