默认编译器
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其对应的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的用处,请参见此处)
注意!
- gcc 4.9在主线上已经进入了被弃用的状态,因此直接下载或clone其master分支,将无法得到能用的gcc 4.9
- 你也可以选择直接下载其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
32位的gcc 4.9
//同样的,主线被弃,请使用对应tag版本https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9 -b android-10.0.0_r32 --depth=1
//不够科学的下载
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
sdclang
- 官网需要开发者账号才能下载,此处提供一个github版本
谷歌的clang
git clone https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86 --depth=1
- 也可以直接下载targz压缩包
- 如果不够科学可以使用清华大学镜像站
- 平时我们说的clang 10.0.5之类的,都是指谷歌的clang
git clone https://aosp.tuna.tsinghua.edu.cn/platform/prebuilts/clang/host/linux-x86 --depth=1
编译器的使用
tar.gz文件的解压
tar -xzvf <文件名> -C <目标文件夹>
- 目标文件夹需要手动先创建 如果想解压到当前文件夹,请去掉-C以及后面的东西
开始编译
- 先拿出一个比较通用的启动脚本
#!/bin/bash args="-j$(nproc --all) \ O=out \ ARCH=arm64 \ CLANG_TRIPLE=aarch64-linux-gnu- \ CROSS_COMPILE=<编译器路径>/bin/aarch64-linux-gnu- \ CC=<编译器路径>/bin/clang \ CROSS_COMPILE_ARM32=<编译器路径>/bin/arm-linux-gnueabi- " make ${args} <config name> make ${args}
接下来开始介绍编译器相关参数的使用
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
- 参见此处
kdrag0n的aarch64-elf-gcc
- 这是一个专门用于跑内核的gcc,似乎并不能用来跑一般二进制文件
- 指定时请使用
CROSS_COMPILE=<编译器路径>/bin/aarch64-elf-
,32位同理 - gcc的版本为9.2,请注意源码的兼容性
DragonTC clang
- 这个版本已经很老了,想用也不是不能用
GNU GCC 10
- 纯种GCC的最新版本
Linaro GCC 8
- 一个由Linaro 公司优化的fork
Linaro GCC 10
- 一个由Linaro 公司优化的fork
- 含有linaro的gcc工具链
更高版本的sdclang
- 上面的那个sdclang 6.0.2是4.14内核的标配
- 请在这里寻找更高版本的sdclang
转载来源:ARK社区