AOSP13的内核使用的编译器为Clang,因此搭建AOSP13的ko编译环境,也需要使用Clang。搭建过程记录如下:
1、创建工程目录
drwxr-xr-x 2 root root 4096 Nov 30 16:58 clang
drwxr-xr-x 2 root root 4096 Nov 30 16:59 kernel_out
drwxr-xr-x 2 root root 4096 Nov 30 16:57 ko-codes
clang:为编译器所在目录,可以将AOSP13自带的Clang(目录为prebuilts/clang)拷贝进去。
kernel_out:为kernel编译产物的目录,将 out/android13-gs-pixel-5.10/private/gs-google 拷贝进去即可。
ko-codes为ko的代码目录,包含源码 hello.c 及 Makefile 。
2、ko源码及Makefile
hello.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/kmod.h>
static int __init hello_init(void)
{
printk("hello world!\n");
return 0;
}
static void __exit hello_exit(void)
{
return;
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
Makefile
PWD := $(shell pwd)
WORK_DIR=$(PWD)/..
ARCH=arm64
CLANG_TRIPLE=aarch64-linux-gnu-
CC=$(WORK_DIR)/clang/host/linux-x86/clang-r450784e/bin/clang
AR=$(WORK_DIR)/clang/host/linux-x86/clang-r450784e/bin/llvm-ar
NM=$(WORK_DIR)/clang/host/linux-x86/clang-r450784e/bin/llvm-nm
LD=$(WORK_DIR)/clang/host/linux-x86/clang-r450784e/bin/ld.lld
obj-m := hello.o
KERNELDIR := $(WORK_DIR)/kernel_out
all:
make -j8 CC=$(CC) AR=$(AR) NM=$(LLVM_NM) LD=$(LD) ARCH=$(ARCH) CLANG_TRIPLE=$(CLANG_TRIPLE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *~ *.ko *.o *.mod.c *.order .*.cmd .tmp_versions Module.symvers *.unsigned *.mod *.symversions .*.d
3、编译和加载
进入ko-codes目录,然后执行 make,会生成 hello.ko
将hello.ko拷贝到手机/data/local目录下,执行 insmod /data/local/hello.ko。
如果要确认是否加载成功,可以执行 lsmod | grep hello,如果打印出来说明加载成功。
如果要卸载ko,执行 rmmod hello 即可。
4、说明
1)如何确定AOSP使用的clang版本
从 out/android13-gs-pixel-5.10/private/gs-google/include/generated/compile.h 查看LINUX_COMPILER 或者 查看prebuilts/clang/host/linux-x86/README.md
2)对于AOSP的clang版本,需要指定 CLANG_TRIPLE,
而 CROSS_COMPILE
不需要指定。