用 KASAN 编译 AOSP 内核
Posted
技术标签:
【中文标题】用 KASAN 编译 AOSP 内核【英文标题】:Compiling AOSP Kernel with KASAN 【发布时间】:2020-03-02 04:15:10 【问题描述】:我正在努力编译 Linux 内核,以便在启用 KASAN 和 KCOV 的 AOSP 中使用。然后我打算将其刷入 Pixel 2 XL (taimen) 并使用 Syzkaller 对其进行模糊测试。
这就是我所做的:
1.构建未修改的内核(工作)
我的参考:https://source.android.com/setup/build/building-kernels
确定分支...android-msm-wahoo-4.4-pie-qpr2
$ repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-wahoo-4.4-pie-qpr2
$ repo sync -j8 -c
$ build/build.sh -j8
通过 USB 连接手机
$ adb reboot bootloader
$ fastboot boot out/android-msm-wahoo-4.4/dist/Image.lz4-dtb
(工作正常)
2.使用 KASAN 和 KCOV 构建内核(失败)
要更改内核配置符号,请在 build/build.config 中编辑POST_DEFCONFIG_CMDS
从https://source.android.com/setup/build/building-kernels#customize-config复制
根据需要进行修改,使用 -d
禁用,-e
启用配置选项
结果:
POST_DEFCONFIG_CMDS="check_defconfig && update_debug_config"
function update_debug_config()
$KERNEL_DIR/scripts/config --file $OUT_DIR/.config \
-d CONFIG_KERNEL_LZ4 \
-e CONFIG_KASAN \
-e CONFIG_KASAN_INLINE \
-e CONFIG_KCOV \
-e CONFIG_SLUB \
-e CONFIG_SLUB_DEBUG \
--set-val FRAME_WARN 0
(cd $OUT_DIR && \
make O=$OUT_DIR $archsubarch CC=$CC CROSS_COMPILE=$CROSS_COMPILE olddefconfig)
$ build/build.sh -j8
但是之后
CHK include/generated/compile.h
我对各种 asan 符号有许多未定义的引用错误,例如
undefined reference to __asan_alloca_poison
.
我做了一些研究并阅读了有关将-fsantitize=address
和-shared-libasan
(或-shared-libsan
)添加到CFLAGS
和LDFLAGS
的信息。我这样做了(为此我必须将其硬编码为build/build.sh
,没有更方便的方法吗?),但无济于事:
我最终得到了
aarch64-linux-android-ld: -f may not be used without -shared
.
所以我尝试阅读 ld 的 -shared
标志并将其添加到 LDFLAGS
(更像是一个猜测)。导致
aarch64-linux-android-ld: -r and -shared may not be used together
.
真的不知道从这里去哪里以及一般出了什么问题?
非常感谢任何帮助!
更新:起初似乎使用gcc
而不是clang
似乎可以解决问题。手机启动正常,按钮工作,但触摸屏没有响应。我正在调查原因...
【问题讨论】:
【参考方案1】:关于触摸屏,您需要手动将所需的驱动程序复制到 AOSP 文件夹中。您可以从内核源代码中获取新的驱动程序。
cd $CONTAINER_GIT_REPO && \
cp arch/arm64/boot/Image.lz4-dtb \$AOSP/device/google/wahoo-kernel/Image.lz4-dtb && \
cp arch/arm64/boot/dtbo.img $AOSP/device/google/wahoo-kernel/dtbo.img && \
cp drivers/input/touchscreen/stm/*.ko $AOSP/device/google/wahoo-kernel && \
cp drivers/power/*.ko $AOSP/device/google/wahoo-kernel && \
cp drivers/input/touchscreen/synaptics_dsx_htc/*.ko $AOSP/device/google/wahoo-kernel && \
cp drivers/input/touchscreen/lge/*.ko $AOSP/device/google/wahoo-kernel && \
cp drivers/input/touchscreen/lge/lgsic/*.ko $AOSP/device/google/wahoo-kernel && \
# Building final image for Pixel 2
cd \$AOSP && . build/envsetup.sh && lunch aosp_walleye-userdebug && make bootimage -j4
&& mkdir -p $CONTAINER_GIT_REPO/builded_images && \
cp out/target/product/walleye/*.img $CONTAINER_GIT_REPO/builded_images"
获取内核源代码:
git clone -b android-msm-wahoo-4.4-oreo-m2 --single-branch https://android.googlesource.com/kernel/msm
我只有 Pixel 2 需要检查,但这应该适用于他们两个。
更新:您可以查看此回购以获取更多详细信息https://gitlab.com/textor/build-pixel-2-in-docker
【讨论】:
【参考方案2】:也许您可以尝试使用配置文件:./private/msm-google/build.config.kasan 我曾经使用过这个配置文件并成功了。
但是触摸屏也不起作用。
【讨论】:
以上是关于用 KASAN 编译 AOSP 内核的主要内容,如果未能解决你的问题,请参考以下文章
鸿蒙系统研究之五:替换 AOSP 预编译库,关闭 SELinux
鸿蒙系统研究之五:替换 AOSP 预编译库,关闭 SELinux