Android - 较为轻松的单独编译安卓Linux内核模块

首先我们需要准备一个ndk,真的很奇怪那些人老是推荐去什么奇怪的地方去下载,那玩意要安Android Studio或者sdkmanager,我不想安装怎么办?去github下载就好了!点我直达!

首先我们得下载一个工具链(((

https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

这里演示的平台是Windows!(最好用Linux平台)如果你是Linux或者Termux什么的,可以换!打开之后我们找bare-metal ,别下错了哦,其实你下载x86的也一样(((

安装好以后打开路径应该是这个样子,我这里就安装在D:\Env\14.2rel1

我这里偷懒添加了一个环境变量其实都一样的,不加就指定一下绝对路径就好了!

PS: 我的ndk路径是D:\Env\android-ndk-r25c

然后我们手写一段Makefile测试测试

ifndef TARGET_COMPILE
    $(error TARGET_COMPILE not set)
endif

CC = $(TARGET_COMPILE)gcc
LD = $(TARGET_COMPILE)ld

# 可以继续加哦
INCLUDE_DIRS := . include 
INCLUDE_FLAGS := $(foreach dir,$(INCLUDE_DIRS),-I$(KP_DIR)$(dir))

objs := hello-ko.o

all: hello-ko.ko

hello-ko.ko: ${objs}
	${CC} -r -o $@ $^

%.o: %.c
	${CC} $(CFLAGS) $(INCLUDE_FLAGS) -c -O2 -o $@ $^

至于头文件从什么地方去找就看你们自己了哦!建议是直接下个内核源代码,把头文件导进去,其实在Windows挺麻烦的,因为,默认情况下Win是不会处理链接的!

Ollvm混淆

ifndef TARGET_COMPILE
 	export TARGET_COMPILE=D:\Env\android-ndk-r25c\toolchains\llvm\prebuilt\windows-x86_64\bin
endif

CC = $(TARGET_COMPILE)aarch64-linux-android23-clang
LD = $(TARGET_COMPILE)ld.lld.exe
STRIP := llvm-strip.exe

# 可以继续加哦
INCLUDE_DIRS := . include
INCLUDE_FLAGS := $(foreach dir,$(INCLUDE_DIRS),-I$(KP_DIR)$(dir))

CFLAGS = -I$(AP_INCLUDE_PATH) $(INCLUDE_FLAGS) -Wall -Ofast -fno-PIC -fno-asynchronous-unwind-tables -fno-stack-protector -fno-unwind-tables -fno-semantic-interposition -U_FORTIFY_SOURCE -fno-common -fvisibility=hidden -mllvm -irobf-indbr

LDFLAGS  += -s

objs := hello-ko.o

all: hello-ko.ko

hello-ko.ko: ${objs}
	${CC}  $(LDFLAGS)  -r -o $@ $^
	${STRIP} -g --strip-unneeded --strip-debug --remove-section=.comment --remove-section=.note.GNU-stack $@

%.o: %.c
	${CC} $(CFLAGS) $(INCLUDE_FLAGS) -c -O2 -o $@ $^