面对直接intercept-build make hello带来的错误,修改Makefile 解决fatal error: linux/init.h:
面对直接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,所以这应该是你所需要的。