Tracepoint is a predefined hook point in the kernel, compared to Kprobe, it is more stable and has lower performance overhead, although compatibility is relatively poor, it is still worth trying By the way, we have also included the config definitions related to hook types in Kconfig, to enhance cleanliness These patches is based on https://github.com/backslashxx/KernelSU/issues/5 Co-authored-by: Cloud_Yun <1770669041@qq.com> Co-authored-by: Prslc <prslc113@gmail.com>
188 lines
7.1 KiB
Makefile
188 lines
7.1 KiB
Makefile
kernelsu-objs := ksu.o
|
|
kernelsu-objs += allowlist.o
|
|
kernelsu-objs += dynamic_sign.o
|
|
kernelsu-objs += apk_sign.o
|
|
kernelsu-objs += sucompat.o
|
|
kernelsu-objs += throne_tracker.o
|
|
kernelsu-objs += core_hook.o
|
|
kernelsu-objs += ksud.o
|
|
kernelsu-objs += embed_ksud.o
|
|
kernelsu-objs += kernel_compat.o
|
|
|
|
ifeq ($(strip $(CONFIG_KSU_TRACEPOINT_HOOK)),y)
|
|
kernelsu-objs += ksu_trace.o
|
|
endif
|
|
|
|
kernelsu-objs += selinux/selinux.o
|
|
kernelsu-objs += selinux/sepolicy.o
|
|
kernelsu-objs += selinux/rules.o
|
|
|
|
ccflags-y += -I$(srctree)/security/selinux -I$(srctree)/security/selinux/include
|
|
ccflags-y += -I$(objtree)/security/selinux -include $(srctree)/include/uapi/asm-generic/errno.h
|
|
|
|
obj-$(CONFIG_KSU) += kernelsu.o
|
|
obj-$(CONFIG_KSU_TRACEPOINT_HOOK) += ksu_trace_export.o
|
|
|
|
obj-$(CONFIG_KPM) += kpm/
|
|
|
|
REPO_OWNER := SukiSU-Ultra
|
|
REPO_NAME := SukiSU-Ultra
|
|
REPO_BRANCH := main
|
|
KSU_VERSION_API := 3.1.8
|
|
|
|
GIT_BIN := /usr/bin/env PATH="$$PATH":/usr/bin:/usr/local/bin git
|
|
CURL_BIN := /usr/bin/env PATH="$$PATH":/usr/bin:/usr/local/bin curl
|
|
|
|
KSU_GITHUB_VERSION := $(shell $(CURL_BIN) -s "https://api.github.com/repos/$(REPO_OWNER)/$(REPO_NAME)/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
|
|
KSU_GITHUB_VERSION_COMMIT := $(shell $(CURL_BIN) -sI "https://api.github.com/repos/$(REPO_OWNER)/$(REPO_NAME)/commits?sha=$(REPO_BRANCH)&per_page=1" | grep -i "link:" | sed -n 's/.*page=\([0-9]*\)>; rel="last".*/\1/p')
|
|
|
|
LOCAL_GIT_EXISTS := $(shell test -e $(srctree)/$(src)/../.git && echo 1 || echo 0)
|
|
|
|
define get_ksu_version_full
|
|
v$1-$(shell cd $(srctree)/$(src); $(GIT_BIN) rev-parse --short=8 HEAD)@$(shell cd $(srctree)/$(src); $(GIT_BIN) rev-parse --abbrev-ref HEAD)
|
|
endef
|
|
|
|
ifeq ($(KSU_GITHUB_VERSION_COMMIT),)
|
|
ifeq ($(LOCAL_GIT_EXISTS),1)
|
|
$(shell cd $(srctree)/$(src); [ -f ../.git/shallow ] && $(GIT_BIN) fetch --unshallow)
|
|
KSU_LOCAL_VERSION := $(shell cd $(srctree)/$(src); $(GIT_BIN) rev-list --count $(REPO_BRANCH))
|
|
KSU_VERSION := $(shell expr 10000 + $(KSU_LOCAL_VERSION) + 700)
|
|
$(info -- $(REPO_NAME) version (local .git): $(KSU_VERSION))
|
|
else
|
|
KSU_VERSION := 13000
|
|
$(warning -- Could not fetch version online or via local .git! Using fallback version: $(KSU_VERSION))
|
|
endif
|
|
else
|
|
KSU_VERSION := $(shell expr 10000 + $(KSU_GITHUB_VERSION_COMMIT) + 700)
|
|
$(info -- $(REPO_NAME) version (GitHub): $(KSU_VERSION))
|
|
endif
|
|
|
|
ifeq ($(KSU_GITHUB_VERSION),)
|
|
ifeq ($(LOCAL_GIT_EXISTS),1)
|
|
$(shell cd $(srctree)/$(src); [ -f ../.git/shallow ] && $(GIT_BIN) fetch --unshallow)
|
|
KSU_VERSION_FULL := $(call get_ksu_version_full,$(KSU_VERSION_API))
|
|
$(info -- $(REPO_NAME) version (local .git): $(KSU_VERSION_FULL))
|
|
$(info -- $(REPO_NAME) Formatted version (local .git): $(KSU_VERSION))
|
|
else
|
|
KSU_VERSION_FULL := v$(KSU_VERSION_API)-$(REPO_NAME)-unknown@unknown
|
|
$(warning -- $(REPO_NAME) version: $(KSU_VERSION_FULL))
|
|
endif
|
|
else
|
|
$(shell cd $(srctree)/$(src); [ -f ../.git/shallow ] && $(GIT_BIN) fetch --unshallow)
|
|
KSU_VERSION_FULL := $(call get_ksu_version_full,$(KSU_GITHUB_VERSION))
|
|
$(info -- $(REPO_NAME) version (Github): $(KSU_VERSION_FULL))
|
|
endif
|
|
|
|
ccflags-y += -DKSU_VERSION=$(KSU_VERSION)
|
|
ccflags-y += -DKSU_VERSION_FULL=\"$(KSU_VERSION_FULL)\"
|
|
|
|
ifeq ($(strip $(CONFIG_KSU_KPROBES_HOOK)),y)
|
|
$(info -- SukiSU: CONFIG_KSU_KPROBES_HOOK)
|
|
else ifeq ($(strip $(CONFIG_KSU_TRACEPOINT_HOOK)),y)
|
|
$(info -- SukiSU: CONFIG_KSU_TRACEPOINT_HOOK)
|
|
else ifeq ($(strip $(CONFIG_KSU_MANUAL_HOOK)),y)
|
|
$(info -- SukiSU: CONFIG_KSU_MANUAL_HOOK)
|
|
endif
|
|
|
|
KERNEL_VERSION := $(VERSION).$(PATCHLEVEL)
|
|
KERNEL_TYPE := Non-GKI
|
|
# Check for GKI 2.0 (5.10+ or 6.x+)
|
|
ifneq ($(shell test \( $(VERSION) -ge 5 -a $(PATCHLEVEL) -ge 10 \) -o $(VERSION) -ge 6; echo $$?),0)
|
|
# Check for GKI 1.0 (5.4)
|
|
ifeq ($(shell test $(VERSION)-$(PATCHLEVEL) = 5-4; echo $$?),0)
|
|
KERNEL_TYPE := GKI 1.0
|
|
endif
|
|
else
|
|
KERNEL_TYPE := GKI 2.0
|
|
endif
|
|
$(info -- KERNEL_VERSION: $(KERNEL_VERSION))
|
|
$(info -- KERNEL_TYPE: $(KERNEL_TYPE))
|
|
|
|
# Check if KPM is enabled
|
|
ifeq ($(CONFIG_KPM),y)
|
|
$(info -- KPM is enabled)
|
|
else
|
|
$(info -- KPM is disabled)
|
|
endif
|
|
|
|
# SELinux 驱动程序检查
|
|
ifeq ($(shell grep -q "current_sid(void)" $(srctree)/security/selinux/include/objsec.h; echo $$?),0)
|
|
ccflags-y += -DKSU_COMPAT_HAS_CURRENT_SID
|
|
endif
|
|
|
|
ifeq ($(shell grep -q "struct selinux_state " $(srctree)/security/selinux/include/security.h; echo $$?),0)
|
|
ccflags-y += -DKSU_COMPAT_HAS_SELINUX_STATE
|
|
endif
|
|
|
|
# 该功能在 linux 5.0-rc1 中引入
|
|
ifeq ($(shell grep -q "get_cred_rcu" $(srctree)/include/linux/cred.h; echo $$?),0)
|
|
ccflags-y += -DKSU_COMPAT_HAS_GET_CRED_RCU
|
|
else
|
|
ifeq ($(shell grep -q "atomic_long_t\s\+usage" $(srctree)/include/linux/cred.h; echo $$?),0)
|
|
ccflags-y += -DKSU_COMPAT_ATOMIC_LONG
|
|
endif
|
|
ifeq ($(shell grep -q "int\s\+non_rcu" $(srctree)/include/linux/cred.h; echo $$?),0)
|
|
ccflags-y += -DKSU_COMPAT_HAS_NONCONST_CRED
|
|
endif
|
|
endif
|
|
|
|
# Handle optional backports
|
|
ifeq ($(shell grep -q "strncpy_from_user_nofault" $(srctree)/include/linux/uaccess.h; echo $$?),0)
|
|
ccflags-y += -DKSU_OPTIONAL_STRNCPY
|
|
endif
|
|
ifeq ($(shell grep -q "ssize_t kernel_read" $(srctree)/fs/read_write.c; echo $$?),0)
|
|
ccflags-y += -DKSU_OPTIONAL_KERNEL_READ
|
|
endif
|
|
ifeq ($(shell grep "ssize_t kernel_write" $(srctree)/fs/read_write.c | grep -q "const void" ; echo $$?),0)
|
|
ccflags-y += -DKSU_OPTIONAL_KERNEL_WRITE
|
|
endif
|
|
ifeq ($(shell grep -q "int\s\+path_umount" $(srctree)/fs/namespace.c; echo $$?),0)
|
|
ccflags-y += -DKSU_HAS_PATH_UMOUNT
|
|
ifneq ($(shell grep -Eq "^int path_umount" $(srctree)/fs/internal.h; echo $$?),0)
|
|
$(shell sed -i '/^extern void __init mnt_init/a int path_umount(struct path *path, int flags);' $(srctree)/fs/internal.h;)
|
|
$(info -- KernelSU: SusFS: Adding 'int path_umount(struct path *path, int flags);' to $(srctree)/fs/internal.h)
|
|
endif
|
|
endif
|
|
|
|
# Checks Samsung UH drivers
|
|
ifeq ($(shell grep -q "CONFIG_KDP_CRED" $(srctree)/kernel/cred.c; echo $$?),0)
|
|
ccflags-y += -DSAMSUNG_UH_DRIVER_EXIST
|
|
endif
|
|
|
|
# Samsung SELinux Porting
|
|
ifeq ($(shell grep -q "SEC_SELINUX_PORTING_COMMON" $(srctree)/security/selinux/avc.c; echo $$?),0)
|
|
ccflags-y += -DSAMSUNG_SELINUX_PORTING
|
|
endif
|
|
|
|
# Custom Signs
|
|
ifdef KSU_EXPECTED_SIZE
|
|
ccflags-y += -DEXPECTED_SIZE=$(KSU_EXPECTED_SIZE)
|
|
$(info -- Custom KernelSU Manager signature size: $(KSU_EXPECTED_SIZE))
|
|
endif
|
|
|
|
ifdef KSU_EXPECTED_HASH
|
|
ccflags-y += -DEXPECTED_HASH=\"$(KSU_EXPECTED_HASH)\"
|
|
$(info -- Custom KernelSU Manager signature hash: $(KSU_EXPECTED_HASH))
|
|
endif
|
|
|
|
ifdef KSU_MANAGER_PACKAGE
|
|
ccflags-y += -DKSU_MANAGER_PACKAGE=\"$(KSU_MANAGER_PACKAGE)\"
|
|
$(info -- SukiSU Manager package name: $(KSU_MANAGER_PACKAGE))
|
|
endif
|
|
|
|
$(info -- Supported Unofficial Manager: 5ec1cff (GKI) rsuntk (Non-GKI) ShirkNeko udochina (GKI and non-GKI and KPM))
|
|
|
|
ccflags-y += -Wno-implicit-function-declaration -Wno-strict-prototypes -Wno-int-conversion -Wno-gcc-compat
|
|
ccflags-y += -Wno-declaration-after-statement -Wno-unused-function
|
|
|
|
## For susfs stuff ##
|
|
ifeq ($(shell test -e $(srctree)/fs/susfs.c; echo $$?),0)
|
|
$(eval SUSFS_VERSION=$(shell cat $(srctree)/include/linux/susfs.h | grep -E '^#define SUSFS_VERSION' | cut -d' ' -f3 | sed 's/"//g'))
|
|
$(info )
|
|
$(info -- SUSFS_VERSION: $(SUSFS_VERSION))
|
|
else
|
|
$(info -- You have not integrate susfs in your kernel.)
|
|
$(info -- Read: https://gitlab.com/simonpunk/susfs4ksu)
|
|
endif
|
|
# Keep a new line here!! Because someone may append config
|