我有一台带有内核A头文件的Linux机器。 我想使用内核A的GCC编译一个C程序,而内核B当前正在运行。
我该怎么做?我该如何检查它是否有效?
答案 0 :(得分:6)
这是深入研究的其他信息。 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
答案 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
完成此操作。