为什么我的 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 -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 的系统)上,这是由和软件包设置的binfmt-supportqemu-user-static软件包注册binfmt_miscQEMU 可以使用以下命令处理的配置update-binfmts,并且binfmt-support包确保注册的配置被加载到内核(binfmt_misc是内核模块)中。

也可以看看Linux 上存在哪些类型的可执行文件?,/proc/sys/fs/binfmt_misc/ 下的文件允许哪些类型的可执行格式?, 和Mono 有何神奇之处?

相关内容