灵感来源:前几天捣鼓k9的内核偶然想到的
注:本人小白一枚,如有错误请指出
注:本文为速通文章,存在奇技淫巧,这些奇技淫巧可能会导致编译出来的内核刷入后开不开机或功耗增大等副作用
注:请确保手机已经root
1.准备工作
准备一个linux环境,实体机或虚拟机都行
2.安装依赖
1 | sudo apt install clang lld bison flex make python2.7 binutils binutils-aarch64-linux-gnu binutils-arm-linux-gnueabihf git -y |
解释:
- clang: c编译器,google从某一个安卓版本起使用魔改clang编译安卓内核,但是这是速通所以就不去谷歌拉巨大编译链了
- lld: 连接器,跟clang一起隶属于llvm项目,是llvm的前端
- bison,flex: 语法分析器,flex将.lex文件翻译成.c文件,bison将.y文件翻译成.y和.h文件:
- make: 一个自动化编译工具,通过解析makefile描述的文件和规则执行编译操作
- python2.7: 用于执行scripts里的mkdtboimg.py生成dtbo.img,如果软件源里没有可以用python3版本的mkdtboimg.py替代
- binutils:一个编译工具集合,提供例如as,ar等一系列工具,例如头图的 AR built-in.a.但是一般安装的是本机架构的binutils,对于交叉编译来说语言安装对应架构的binutils
3.获取源码
一般在github搜索就能找到,例如:
kernel_xiaomi(小米)_sm8250(手机对应的soc代号,可以百度,例如骁龙855,860对应sm8150,骁龙845对应sdm845,骁龙835对应msm8998)
4.确认手机配置文件
手机有root的话直接提取/proc/config.gz然后解压gz文件就能获取本机配置文件扔在内核源码根目录下的arch/arm64/configs/xxx_defconfig就可以了
5.克隆源码:
1 | git clone 内核源码网址 --depth=1 |
内核编译一般情况下只需要拉取一层的git提交记录就可以了。如果要多拉基层就把1改成对应的数字
6.编译
在源码根目录下执行
1 | make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- CROSS_COMPILE_ARM32=arm-linux-gnuabeihf- CC=clang LD=ld.lld HOSTCC=clang HOSTLD=ld.lld O=out KCFLAGS+=-Wno-error xxx_defconfig all |
解释:
make: 执行构建指令
ARCH=arm64: 编译内核架构为arm64
CROSS_COMPILE: 指定交叉编译器,由于是速通使用默认binutils就可以,默认是64位,ARM32是32位
CC=clang: 内核编译器为clang
LD=ld.lld: 内核链接器为lld
HOSTCC=clang: 使用本机编译器为clang,上图中的conf和dtc都是通过本机编译器而不是内核编译器来编译的
HOSTLD=ld.lld: 使用本机编译器为ld.lld
O=out: 构建目录为out
KCFLAGS+=-Wno-error: 在KCFLAGS里追加-Wno-error参数,绝大多数编译内核导致的错误通常都是因为kbuild默认启用了-Werror参数导致,魔改编译器习以为常的代码在原汁原味编译器上会被视为警告,而-Werror参数是默认所有警告都被当做是错误:
然后就可以在arch/arm64/boot下找到Image开头的内核文件了。
如果还是遇到-Werror=xxx的错误呢?
那就编辑根目录下的Makefile,删除所有带有werror的字样,然后重新编译。
-------------本文结束感谢您的阅读-------------