GCC内核模块编译错误

时间:2018-02-15 16:33:40

标签: c linux-kernel network-programming netfilter

我正在使用netfilter并在虚拟机上进行编译。

matt@ubuntu:~$ make
gcc -c -O2 -W -isystem /lib/modules/4.4.0-87-generic/build/include -D__KERNEL__ -DMODULE test10.c -I. 
In file included from /usr/src/linux-headers-4.4.0-87/include/linux/kernel.h:6:0,
                 from structs1.h:2,
                 from test10.c:1:
/usr/src/linux-headers-4.4.0-87/include/linux/linkage.h:7:25: fatal error: asm/linkage.h: No such file or directory
compilation terminated.
makefile:2: recipe for target 'test' failed
make: *** [test] Error 1

上面是我的GCC命令,用于尝试构建我的内核模块及其引发的后续错误。

在研究这个问题时,我发现了一个可能的解决方案,涉及指定内核版本:

KERNEL_VER=/usr/src/linux-headers-4.4.0-87/arch/x86/

但有两个问题:

  1. 我不确定如何在我的make文件中实际使用它,这可以在下面看到,除了做一个符号链接,

  2. 我查看了这个文件夹(/usr/src/linux-headers-4.4.0-87/arch/x86/)和子文件夹,它没有任何相同的kernel.h文件 - 这就是我需要的。

    < / LI>

    生成文件:

    test:
            gcc -c -O2 -W -isystem /lib/modules/4.4.0-87-generic/build/include -D__KERNEL__ -DMODULE test10.c -I.
    

    对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

用于构建可加载内核模块的标准Makefile如下所示。

obj-m += test10.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

有关详细信息,请参阅Compiling a loadable kernel module