本文介绍在Ubuntu 16.04上基于通用ARM toolchain完成远程运维设备端代码移植到ARM v8上。
准备工作
下载Toolchain
a. 假设我们在Ubuntu的/tmp/目录下通过下面的命令下载toolchain:
$wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-i686_aarch64-linux-gnu.tar.xz
下载过程如下:
b. 将工具链解压到/tmp目录:
$tar xf gcc-linaro-7.3.1-2018.05-i686_arm-linux-gnueabi.tar.xz
c. 测试gcc可用:
下载设备端代码
a. 假设我们在Ubuntu的/tmp/目录下通过下面的命令下载最新代码包:
git clone https://github.com/alibaba/iot_remote_access.git
注意: 如果您的Ubuntu上并未安装git,请使用以下命令首先安装git:
sudo apt-get install -y git
新增第三方库编译脚本
参考一键编译手册的流程,我们拷贝support_armv7.sh
到script目录,重命名为support_armv8.sh
.
- 修改support_armv8.sh里的相关变量,依据规则如下:
_ToolChainRootDirectory: 指的是ToolChain解压的根目录,一般情况下,ToolChain的根目录包含include/bin/lib等目录
_CrossPrefix: 指的所采用的Gcc的前缀,一般在ToolChain的根目录bin下,有*-gcc,比如arm-linux-gnueabi-gcc等。
_Host: 指的是交叉编译器所运行的OS信息,一般情况下,可以通过*-gcc -v获取其中的--host值。
_Target: 指的是交叉编译器所运行的Target信息,一般情况下,可以通过*-gcc -v获取其中的--target值。
_TargetBit: 值的是交叉编译的目标平台的bit数,一般为 32位。
_NewBoardName: 新的平台的名称,最好跟脚本名称里包含的board名称一致,假如为myboard。
_ToolChainRootDirectory: 在当前文档中,我们是/tmp/gcc-linaro-7.3.1-2018.05-i686_aarch64-linux-gnu
_CrossPrefix: 当前toolchain,交叉编译的通用前缀是aarch64-linux-gnu-
,获取方法如下:
_Host: 当前toolchain,我们这个是 i686-pc-linux-gnu
,获取方法如下:
_Target: 当前toolchain,我们这个是 aarch64-linux-gnu
,获取方法如下:
_TargetBit: 就是设备是32bit的还是64bit的机器,当前文档我们使用的是arm v8的cpu,所以是64bit的。
_NewBoardName: 假设我们重新命名为新设备为armv8,这样脚本运行后,我们会在board目录看到armv7的子目录。
至此,support_armv8
需要用户自行修改的内容如下:
执行第三方库编译脚本
我们在script
目录下,直接运行刚才新建的脚本:
/tmp/iot_remote_access/script$ ./support_armv8.sh
完整的编译日志可以到这里下载: compile.log.zip
编译完成后的输出如下:
此时,我们可以到board目录下,看到已经新增了一个目录armv8,并且armv8的目录内容如下:
编译可执行程序
我们在顶层目录下,执行下面的命令,完成编译:
/tmp/iot_remote_access$ CC=/tmp/gcc-linaro-7.3.1-2018.05-i686_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc make board=armv8
可以看到编译结果如下:
我们通过file
命令,可以查看是否编译的产物符合预期:
如果我们需要让二进制flash占用更小些,可以strip
一下:
编译生成物介绍
完整的编译框架使用指南请参考: https://www.yuque.com/yuehu/link_iot_edge_lite/xft9x9