我拿到的SDK建议开发的系统是Ubuntu22.04(在SDK-docs中的文档有说明),因此,WSL中要先安装好它。由于PC机上WSL本身不支持aarch64架构,所以,进行ARM64的RK356X开发,需要手动加入支持。用到的支持软件和模拟器分别是binfmt-support和qemu-user-static。
1. 安装相关软件包
1.1 首先当然得安装Ubuntu22.04
在WSL中,不要安装更高的版本,之前试过Ubuntu24.04版,不行,虽然SDK中建议安装Ubuntu20.04以上版本,实际上新版ubuntu有很多不兼容的问题,只认准22.04即可。
1.2 安装相关依赖软件
在SDK文档中有说明需要安装哪些依赖包,注意,有的包在WSL中是不支持的,因此,需要安装其它替代软件,且后面开发需要对相关脚本进行调整。其中,最重要的是要安装binfmt-support和qemu-user-static,它是跨平台开发根文件系统支持的关键:
sudo apt install binfmt-support qemu-user-static
SDK中是这样的安装顺序,是错的!在WSL中只需要安装qemu-user-static即可自动安装它适配的binfmt-support,如果先装binfmt-support,那么qemu将不能适配,造成qemu无法适配对应的跨平台二进制文件。
2. 注册binfmt_misc解析器
使用命令ls /proc/sys/fs/binfmt_misc查看内核当前注册的解析器,发现没有aarch64的解析器,也可以使用命令update-binfmts --display来查看:
于是,我们需要手动注册,先使用命令查看是否存在aarch64解释器的可执行文件:
ls /usr/bin/qemu-aarch64*
可以看到有两个可执行文件,我们用前面一个,再查看解释器:
ls /usr/libexec/qemu-binfmt/aarch64*
发现有一个解释器文件,它实际就是指向/usr/bin/qemu-aarch64-static的。
然后编辑命令,注册解释器:
sudo update-binfmts --package qemu-aarch64-static \
--install qemu-aarch64 /usr/libexec/qemu-binfmt/aarch64-binfmt-P \
--magic '\x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00 ' \
--mask '\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' \
--offset 0
注意,--package指向一个包名,它是解释器可执行文件的名称;--install第一个参数就是注册后解释器的名称,可以通过update-binfmts --display name来查看注册信息的,name就是第一个参数,第二个参数是解释器的路径;--magic --mask匹配魔数和掩码,这里需要看qemu-aarch64源代码,记住上面例子的就可以,--offset 偏移设为0即可。
执行上面命令后,可以查看注册后的结果了:
附加说明:binfmt_misc是linux内核一个功能,当需要执行其它平台(或架构)的二进制文件时,会读取该文件开始一段数据(起始位置即offset设定的位置,长度就是magic的长度),匹配注册信息中的magic(与mask作与运算),如果匹配到了,则调用解释器去执行该文件,在X86_64的PC中进行ARM64的开发时,这个功能是必须要的。
其它编译与vmware workstation中的基本一致。