我正在尝试构建AOSP内核,但是我无法使生成的boot.img
足够小,无法刷新和引导它。它包含带有附加dtb和initramfs的压缩内核。我的意图是使用Syzkaller对驱动程序进行模糊测试。我目前正在使用Pixel XL(马林)。我使用内核分支android-msm-marlin-3.18-pie-qpr3
(也尝试了相关的分支),并且正在尝试各种基于gcc的工具链。对于AOSP,我选择了Pie(标记android-9.0.0_r46
,构建PQ3A.190801.002
)。但是,请注意,这是一个普遍的问题,它不是模糊,内核或设备特定的。
我的要求是:
保留供应商介绍的驱动程序(因为它们是我想要模糊的东西)
启用KASAN和KCOV(及其依赖项)
启用CONFIG_DEBUG_INFO
保持printk
等
我尝试过的事情和我拥有的想法:
Tuning kernel config-这有助于扩展,但这还不够。我已经在使用例如CONFIG_CC_OPTIMIZE_FOR_SIZE=y
,CONFIG_CORE_SMALL=y
,CONFIG_NET_SMALL=y
,CONFIG_KASAN_OUTLINE=y
,CONFIG_TRIM_UNUSED_KSYMS=y
,CONFIG_SLOB=y
,...
使用xz或lzma压缩内核(和/或initramfs)-这个想法似乎很有希望。我注意到arm64的内核构建系统既不支持xz也不支持lzma(不确定为什么?),所以我亲自对其进行了修补以使其得以构建。构建成功,并且生成的Image.xzkern-dtb
或Image.lzma-dtb
似乎还可以,但是在尝试引导它时(串行调试日志):
[5710] partition_enable_wp: group 0 not defined
[5720] DTB offset is incorrect, kernel image does not have appended DTB
[5720] Device info 0x00000131/00010001/0x00010001/0, pmic 0x20009/0x455013/0x0/0x0
[5740] ERROR: Appended Device Tree Blob not found
[5740] panic (frame 0x83a86848):
...
我已验证存在DTB,并且按预期压缩了内核。我在这里的问题:可能吗? Android引导程序是否甚至支持xz / lzma?我几乎没有在网上找到有关此信息。有什么方法可以使用xz或lzma压缩内核来启动Android吗?
调整启动分区的大小-似乎很困难,但有可能,不确定是否值得尝试。您可以为此推荐任何资源或工具吗?
从initramfs中删除不必要的功能
Link-Time Optimization-无论使用什么gcc版本,我都无法使其与AOSP内核一起使用。有提示吗?
将功能构建为模块,而不是内置的-即使尝试仅将单个功能构建为模块(根据配置的不同,编译器或链接器错误),构建也不会通过我尝试的任何配置成功完成。您有任何指南或提示吗?
我还遵循了在AOSP主页(link)上使用KASAN和KCOV构建Pixel内核的教程。我对此有一些问题,但是最终(使用Linaro GCC 5.5.0,进行了一些配置更改,并且没有CONFIG_DEBUG_INFO
),我可以将其构建和引导。很好,可以作为概念证明,但不是我需要的,因为我不得不跳过一些必需的功能。
我几乎陷入困境,已经花了几个星期解决这个问题。还有其他选择吗?我很乐意以任何方式启动它。我会很乐意提供任何详细信息和日志,但感觉已经是很长的帖子了。预先非常感谢!
我找到了对我有用的解决方案。不过,这是一个近距离的通话,可能不足以适应不同情况。无论如何,它可能会帮助其他人。我基本上使用的是pigz而不是默认的gzip
工具,该工具通过-11
开关提供了更高的压缩级别。这挤出了我需要的最后一点:结果Image.gz-dtb
比以前小了约2.5%。
这些是我对内核构建系统所做的更改(假设pigz
在构建时位于您的PATH
中:]
diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile
index b7cf2a498c19..7dfd438e997b 100644
--- a/arch/arm64/boot/Makefile
+++ b/arch/arm64/boot/Makefile
@@ -30,7 +30,8 @@ $(obj)/Image: vmlinux FORCE
$(call if_changed,objcopy)
$(obj)/Image.gz: $(obj)/Image FORCE
- $(call if_changed,gzip)
+# $(call if_changed,gzip)
+ $(call if_changed,pigz)
$(obj)/Image.lz4: $(obj)/Image FORCE
$(call if_changed,lz4)
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index c2b437eb23d5..73d4581f7531 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -272,6 +272,11 @@ quiet_cmd_gzip = GZIP $@
cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -n -f -9 > $@) || \
(rm -f $@ ; false)
+
+quiet_cmd_pigz = PIGZ $@
+cmd_pigz = (cat $(filter-out FORCE,$^) | pigz -n -f -11 > $@) || \
+ (rm -f $@ ; false)
+
# DTC
# ---------------------------------------------------------------------------