无效使用未定义类型'struct nf_hook_ops' - 内核模块编译错误

时间:2016-06-26 13:51:08

标签: linux module compilation kernel

我有一个内核模块,我能够针对本机运行的内核头文件(4.4.0-21-generic)成功编译。

这是Makefile:

vm@vm:~/Documents/kernelDev/Netfilter/skbuff_analyser$ cat Makefile
obj-m += sk_buff.o
all:
        make -C /lib/modules/`uname -r`/build M=$(PWD) modules
clean:
        make -C /lib/modules/`uname -r`/build M=$(PWD) clean

现在,我想针对另一个内核版本4.5.3编译相同的内核模块。我按如下方式修改Makefile:

vm@vm:~/Documents/kernelDev/Netfilter/skbuff_analyser$ cat Makefile
obj-m += sk_buff.o
all:
        make -C /lib/modules/4.5.3/build M=$(PWD) modules
clean:
        make -C /lib/modules/4.5.3/build M=$(PWD) clean

但是,现在它没有拿起4.5.3的标题并且编译终止。

以下是/lib/modules

的内容
vm@vm:/lib/modules$ ls -l
total 16
drwxr-xr-x 6 root root 4096 May 10 17:59 4.4.0-21-generic
drwxr-xr-x 3 root root 4096 May 10 20:09 4.5.3

而且,

我检查/lib/modules/4.5.3/build的内容是否等同于/lib/modules/4.4.0-21-generic/build

的内容
vm@vm:/lib/modules/4.5.3/build$ pwd
/lib/modules/4.5.3/build
vm@vm:/lib/modules/4.5.3/build$ ls
arch     crypto                 firmware  Kbuild   MAINTAINERS          Module.symvers  scripts     usr
block    Documentation          fs        Kconfig  Makefile         net                 security    virt
certs    drivers                include   kernel   mm               README          sound       vmlinux
COPYING  Fedora21-x86-root_fs   init      lib      modules.builtin  REPORTING-BUGS  System.map  vmlinux.o
CREDITS  Fedora21-x86-root_fs2  ipc       linux    modules.order    samples         tools

update

我看到,在编译新内核版本时,只有linux/netfilter.h中定义的结构和数据类型没有被选中。如果我明确地在我的c文件中声明结构,那么错误就会消失。没有想法这个头文件的问题。

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/netfilter.h>
#include <uapi/linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/tcp.h>
#include <linux/if_ether.h> // for mac header
#include <linux/icmp.h>
#include <linux/netdevice.h>
#include <linux/inetdevice.h> //  for inet_select_addr()
#include <linux/if.h>

/home/vm/Documents/kernelDev/Netfilter/skbuff_analyser/sk_buff.c:514:2:     error: invalid use of undefined type ‘struct nf_hook_ops’
netfilter_ops_post_routing.priv    =  NULL;

1 个答案:

答案 0 :(得分:0)

好的,问题是我构建了我的内核,其中没有设置.config文件中的CONFIG_NETFILER标志,因此虽然存在netfilter.h,但内核没有NETFILTER支持。

我使用此标志集重建了内核,并能够编译netfilter模块。