我有一个内核模块,我能够针对本机运行的内核头文件(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;
答案 0 :(得分:0)
好的,问题是我构建了我的内核,其中没有设置.config文件中的CONFIG_NETFILER标志,因此虽然存在netfilter.h,但内核没有NETFILTER支持。
我使用此标志集重建了内核,并能够编译netfilter模块。