本文介绍在Ubuntu 16.04上基于通用ARM toolchain完成远程运维设备端代码移植到ARM v8上。

准备工作

下载Toolchain

a. 假设我们在Ubuntu的/tmp/目录下通过下面的命令下载toolchain:

  1. $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

下载过程如下:

image.png

b. 将工具链解压到/tmp目录:

  1. $tar xf gcc-linaro-7.3.1-2018.05-i686_arm-linux-gnueabi.tar.xz

image.png

c. 测试gcc可用:

image.png

下载设备端代码

a. 假设我们在Ubuntu的/tmp/目录下通过下面的命令下载最新代码包:

  1. git clone https://github.com/alibaba/iot_remote_access.git

注意: 如果您的Ubuntu上并未安装git,请使用以下命令首先安装git: sudo apt-get install -y git

image.png

新增第三方库编译脚本

参考一键编译手册的流程,我们拷贝support_armv7.sh到script目录,重命名为support_armv8.sh .

  • 修改support_armv8.sh里的相关变量,依据规则如下:
  1. _ToolChainRootDirectory: 指的是ToolChain解压的根目录,一般情况下,ToolChain的根目录包含include/bin/lib等目录
  2. _CrossPrefix: 指的所采用的Gcc的前缀,一般在ToolChain的根目录bin下,有*-gcc,比如arm-linux-gnueabi-gcc等。
  3. _Host: 指的是交叉编译器所运行的OS信息,一般情况下,可以通过*-gcc -v获取其中的--host值。
  4. _Target: 指的是交叉编译器所运行的Target信息,一般情况下,可以通过*-gcc -v获取其中的--target值。
  5. _TargetBit: 值的是交叉编译的目标平台的bit数,一般为 32位。
  6. _NewBoardName: 新的平台的名称,最好跟脚本名称里包含的board名称一致,假如为myboard

_ToolChainRootDirectory: 在当前文档中,我们是/tmp/gcc-linaro-7.3.1-2018.05-i686_aarch64-linux-gnu
_CrossPrefix: 当前toolchain,交叉编译的通用前缀是aarch64-linux-gnu- ,获取方法如下:

image.png

_Host: 当前toolchain,我们这个是 i686-pc-linux-gnu,获取方法如下:

image.png

_Target: 当前toolchain,我们这个是 aarch64-linux-gnu,获取方法如下:

image.png

_TargetBit: 就是设备是32bit的还是64bit的机器,当前文档我们使用的是arm v8的cpu,所以是64bit的。

_NewBoardName: 假设我们重新命名为新设备为armv8,这样脚本运行后,我们会在board目录看到armv7的子目录。
至此,support_armv8需要用户自行修改的内容如下:

image.png

执行第三方库编译脚本

我们在script目录下,直接运行刚才新建的脚本:

/tmp/iot_remote_access/script$ ./support_armv8.sh

完整的编译日志可以到这里下载: compile.log.zip
编译完成后的输出如下:

image.png

此时,我们可以到board目录下,看到已经新增了一个目录armv8,并且armv8的目录内容如下:

image.png

编译可执行程序

我们在顶层目录下,执行下面的命令,完成编译:

/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

可以看到编译结果如下:

image.png

我们通过file命令,可以查看是否编译的产物符合预期:

image.png

如果我们需要让二进制flash占用更小些,可以strip一下:
image.png

编译生成物介绍

image.png

完整的编译框架使用指南请参考: https://www.yuque.com/yuehu/link_iot_edge_lite/xft9x9