JH7110的SDK使用buildroot来构建其根文件系统。而buildroot是支持生成工具链的,这个工具链里面包含了rootfs里面带的libc库等。使用此工具链可以编译内核,bootloader以及用户的应用程序。
首先,Buildroot构建rootfs时会生成toolchain,相关内容位于output/host/目录。一般来说,一个最简单的工具链只需要包含libc库,还有gcc编译器本身。对于riscv平台的交叉编译环境来说,这个libc库是riscv环境下面的,而gcc编译器则是一个开发机(笔者这里用的是虚拟机)上面运行的可执行程序,编译出来的目标程序是riscv的。
之前的文章介绍过JH7110 SDK的编译流程,它构建initramfs 的同时会指定这个initramfs 的工具链做为编译内核和uboot的工具链。其配置文件为conf /buildroot_initramfs_config。下面看下这个文件
这个config文件里面包含了很多内容,而构建最简单的工具链是不需要这么多的,这里需要进行裁剪。
上图这个是笔者裁剪出来的。下面说明一下
这几个选项是处理器核心相关的,保留即可
这几个选项指定的是内核的头文件。由于libc库中发起ioctl等操作时需要使用内核的一些宏定义和结构体,因此这些也是必须的。这个地方最好改成直接从SDK的kernel目录里面获取头文件,避免修改内核源码之后部分定义不一致的问题。
这两个选项指定使用的是何种libc库。目前支持的主要是glibc uclibc和musl。通常选用glibc,资源紧张的小型处理器会选用uclibc。
这几个则是编译器的一些特性。按默认的即可,如果有特殊需求也可以添加。
这个选项是可以在构建工具链的时候添加一个环境变量设置的脚本,这样每次使用前source一下就可以使用此工具链了。
然后执行构建。构建的时候需要额外编译sdk,构建命令如下
$(MAKE) -C $< RISCV=$(RISCV)O=$(buildroot_initramfs_wrkdir) sdk
添加到此处
然后可以在work/ initramfs的image目录下面看到这个压缩包,它的命名是类似这样的
riscv64-buildroot-linux-gnu_sdk-buildroot.tar.gz
将此tar.gz放到用户指定的目录下,解压,解压之后执行relocate-sdk脚本,即可将sdk部署到当前文件夹,然后需要使用此编译器前,执行
source environment-setup
即可设置好环境变量