Aliens

编译单个内核模块

March 2, 2022

环境: Ubuntu 16.04 + Android P源码

源码路径: /home/michael/android_code

需要编译的模块路径: 比如 /home/michael/test_module/, 内核模块文件名为test_module.c 那么只需要在/home/michael/test_module/中建立一个Makefile文件就可以编译这个模块了. Makefile的模板如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
obj-m += test_module.o

# Android 源码路径
SOURCE_PATH := /home/michael/android_src

# kernel 的输出目录, <product-name> 因产品而异,下文同
KDIR := $(SOURCE_PATH)/out/target/product/<product-name>/obj/KERNEL_OBJ
PWD :=$(shell pwd)

KERNEL_CFLAGS := KCFLAGS=-mno-android
CROSS := $(SOURCE_PATH)/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin

all:
	$(MAKE) -C $(FLAGS) $(KDIR) ARCH=arm64 CROSS_COMPILE=$(CROSS)/aarch64-linux-android- M=$(PWD) $(FLAGS) $(KERNEL_CFLAGS) modules

clean:
	rm -f *.mod.c *.ko *.o .*.cmd *.symvers *.order
	rm -rf .tmp_versions

更简单的版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
ifneq ($(KERNELRELEASE),)
	obj-m := debugfs-test.o
# Otherwise we were called directly from the command line; invoke the kernel build system.
else
	KERNELDIR ?= /lib/modules/$(shell uname -r)/build
	PWD := $(shell pwd)
all:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif