[Adnroid内核向] 交叉编译器的选择

默认编译器

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_TRIPLECC只在使用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

bfsu源

  • 含有linaro的gcc工具链
更高版本的sdclang
  • 上面的那个sdclang 6.0.2是4.14内核的标配
  • 请在这里寻找更高版本的sdclang

转载来源:ARK社区

消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息