Linux-Kernel

核心無法執行二進製文件(錯誤 -8)

  • September 20, 2021

我的平台:

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 。

我的核心無法執行任何文件,即使是初始化文件 >>>/linuxrc/sbin/init.

為了確保問題不是來自busybox文件,我編寫了一個帶有-mcpu=cortex-m7標誌的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). ]---

我的 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

核心錯誤:

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

為什麼核心不能執行二進製文件?

問題是您正在以正常的靜態精靈格式編譯它。您應該將其編譯為 FDPIC-ELF 執行檔(因為由於缺少 MMU,您需要一個與位置無關的執行檔 (FDPIC))。

FDPIC ELF 不是 ET_EXEC 類型。它是 ET_DYN(表示它是共享的)類型,由 Linux 動態載入器載入。

只需為其添加一個-mfdpic標誌並關閉busybox的kconfig菜單中建構的靜態二進製文件。

請注意 -mfdpic 標誌在 arm-uclinux-fdpicabi 工具鏈中預設打開。

引用自:https://unix.stackexchange.com/questions/610094