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

时间:2014-09-30 06:14:26

标签: gcc linux-kernel

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

我该怎么做?我该如何检查它是否有效?

2 个答案:

答案 0 :(得分:6)

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

以下GCC选项是必要的:

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

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

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

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

答案 1 :(得分:3)

为了编译内核模块,最好使用驻留在内核源目录中的内核Makefile。您可以使用以下make命令:

make -C $(KERNEL_SOURCE_DIR) M=`pwd` modules

否则,您可以选择编写自己的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

在这里我使用了KERNEL_DIR作为/lib/modules/$(shell uname -r)/build,它使用当前运行的内核的内核头文件。但是,您可以使用要编译模块的内核源目录的路径。

This显示了如何使用gcc完成此操作。