这是深入研究的其他信息.Post 2.6版本,如其他回复中所述,Makefile负责大多数Linux内核模块编译步骤.但是,它的核心仍然是GCC,这就是它的作用:(你也可以在没有Makefile的情况下编译它)
以下GCC选项是必要的:
-isystem/lib/modules /`uname -r`/build/include:您必须使用正在编译的内核的内核头文件.使用默认的/ usr/include/linux将无法正常工作.
-D__KERNEL__:定义此符号告诉头文件代码将以内核模式运行,而不是作为用户进程运行.
-DMODULE:此符号告诉头文件为内核模块提供适当的定义.
gcc -DMODULE -D__KERNEL__ -isystem /lib/modules/$(uname -r)/build/include -c hello.c -o hello.ko
为了编译内核模块,最好使用驻留在内核源目录中的内核Makefile。您可以使用以下 make 命令:
make -C $(KERNEL_SOURCE_DIR) M=`pwd` modules
Run Code Online (Sandbox Code Playgroud)
否则,您可以选择编写自己的 Makefile,如下所示:
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
obj-m := test.o
driver:
make -C $(KERNEL_DIR) M=`pwd` modules
clean:
make -C $(KERNEL_DIR) M=`pwd` clean
Run Code Online (Sandbox Code Playgroud)
在此我使用了 KERNEL_DIR,因为/lib/modules/$(shell uname -r)/build
它使用当前正在运行的内核的内核头。但是,您可以使用要用来编译模块的内核源目录的路径。
这展示了如何使用 来做到这一点gcc
。