未定义类型“struct nf_hook_ops”的无效使用 - 内核模块编译错误
invalid use of undefined type ‘struct nf_hook_ops’ - kernel module compilation error
我有一个内核模块,我可以针对本机 运行 内核 header (4.4.0-21-generic) 成功编译。
这是生成文件:
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 的 headers 并且编译终止。
这里是/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 文件中明确声明结构,那么错误就会消失。不知道这个 header 文件有什么问题。
#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;
好的,问题是我构建了我的内核,其中未设置 .config 文件中的 CONFIG_NETFILER 标志,因此内核没有 NETFILTER 支持,尽管 netfilter.h 存在。
我用这个标志设置重建了内核并且能够编译 netfilter 模块。
我有一个内核模块,我可以针对本机 运行 内核 header (4.4.0-21-generic) 成功编译。
这是生成文件:
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 的 headers 并且编译终止。
这里是/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 文件中明确声明结构,那么错误就会消失。不知道这个 header 文件有什么问题。
#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;
好的,问题是我构建了我的内核,其中未设置 .config 文件中的 CONFIG_NETFILER 标志,因此内核没有 NETFILTER 支持,尽管 netfilter.h 存在。
我用这个标志设置重建了内核并且能够编译 netfilter 模块。