关于手动编译KernelSU内核-技术分享论坛-技术与攻略分享-U社区

关于手动编译KernelSU内核

大部分安卓内核并不难,基本上没有多少个博客说清楚参数怎么填

大部分内核参照build.config.aarch64,build.config.common里面的参数基本上可以编译成功

对于非gki内核

以联想l79031的源码举例:

aarch64-linux-gnu本机自带

aarch64-linux-android地址:https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9

arm-linux-android地址:https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9

llvm地址:https://github.com/llvm/llvm-project

build.config.aarch64文件内容

ARCH=arm64

CLANG_TRIPLE=aarch64-linux-gnu-
CROSS_COMPILE=aarch64-linux-androidkernel-
LINUX_GCC_CROSS_COMPILE_PREBUILTS_BIN=prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin

FILES="
arch/arm64/boot/Image.gz
vmlinux
System.map

build.config.common文件内容

BRANCH=android-4.19-q
KERNEL_DIR=common

CC=clang
CLANG_PREBUILT_BIN=prebuilts-master/clang/host/linux-x86/clang-r365631c/bin

EXTRA_CMDS=''
STOP_SHIP_TRACEPRINTK=1
LD=ld.lld

我们需要的脚本大概是这样的

#!/bin/bash

#环境变量
source $PWD/../envpath/envset.sh

#LLVM环境变量
export PATH=$PWD/../envpath/llvm10/bin:$PATH

#编译参数
args=(-j$(nproc --all) 
	O=out
	ARCH=arm64
	CLANG_TRIPLE=aarch64-linux-gnu-
	CROSS_COMPILE=aarch64-linux-android-
	CROSS_COMPILE_ARM32=arm-linux-androideabi-
	CC=clang
	AR=llvm-ar
	NM=llvm-nm
	OBJCOPY=llvm-objcopy
	OBJDUMP=llvm-objdump
	STRIP=llvm-strip
	DEPMOD=$PWD/../envpath/build/build-tools/path/linux-x86/depmod
	DTC_OVERLAY_TEST_EXT=ufdt_apply_overlay
	CONFIG_BUILD_ARM64_DT_OVERLAY=y
)

#清理旧的构建
make ${args[@]} mrproper

#定义默认配置
make ${args[@]} moba_defconfig

#开始编译
make ${args[@]} Image.gz-dtb modules

#生成modules_install
make ${args[@]} INSTALL_MOD_PATH=modules modules_install

为什么内核文件配置显示的是CROSS_COMPILE=aarch64-linux-androidkernel-,而我的配置却是CROSS_COMPILE=aarch64-linux-android-,因为他们两个是同一个工具链

236208ec9b20250624182422

source $PWD/../envpath/envset.sh Fedora不支持proton-clang所以默认使用谷歌的编译环境

CC=clang 使用clang作为编译器

下面的是使用llvm的工具链接而不是系统的,防止打包内核的时候链接错误而导致不能生成内核

O=out将编译内容输出到out目录

AR=llvm-ar 
NM=llvm-nm
OBJCOPY=llvm-objcopy
OBJDUMP=llvm-objdump
STRIP=llvm-strip

DEPMOD=$PWD/../envpath/build/build-tools/path/linux-x86/depmod 我的本机的depmod生成6.0以下内核的modeles.dep文件

make ${args[@]} moba_defconfig生成默认配置配置,配置文件在arch/arm64/configs里面不知道的话可以到里面去看。

make ${args[@]}展开来是这样的

make -j$(nproc --all) O=out ARCH=arm64 CLANG_TRIPLE=aarch64-linux-gnu- CROSS_COMPILE=aarch64-linux-android- CROSS_COMPILE_ARM32=arm-linux-androideabi- CC=clang AR=llvm-ar NM=llvm-nm OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump STRIP=llvm-strip DEPMOD=$PWD/../envpath/build/build-tools/path/linux-x86/depmod DTC_OVERLAY_TEST_EXT=ufdt_apply_overlay CONFIG_BUILD_ARM64_DT_OVERLAY=y

写成数组的方式比较好阅读,也比较美观。

