BusyBox静的にコンパイルされたARMバイナリがx86_64 PCで実行されるのはなぜですか? [コピー]

BusyBox静的にコンパイルされたARMバイナリがx86_64 PCで実行されるのはなぜですか? [コピー]

そこの状況が少し変です。 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 -aarmv7lbusyboxバイナリによって返されるようです。これは正常な出力です:

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-staticDebianベースのシステム(Ubuntuベースのシステムを含む)では、これはpackageによって設定されますbinfmt-supportqemu-user-staticパッケージ登録のbinfmt_misc構成QEMUは、次のコマンドを使用して処理できます。update-binfmtsbinfmt-supportパッケージは登録された設定がカーネル(binfmt_miscカーネルモジュール)にロードされるようにします。

また、見ることができますLinuxにはどのような実行ファイルがありますか?/proc/sys/fs/binfmt_misc/ 以下のファイルにはどのタイプの実行可能ファイル形式がありますか?モノの驚くべき点は何ですか?

関連情報