Busybox

為什麼我的 BusyBox 的靜態編譯 ARM 二進製文件可以在我的 x86_64 PC 上執行?

  • May 7, 2021

那裡的情況有點奇怪。我為 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

知道發生了什麼嗎?
謝謝!

如果你往裡面看/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 的任何系統上透明地執行 ARM 二進製文件,包括您的 64 位 x86 PC。

在您的情況下,由於 ARM 二進製文件是靜態連結的,因此不需要額外的設置。動態連結的二進製文件也需要它們的本地庫可用。

在基於Debianqemu-user-static的系統(包括基於Ubuntu )。binfmt-support``qemu-user-static``binfmt_miscupdate-binfmtsbinfmt-support``binfmt_misc

另請參閱Linux 上存在哪些類型的執行檔?, /proc/sys/fs/binfmt_misc/ 下的文件允許哪些可執行格式?,以及Mono 有什麼神奇之處?

引用自:https://unix.stackexchange.com/questions/648647