複数のCファイルを使用してLinuxカーネルモジュールを構築するには?

複数のCファイルを使用してLinuxカーネルモジュールを構築するには?

カーネルプログラミングを練習するために、単純なファイアウォールに似たカーネルモジュールを構築しようとしています。モジュールを複数の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'

これがあなたに役立つことを願っています。

関連情報