여러 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'

이것이 당신에게 도움이 되기를 바랍니다.

관련 정보