そこの状況が少し変です。 ARMプラットフォーム(32ビット)用のBusyBox 1.32.1の静的実行可能ファイルをコンパイルしましたが、奇妙なことに、両方のプラットフォームで問題なく実行されます。自分で見てください:
root@smallbuntu /m/n/b/i/n/rootfs# readelf -h bin/busybox-initrd
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x1f419
Start of program headers: 52 (bytes into file)
Start of section headers: 1482800 (bytes into file)
Flags: 0x5000002, Version5 EABI, <unknown>
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 6
Size of section headers: 40 (bytes)
Number of section headers: 27
Section header string table index: 26
root@smallbuntu /m/n/b/i/n/rootfs#
それから:
root@smallbuntu /m/n/b/i/n/rootfs# bin/busybox-initrd ls
bin home media proc srv var
boot kobo mnt root sys
dev lib modules run tmp
etc lost+found opt sbin usr
root@smallbuntu /m/n/b/i/n/rootfs# bin/busybox-initrd uname -a
Linux smallbuntu 5.8.0-50-generic #56-Ubuntu SMP Mon Apr 12 17:18:36 UTC 2021 armv7l GNU/Linux
root@smallbuntu /m/n/b/i/n/rootfs#
uname -a
armv7l
busyboxバイナリによって返されるようです。これは正常な出力です:
Linux smallbuntu 5.8.0-50-generic #56-Ubuntu SMP Mon Apr 12 17:18:36 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
何が起こったのか知っていますか?
ありがとうございます!
答え1
内部を見てみると、次のようなファイル名と同じ名前のファイルが/proc/sys/fs/binfmt_misc
表示されます。qemu-arm
enabled
interpreter /usr/bin/qemu-arm-static
flags: OCF
offset 0
magic 7f454c4601010100000000000000000002002800
mask ffffffffffffff00fffffffffffffffffeffffff
これはカーネルにバイナリを「解釈する」ように指示します。指定した値に合ったマジック値を使用してください/usr/bin/qemu-arm-static
。これにより、QEMUを使用してARM CPUをエミュレートし(ARM ABIと一致するようにシステムコールを変更し)、QEMUがARM CPU(64ビットx86 PCを含む)をエミュレートできるすべてのシステムでARMバイナリを透過的に実行できます。
あなたの場合、ARMバイナリは静的にリンクされているため、追加の設定は必要ありません。動的にリンクされたバイナリには、基本ライブラリも使用可能でなければなりません。
qemu-user-static
Debianベースのシステム(Ubuntuベースのシステムを含む)では、これはpackageによって設定されますbinfmt-support
。qemu-user-static
パッケージ登録のbinfmt_misc
構成QEMUは、次のコマンドを使用して処理できます。update-binfmts
、binfmt-support
パッケージは登録された設定がカーネル(binfmt_misc
カーネルモジュール)にロードされるようにします。
また、見ることができますLinuxにはどのような実行ファイルがありますか?、/proc/sys/fs/binfmt_misc/ 以下のファイルにはどのタイプの実行可能ファイル形式がありますか?とモノの驚くべき点は何ですか?