使用gcc和内核头文件编译Linux内核模块

kob*_*obi 7 gcc linux-kernel

我有一台带有内核A头文件的Linux机器.我想使用内核A的GCC编译一个C程序,而内核B当前正在运行.

我怎样才能做到这一点?我该如何检查它是否有效?

use*_*986 7

这是深入研究的其他信息.Post 2.6版本,如其他回复中所述,Makefile负责大多数Linux内核模块编译步骤.但是,它的核心仍然是GCC,这就是它的作用:(你也可以在没有Makefile的情况下编译它)

以下GCC选项是必要的:

  1. -isystem/lib/modules /`uname -r`/build/include:您必须使用正在编译的内核的内核头文件.使用默认的/ usr/include/linux将无法正常工作.

  2. -D__KERNEL__:定义此符号告诉头文件代码将以内核模式运行,而不是作为用户进程运行.

  3. -DMODULE:此符号告诉头文件为内核模块提供适当的定义.

gcc -DMODULE -D__KERNEL__ -isystem /lib/modules/$(uname -r)/build/include -c hello.c -o hello.ko


iqs*_*tic 5

为了编译内核模块,最好使用驻留在内核源目录中的内核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