用 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)添加到CFLAGSLDFLAGS 的信息。我这样做了(为此我必须将其硬编码为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 内核的主要内容,如果未能解决你的问题,请参考以下文章

Android 内核编译记录

Android 内核编译过程记录

鸿蒙系统研究之五:替换 AOSP 预编译库,关闭 SELinux

鸿蒙系统研究之五:替换 AOSP 预编译库,关闭 SELinux

鸿蒙系统研究之五:替换 AOSP 预编译库,关闭 SELinux

AOSP 8.1.0 编译一些心得