내 플랫폼:
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 툴체인에서 기본적으로 활성화되어 있습니다.