![如何使用多个c文件构建linux内核模块?](https://linux22.com/image/158991/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%A4%9A%E4%B8%AAc%E6%96%87%E4%BB%B6%E6%9E%84%E5%BB%BAlinux%E5%86%85%E6%A0%B8%E6%A8%A1%E5%9D%97%EF%BC%9F.png)
我正在尝试构建一些类似于简单防火墙的内核模块来练习内核编程。我正在尝试将我的模块拆分为多个 c 和头文件,但它不会完成构建,并出现错误,即我没有定义许可证,即使我使用 MODULE_LICENSE("GPL"); 定义了许可证;我的制作文件是
obj-m += firewall.o
firewall-objs := fileio.o plstring.o rulemanager.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
有没有办法将内核模块拆分为多个文件?我尝试为每个 c 文件定义许可证,但它不起作用。
答案1
这里,你可以使用我的Makefile作为参考。
INSTALL_DIR=modules
ifneq (${KERNELRELEASE},)
obj-m :=cdd107.o
cdd107-objs := init.o clean.o opendev.o allocdev.o writedev.o readdev.o seekdev.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
@rm -rf ${INSTALL_DIR}
@mkdir ${INSTALL_DIR}
@mv -f *.o *.ko *.mod.c .*.cmd ${INSTALL_DIR}
clean:
rm -rf ${INSTALL_DIR}
endif
并构建完成,没有错误
参考日志:-
make -C /lib/modules/4.4.0-31-generic/build M=/home/vijay/Downloads/intro modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-31-generic'
CC [M] /home/vijay/Downloads/intro/init.o
CC [M] /home/vijay/Downloads/intro/clean.o
CC [M] /home/vijay/Downloads/intro/opendev.o
CC [M] /home/vijay/Downloads/intro/allocdev.o
CC [M] /home/vijay/Downloads/intro/writedev.o
CC [M] /home/vijay/Downloads/intro/readdev.o
CC [M] /home/vijay/Downloads/intro/seekdev.o
LD [M] /home/vijay/Downloads/intro/cdd107.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/vijay/Downloads/intro/cdd107.mod.o
LD [M] /home/vijay/Downloads/intro/cdd107.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-31-generic'
我希望这对你有帮助。