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

一般情况下,不同的硬件平台(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,于是疑惑解除了。看来遇到有返常理的事还是不能轻易下结论,一定要刨根究底,即便找不到真正的原因也不能贸然下结论,以免以讹传讹 ,贻误他人。


猜你喜欢

转载自blog.csdn.net/wujianyongw4/article/details/78911254