马上搞定ArmLinux交叉编译写一个程序,然后在电脑上编译生成可执行文件,最后在电脑上运行。程序的编辑——“编译——”运行,整个过程在X86电脑上进行。当我们开始接触嵌入式开发时,情况发生了变化。你在电脑上写一个程序,在电脑上编译一个可执行文件,最后这个可执行文件需要下载到你的开发板上才能运行。程序的最终运行环境发生了变化。比如你的开发板是基于Arm的——程序在X86上编辑编译,最后运行在另外一个架构和X86完全不同的Arm芯片上。之所以整个过程变成这样,是由嵌入式系统的特点决定的:一般嵌入式系统所用的芯片性能都比较弱,而且大多无法运行X86这样的Windows/Ubuntu桌面系统。即使能运行,性能也很弱,不能给你提供在开发板上编写和编译代码的环境。因此,我们的软件开发离不开X86计算机强大高效的桌面环境。但有一个问题。X86、Arm、MIPS、RISC-V等芯片的指令集由不同的组织或公司设计,彼此不兼容——Arm和MIPSCPU无法运行X86指令集。编码程序,反之亦然。所以如果我们要在X86计算机上编译一个可以在Arm上运行的程序,就必须明确地告诉编译器,编译后的可执行文件需要用Arm指令集的标准代码进行编码。为了让这个过程更简单,开发者针对不同的芯片开发了不同的编译器,比如针对Arm平台的arm-linux-gcc,针对mips平台的mips-linux-gnu-gcc,这些编译器都是基于相应的配置GCC针对特定的架构指令集,它们在运行时会生成对应目标平台的可执行文件。本文主要讲的是Arm交叉编译,所以这里后面会以Linux开发环境下的Armgcc为例。GCC对于工具链类型的命名规则是:arch[-vendor][-os][-(gnu)eabi]-gcc比如arm-linux-gnueabi-gcc,arm-none-eabi-gcc,aarch64-带有[]的linux-gnu-gcc是可选部分。arch:芯片架构,比如32位Arm架构对应的arch是arm,64位Arm架构对应的arch是aarch64。vendor:工具链提供者,大多数工具链名称不包括这部分。os:编译后的可执行文件(目标文件)所针对的操作系统,例如Linux。arm-none-eabi-gcc通常可用于ArmCortex-M/Cortex-R平台,它使用newlib库。ArmCortex-A系列芯片的arm-linux-gnueabi-gcc和aarch64-linux-gnu-gcc,前者针对32位芯片,后者针对64位芯片,使用glibc库。可用于编译u-boot、linux内核和应用程序。另外需要补充的是32位Arm和64位Arm的指令集不同,所以需要使用不同的工具链。当然,Arm64为了保证向前兼容,提供了32位兼容模式,所以我们用arm-linux-gnueabi-gcc编译的应用程序也可以直接在Arm64系统上运行,但是LinuxKernel和U-Boot不行,除非您提前将CPU切换到32位模式。曾经有一个项目用的是四核Arm64芯片,但是内存只有64M。为了节省空间,我们在CPU跑U-Boot之前将其切换为32位模式。后来的U-Boot,LinuxKernel,所有的应用程序都是用32位编译的,加上Thumb指令集,节省了很多空间。工具链下载安装下载地址Arm平台上使用最广泛的工具链是Linaro发布的。您可以从Linaro的官方网站下载它。地址如下:http://releases.linaro.org/components/toolchain/binaries/同时发现Linaro表示后续新版本的工具链将通过Arm正式发布。https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain4.9、6.3、7.4这些是工具链的版本号。理论上,版本越新,性能越好。在优化u-boot大小的时候,发现6.3版本的工具链生成的二进制文件比4.9版本生成的二进制文件小了几百个字节。一些接收到的字符串全部被过滤掉。4.9版本虽然也有过滤,但不如6.3干净。当前使用的版本应该是6.x。当然,我也看到一些开发组织正在使用7.x工具链。例如,Armbian目前正在用7.4编译内核。另外,最新版的U-Boot已经强制使用GCC6.0以上版本进行编译。这两个网站下载可能比较慢,可以考虑使用国内镜像下载:https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchains/下载可以直接点击下载,或者你可以使用命令行下载下载wget命令:wgethttps://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchains/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar。xzwgethttps://镜像。tuna.tsinghua.edu.cn/armbian-releases/_toolchains/gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz下载了两个,arm是32位的,aarch64是Arm64的。安装解压:xz-dgcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar.xzxz-dgcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz安装到/usr/local/toolchain/目录,当然你可以放在其他任何你喜欢的地方:sudomkdir-p/usr/local/toolchaintar-xvfgcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar-C/usr/local/toolchain/sudotar-xvfgcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar-C/usr/local/toolchain/成功后执行ls命令,即可看到两个Toolchain已经安装到/usr/local/toolchain/目录下。添加环境变量只有将可执行文件对应的路径添加到PATH环境变量中,系统才能识别这些命令。这里的路径就是上面截图中pwd命令显示的路径,可以在~/.bashrc文件末尾加上:PATH=$PATH:/usr/local/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/bin:/usr/local/toolchain/gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu/bin注意:两个独立的路径用冒号隔开:.执行source~/.bashrc命令使配置生效,然后我们可以在命令行执行这些命令:比如arm-linux-gnueabihf-gcc-v和aarch64-linux-gnu-gcc-v查看compilerversion:Yes如果你看到图中显示的信息,就说明你完成了。编译内核在这里下载imx的官方内核:gitclonehttps://source.codeaurora.org/external/imx/linux-imx切换到4.19版本:gitcheckout-bimx_v2019.04_4.19.35_1.0.0origin/imx_v2019.04_4.19.35_1.0.0编译:makeARCH=armimx_v7_defconfigmakeARCH=armCROSS_COMPILE=arm-linux-gnueabihf-如果你电脑上其他依赖库安装完整,就可以编译成功。更多原创作品,请扫描二维码关注微信公众号:HackforFun
