我有一台Linux机器,它的内核是A版本,并且有相应的头文件。
我想使用GCC编译一个C程序,该程序需要在内核A下运行,但是当前正在运行的是内核B。
我该如何做?如何检查它是否有效?
我有一台Linux机器,它的内核是A版本,并且有相应的头文件。
我想使用GCC编译一个C程序,该程序需要在内核A下运行,但是当前正在运行的是内核B。
我该如何做?如何检查它是否有效?
这是进一步了解的补充信息。在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
linkage.h:8:10: 致命错误: asm/linkage.h: 没有那个文件或目录
的问题。 - TigerTV.rumake -C $(KERNEL_SOURCE_DIR) M=`pwd` modules
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
/lib/modules/$(shell uname -r)/build
作为KERNEL_DIR,它使用当前正在运行的内核的内核头文件。但是,您可以使用要编译模块的内核源目录的路径。
这个链接展示了如何使用gcc
来完成此操作。
gcc
的-I
选项。 - iqstaticgcc
?发布你正在使用的构建内核模块的Makefile。 - iqstatic