关于为什么按照官方的方法编译KernelSU,为什么会出现各种各样的问题,对于gki内核推推荐用官方的方法,而非gki内核不推荐用KPROBES,推荐手动修补源码虽然麻烦,但是出现问题也比较少。可以参考官方的修补教程。

7e84c56c5620250624184549

我的github有内核可以参考一下对应的文件,https://github.com/xiaoxian8/kernel_xiaomi_gauguin

按照官方的教程修补完成以后基本上可以bash build.sh构建内核了。

curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s v0.9.5
bash build.sh

 

以下是按照修补KernelSU示例

static int __do_execve_file(int fd, struct filename *filename,
...
...
...
...
out_files:
	if (displaced)
		reset_files_struct(displaced);
out_ret:
	if (filename)
		putname(filename);
	return retval;
}

extern bool ksu_execveat_hook __read_mostly;  //修补KernelUu内容
extern int ksu_handle_execveat(int *fd, struct filename **filename_ptr, void *argv, 
			void *envp, int *flags);
extern int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr,//修补kernelSU内容

static int do_execveat_common(int fd, struct filename *filename,
			      struct user_arg_ptr argv,
			      struct user_arg_ptr envp,
			      int flags)
...
...

以下是编译完成大概的样子

750e9372d620250624195545

内核在out/arch/arm64/boot,

接下来用Anykernel3打包就可以了

对于gki内核

以android14-6.1为例

build.config.aarch64内容

ARCH=arm64
MAKE_GOALS="
Image
modules
"

FILES="
arch/arm64/boot/Image
vmlinux
System.map
vmlinux.symvers
modules.builtin
modules.builtin.modinfo
"

NDK_TRIPLE=${AARCH64_NDK_TRIPLE}

build.config.common内容

. ${ROOT_DIR}/${KERNEL_DIR}/build.config.constants

KMI_GENERATION=11

LLVM=1
DEPMOD=depmod
CLANG_PREBUILT_BIN=prebuilts/clang/host/linux-x86/clang-${CLANG_VERSION}/bin
BUILDTOOLS_PREBUILT_BIN=build/kernel/build-tools/path/linux-x86
DTC=${ROOT_DIR}/${BUILDTOOLS_PREBUILT_BIN}/dtc

KCFLAGS="${KCFLAGS} -D__ANDROID_COMMON_KERNEL__"
EXTRA_CMDS=''
STOP_SHIP_TRACEPRINTK=1
IN_KERNEL_MODULES=1
DO_NOT_STRIP_MODULES=1

HERMETIC_TOOLCHAIN=${HERMETIC_TOOLCHAIN:-1}

build.config.constants内容

BRANCH=android14-6.1
CLANG_VERSION=r487747c
AARCH64_NDK_TRIPLE=aarch64-linux-android31
X86_64_NDK_TRIPLE=x86_64-linux-android31
ARM_NDK_TRIPLE=arm-linux-androideabi31

编译脚本build.sh内容

#!/bin/bash

#LLVM环境变量
export PATH=$PWD/../envpath/llvm20/bin:$PATH

#构建参数
args=(-j$(nproc --all)
	O=out
	ARCH=arm64
	NDK_TRIPLE=aarch64-linux-android31
	LLVM=1
	DEPMOD=depmod
	DTC=/usr/bin/dtc)

#清理旧的构建
make ${args[@]} mrproper

#定义默认配置
make ${args[@]} gki_defconfig

#开始编译
make ${args[@]} Image.lz4 modules

#生成modules_install
make ${args[@]} INSTALL_MOD_PATH=modules modules_install

gki内核不需要修补内核,直接编译即可

curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -
bash build.sh

编译成功大概是这样的

c6e44c1b7020250624203042

谢谢您的阅读,有其他看法欢迎在评论区留言。

本文为原创文章,作者:[唐小贤],首发于U社区。

 

版权声明:

转载请注明以下信息:

  • 作者:糖小贤
  • 原文链接:https://haouou.cn/forum-post/348.html
  • 联系方式:an7788yy@163.com

说明:未经授权禁止转载,尊重原创内容是对作者最大的支持

评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

夸夸
夸夸
还有吗!没看够!
随机 取消
昵称表情代码图片

    暂无评论内容

© 版权声明
欢迎访问本站
您的访问时本站的荣幸
希望您能在本站
找到您想要的资源