可以跨硬件平台的可执行文件

本文揭示了如何在x86-64平台上运行原本为arm64编译的binary文件。通过深入探究发现,这并非真正的跨平台binary,而是借助qemu实现了不同架构间的指令集模拟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般情况下,不同的硬件平台(CPU)具有不同的指令集,源代码只有通过对应编译器才能得到在该平台下运行的可执行文件,对于不同操作系统,由于OS提供给用户程序的接口不同,也必须有相应的编译器产生对应的可执行文件。这样看来几乎不可能有跨平台的可执行文件。

有一般就有特殊。

在x86-64 的Ubuntu 中执行:

$ docker pull arm64v8/busybox

完成之后进入docker的home目录。一般在/var/lib/docker,找到刚刚pull下来的image的rootfs,我这里就不讲怎么找到了,简单的方法是你只有刚下载的busybox image,如果docker 存储驱动是overlay2,那么rootfs就在overlay2下面,
/var/lib/docker/overlay2# ls
d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4  eb8bd5773fed50a4ba79b035e1b0a4c7997684e81aa7065d89f5f9d185e7afee  eb8bd5773fed50a4ba79b035e1b0a4c7997684e81aa7065d89f5f9d185e7afee-init  l
/var/lib/docker1/overlay2# cd d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4/
/var/lib/docker1/overlay2/d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4#ls

diff  link
root@jiawu02-wu:/var/lib/docker1/overlay2/d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4# cd diff
root@jiawu02-wu:/var/lib/docker1/overlay2/d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4/diff# ls
这就是rootfs了
bin  dev  etc  home  root  tmp  usr  var
root@jiawu02-wu:/var/lib/docker1/overlay2/d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4/diff# cd bin
root@jiawu02-wu:/var/lib/docker1/overlay2/d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4/diff/bin# ls
cksum          eject        getty      iplink    lzop        nohup          reboot        sha3sum            test          uptim
在/bin下有很多的命令,用file查看其中命令:

#:file ls
ls: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, stripped

可以看到这个文件是在arm64平台下编译出来的,按理也只能在arm64的平台下运行,下面是见证奇迹的时刻:

./ls
[                  df                 gzip               lpd                passwd             setlogcons         tty
[[                 dhcprelay          halt               lpq                paste              setpriv            ttysize
acpid              diff               hd                 lpr                patch              setserial          tunctl
add-shell          dirname            hdparm             ls                 pgrep              setsid             ubiattach
addgroup           dmesg              head               lsattr             pidof              setuidgid          ubidetach

ls可以正常运行!不仅ls其他的命令都可以正常运行。


揭秘:

这并不是什么可以跨平台的binary,原因是在运行非本平台的binary时自动运行qemu来run binary。

:/var/lib/docker/overlay2/da950200048f64a8749daa117941e74a114c16567c3fea49f227097b82e78a44/diff/bin# file cat
cat: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, stripped

root@jiawu02-wu:/var/lib/docker/overlay2/da950200048f64a8749daa117941e74a114c16567c3fea49f227097b82e78a44/diff/bin# ./cat

$ ps aux |grep cat

root     18019  0.0  0.2 110492  8400 pts/2    Sl+  14:35   0:00 /usr/bin/qemu-aarch64 ./cat

可以看到运行cat时先启动了qemu-aarch64,于是疑惑解除了。看来遇到有返常理的事还是不能轻易下结论,一定要刨根究底,即便找不到真正的原因也不能贸然下结论,以免以讹传讹 ,贻误他人。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值