这也是大多数萌新比较疑惑的点 那就是编译器是从哪里来的 又该如何选择
默认编译器
CAF机型(除谷歌外的高通设备)
- 3.18/4.4/4.9内核,默认均使用谷歌的gcc 4.9
- 4.14内核,默认使用sdclang + gcc 4.9 (谷歌的clang也许能用,具体啥情况我也不清楚)
谷歌机型(Pixel系列)
- 从Pixel2开始使用clang编译,Pixel3开始使用clang的LTO优化
使用不匹配的编译器,轻则无法开机,重则编译失败
下载编译器
注意!
- gcc 4.9在主线上已经进入了被弃用的状态,因此直接下载或clone其master分支,将无法得到能用的gcc 4.9
- 请选择clone其对应的android tag分支,比如
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9 -b android-10.0.0_r32 --depth=1
(至于depth=1的用处,请参见此处)
- 你也可以选择直接下载其targz压缩包
上述过程需要科学上网,如果你不够科学,可以使用清华大学镜像站
git clone https://aosp.tuna.tsinghua.edu.cn/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9 -b android-10.0.0_r32 --depth=1
- 同样的,主线被弃,请使用对应tag版本
https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9 -b android-10.0.0_r32 --depth=1
- targz压缩包下载
- 不够科学的下载
git clone https://aosp.tuna.tsinghua.edu.cn/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9 -b android-10.0.0_r32 --depth=1
- 可以
git clone https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86 --depth=1
- 也可以直接下载targz压缩包
- 如果不够科学可以使用清华大学镜像站
git clone https://aosp.tuna.tsinghua.edu.cn/platform/prebuilts/clang/host/linux-x86 --depth=1
- 平时我们说的clang 10.0.5之类的,都是指谷歌的clang
编译器的使用
tar.gz文件的解压
tar -xzvf <文件名> -C <目标文件夹>
- 目标文件夹需要手动先创建 如果想解压到当前文件夹,请去掉-C以及后面的东西
开始编译
接下来开始介绍编译器相关参数的使用
CLANG_TRIPLE
和CC
只在使用clang时需要指定
CROSS_COMPILE_ARM32
只在编译32位内核/带vdso补丁的内核时需要指定
- 如果你在使用谷歌的gcc 4.9,请指定
CROSS_COMPILE=<编译器路径>/bin/aarch64-linux-android-
,32位同理
- 正常情况下
CROSS_COMPILE
和 CROSS_COMPILE_ARM32
都应指向gcc所在位置,即使你在使用clang也是如此,因为clang无法提供编译内核所需的binutils
- 接上面一条:正常情况下,clang是无法独立完成内核编译的,需要gcc的辅助。除非你在使用ClangBuiltLinux Clang
极客选项
ubuntu的交叉编译器
在ubuntu 上,你可以使用apt快速安装gcc
sudo apt-get install gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi
即可安装32位和64位的交叉编译器
- 在ubuntu 19.10上,这样安装得到的gcc版本为9.2.1,版本可能有点高,直接拿去跑官方内核很有可能带来大量警告甚至是错误
- 指定这样的gcc其实更加简单,只需要
CROSS_COMPILE=aarch64-linux-gnu-
即可,32位同理,非常方便
ClangBuiltLinux clang
- 这是一个专门用于跑内核的gcc,似乎并不能用来跑一般二进制文件
- 指定时请使用
CROSS_COMPILE=<编译器路径>/bin/aarch64-elf-
,32位同理
- gcc的版本为9.2,请注意源码的兼容性
更高版本的sdclang
- 上面的那个sdclang 6.0.2是4.14内核的标配
- 请在这里寻找更高版本的sdclang