面对直接intercept-build make hello带来的错误,修改Makefile 解决fatal error: linux/init.h:

·

1 min read

面对直接intercept-build make hello带来的错误

└─$ intercept-build make hello               
gcc -c hello.c -I/usr/src/linux-headers-6.1.0-kali7-amd64/include -I/usr/src/linux-headers-6.1.0-kali7-amd64/arch/x86/include -I/usr/src/linux-headers-6.1.0-kali7-amd64/include/uapi
hello.c:1:10: fatal error: linux/init.h: No such file or directory
    1 | #include <linux/init.h>
      |          ^~~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:15: hello] Error 1

在Linux中,内核头文件的具体位置可能会因版本和发行版而异。为了找到正确的头文件,我们需要改变策略。

在编译Linux内核模块时,通常需要使用内核构建系统,并且头文件路径是自动处理的。我们尝试在普通的C编译命令中包含这些头文件路径,但这可能会导致路径问题。

我建议你直接在内核构建系统中生成编译命令数据库。你可以通过将KBUILD_VERBOSE=1环境变量设置为1,来让内核构建系统输出编译命令。然后,你可以使用intercept-build捕获这些命令。以下是修改后的Makefile

KERNEL_DIR = /lib/modules/$(shell uname -r)/build

obj-m += hello.o

all:
    KBUILD_VERBOSE=1 intercept-build make -C $(KERNEL_DIR) M=$(PWD) modules

clean:
    make -C $(KERNEL_DIR) M=$(PWD) clean

然后,你可以直接运行make命令,intercept-build应该会捕获到内核构建系统的编译命令,并生成compile_commands.json文件。

注意,这种方法只会捕获到编译内核模块的命令,而不会捕获到普通的C编译命令。但是,由于你的目标是将内核模块转换为Rust,所以这应该是你所需要的。