私のプラットフォーム:
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ツールチェーンでデフォルトで有効になっています。