[Android]按阶段编译Android kernel中的代码

准备阶段

最好完整编译过一次,有完整的out;

确认kernel编译指令

最快的方式不是去看Makefile,而是故意写个断言触发编译报错,并通过搜索字段”Failed:“获取完整编译指令,类似这种:

FAILED: out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/zImage
/bin/bash -c "(./prebuilts/build-tools/linux-x86/bin/make -j32 -C kernel-4.19 O=/*****/out/target/product/*****/obj/KERNEL_OBJ ARCH=arm CROSS_COMPILE=arm-linux-androidkernel- CLANG_TRIPLE=arm-linux-gnueabi- LD=ld.lld CC=clang ROOTDIR=/***** PATH=/*****/prebuilts/clang/host/linux-x86/clang-r383902/bin:/*****/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:/usr/bin:/bin:\$PATH PROJECT_DTB_NAMES=*****) && (if [ -e out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd ]; then cp out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd.bak; sed -e 's/\\\\\\\\\\\\\\\\/\\\\\\\\/g' < out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd.bak > out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd; rm -f out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd.bak; fi ) && (python device/mediatek/build/build/tools/check_kernel_size.py out/target/product/*****/obj/KERNEL_OBJ kernel-4.19 *****)"

需要这一步的原因是,我们需要make时的环境变量PATH,因此需要手动复制上面加粗部分的实际内容到你的终端中执行一次;

确认子模块编译指令

以mm/vmscan.o为例,可以在这个地方找到这个目标文件的编译指令:

out/target/product/*****/obj/KERNEL_OBJ/mm/.vmscan.o.cmd

用文本编辑类工具打开,第一行则是编译指令:

cmd_mm/vmacache.o := clang -Wp,-MD,mm/.vmacache.o.d -nostdinc -isystem /*****/prebuilts/clang/host/linux-x86/clang-r383902/lib64/clang/11.0.1/include -I/*****/kernel-4.19/arch/arm/include -I./arch/arm/include/generated  -I/*****/kernel-4.19/include -I/*****/kernel-4.19/drivers/misc/mediatek/include -I./include -I/*****/kernel-4.19/arch/arm/include/uapi -I./arch/arm/include/generated/uapi -I/*****/kernel-4.19/include/uapi -I./include/generated/uapi -include /*****/kernel-4.19/include/linux/kconfig.h -include /*****/kernel-4.19/include/linux/compiler_types.h  -I/*****/kernel-4.19/mm -Imm -D__KERNEL__ -mlittle-endian -Qunused-arguments -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -Werror-implicit-function-declaration -Wno-format-security -std=gnu89 --target=arm-linux-gnueabi --prefix=/*****/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/ --gcc-toolchain=/*****/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9 -no-integrated-as -Werror=unknown-warning-option -fno-PIE -fno-dwarf2-cfi-asm -fno-omit-frame-pointer -mabi=aapcs-linux -mfpu=vfp -meabi gnu -marm -Wa,-mno-warn-deprecated -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -fno-delete-null-pointer-checks -Wno-int-in-bool-context -Wno-address-of-packed-member -O2 -Wframe-larger-than=1400 -fstack-protector-strong -Wno-format-invalid-specifier -Wno-gnu -Wno-tautological-compare -mno-global-merge -Wno-unused-const-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -Wdeclaration-after-statement -Wno-pointer-sign -Wno-array-bounds -fno-strict-overflow -fno-merge-all-constants -fno-stack-check -Werror=implicit-int -Werror=strict-prototypes -Werror=date-time -Werror=incompatible-pointer-types -fmacro-prefix-map=/*****/kernel-4.19/= -Wno-initializer-overrides -Wno-unused-value -Wno-format -Wno-sign-compare -Wno-format-zero-length -Wno-uninitialized -Werror -DJRD_PROJECT_=1    -DKBUILD_BASENAME='"vmacache"' -DKBUILD_MODNAME='"vmacache"' -c -o mm/.tmp_vmacache.o /*****/kernel-4.19/mm/vmacache.c

可以看到,这里用的-o直接输出.o目标文件;

那么我们就可以基于这个命令进行改造:

预编译阶段 ——  clang ... -E -o tmp.i ...

编译阶段 —— clang ... -S -o tmp.s ...

汇编阶段 —— 原指令即可

注:这句命令是需要进入到out/target/product/*****/obj/KERNEL_OBJ目录中执行的

 

以上是将Android kernel文件从.c到.o的编译阶段进行拆分的具体步骤,可以用于定位一些编译异常的原因,亲测在Android R上可用。

如果有更好的方法,还请下方留言

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值