Busybox
為什麼我的 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 -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 二進製文件是靜態連結的,因此不需要額外的設置。動態連結的二進製文件也需要它們的本地庫可用。
在基於Debian
qemu-user-static
的系統(包括基於Ubuntu )。binfmt-support``qemu-user-static``binfmt_misc
update-binfmts
binfmt-support``binfmt_misc
另請參閱Linux 上存在哪些類型的執行檔?, /proc/sys/fs/binfmt_misc/ 下的文件允許哪些可執行格式?,以及Mono 有什麼神奇之處?