커널이 바이너리를 실행할 수 없습니다(오류 -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.

문제가 비지박스 파일에서 발생하지 않는지 확인하기 위해 -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). ]---

나의 Hello World 프로그램:

$ 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

문제는 일반적인 정적 엘프 형식으로 컴파일한다는 것입니다. FDPIC-ELF 실행 파일로 컴파일해야 합니다(MMU가 없기 때문에 FDPIC(위치 독립적 실행 파일)이 필요합니다).

FDPIC ELF는 ET_EXEC 유형이 아닙니다. 이는 ET_DYN 유형(공유됨을 의미)이며 Linux 동적 로더에 의해 로드됩니다.

플래그를 추가 -mfdpic하고 닫으세요.정적 바이너리 빌드busybox의 kconfig 메뉴에서.

-mfdpic 플래그는 arm-uclinux-fdpicabi 툴체인에서 기본적으로 활성화되어 있습니다.

관련 정보