[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上可用。
如果有更好的方法,还请下方留言
[Android]按阶段编译Android kernel中的代码相关推荐
- android 运行在ui县城,Android基础:在UI线程中运行代码
Android基础:在UI线程中运行代码 从在UI线程中运行代码的角度来看,在以下方面有什么区别:MainActivity.this.runOnUiThread(new Runnable() { pu ...
- android studio 闪电编译,Android Studio中Instant Run
Instant Run 翻译成中文叫即时运行或直接运行模板.不过我一般习惯了叫做闪电运行,为什么这么叫?请看图: 小闪电 有个小闪电(2.3.x版本独立有个小闪电,2.0-2.2是和左边运行图标在一块 ...
- android:自己动手编译Android源码(超详细)
自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 4330 阅读 86819评论 89喜欢 339赞赏 7 在Android Studio代码调试一文中 ...
- [Android Pro] ant 编译android工程
参考文章: http://blog.csdn.net/xyz_lmn/article/details/7268582?reload http://hubingforever.blog.163.com/ ...
- Android 使用Ant编译Android 工程
如何编译Android 工程? 关于如何编译Android 工程在这篇官方文档这里中解释的比较清楚, 太多的详细的解释我就不说了,RTFM. 我需要说的是我们既可以让IDE替你完成编译的编译工作,也可 ...
- android 关闭jack_编译Android时禁用Jack Server
编译Android时禁用Jack Server 2017-07-24 15:29:43 +08 字数:818 标签: Android 本文的代码与方法,基于Android O(8.0). 简介 ¶ J ...
- android studio ant编译,Android Studio编译cocos2dx项目
一.所需工具 1.Android studio2.3 2.cocos2dx3.10 3.jdk1.8 4.ndkr9d 5.sdk 6.ant 7.python2.7.14 二.配置环境变量 1.sd ...
- android 关闭jack_编译Android时禁用Jack
编译Android时禁用Jack 2017-07-06 18:18:52 +08 字数:815 标签: Android 本文的代码与方法,基于Android O(8.0). 问题 ¶ 根据Androi ...
- android 12306反编译,Android开发(七)| “我的12306”实例
作为程序员,从一无所知开始接触.熟练使用android控件.布局.活动,自己开发的项目随之越来越茁壮,功能越来越完善,我们的内心是由衷感到高兴的. 为了对两个月的学习成果有一个检验,我把之前所学所讲做 ...
- linux kernel中cache代码解读
1. 在kernel中调用__dma_flush_range,底层是如何操作的呢? /* remove any dirty cache lines on the kernel alias */__dm ...
最新文章
- 宠物乘机的三种模式【转】
- JTA 深度历险 - 原理与实现---转
- The Elder HDU - 5956
- 在线文本转2-36任意进制工具
- JS判断字符串包含的方法
- 拓端tecdat|R语言t检验和非正态性的鲁棒性
- Python | OpenCV简单生成调色板
- 应聘引擎程序需做哪些准备
- 树莓派x86Android,3种创客开发板走向专业-浅谈X86树莓派板型的UP系列
- C++ 惯用法之 Nifty Counter
- 大数据为湖湘互联网发展加码
- 小米15.6笔记本安装UBUNTU18.04 无WIFI驱动解决方法
- Python四行代码实现的猜数字小游戏,基于thinker,带GUI界面
- 市场的结构,各种投资方法的此消彼长,没有所谓圣杯
- 计算机程序无法启动,应用程序无法正常启动,教您电脑应用程序无法正常启动0xc000007b怎么解决...
- STM32 BLDC电机驱动开发板资料 反电动势B-EMF过零检测
- python爬虫教程:如何用40行Python代码实现天气预报和每日鸡汤推送功能
- java排序-基础排序
- java实现老鼠迷宫游戏
- iOS微博项目(五)- 实现超链接和时间,下拉,未读数,微博正文,评论
热门文章
- 记zabbix正常启动,但是没有监听任何端口问题
- 混沌数学之Chua's circuit(蔡氏电路)
- 计算机专业考研的好学校排名2015,计算机类专业考研最好的学校排名
- 北京与洛杉矶时差16小时,飞机飞行时间是12小时40分钟。请输入从洛杉矶起飞的日期与时间,计算出到达北京的日期与时间。
- 做最便宜的监控,旧手机变监控摄像头,还不用app
- Web前端——HTML表单及表格
- 网站建设就是要大胆创新
- animate发布html5教程,Adobe Animate CC 中的 HTML 发布模板 - Adobe Animate 用户指南
- [安卓逆向]安卓逆向-一次简单的静态分析
- angularJs监控页面加载完毕