휴대용 Makefile을 작성해 보세요

휴대용 Makefile을 작성해 보세요

내 자신의 netfilter 모듈을 개발하는 것은 이번이 처음입니다. 인터넷 문서에 따르면 가장 간단한 모듈에는 다음 C 코드가 포함되어 있습니다.

//'Hello World' kernel module, logs call to init_module
// and cleanup_module to /var/log/messages

// In Ubuntu 8.04 we use make and appropriate Makefile to compile kernel module

#define __KERNEL__
#define MODULE

#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
 printk(KERN_INFO "init_module() called\n");
 return 0;
}

void cleanup_module(void)
{
 printk(KERN_INFO "cleanup_module() called\n");
}

같은 페이지에서는 makefile에 대해 다음을 제안합니다.

obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

명령줄에서 make를 실행하면 "No "default" target" 메시지가 나타납니다.

그러나 makefile을 다음과 같이 변경하면 :

obj-m := hello.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

여기에서 "make"만 실행하면 제대로 작동하고 C 컴파일러가 실제로 실행되며 모듈 삽입 및 제거가 예상대로 작동합니다.

궁금해. 제가 보여드린 마지막 makefile은 모든 UNIX 운영 체제(버전 2.24 이상)와 호환됩니까? 현재 저는 Slackware 12 32비트를 사용하고 있으며 CentOS 6 64비트에서도 코드를 테스트할 예정입니다. 생성할 수 있는 범용 makefile이 있다면 그렇게 한 다음 각 시스템에 대해 별도의 makefile을 생성하는 것이 좋습니다.

누구든지 나에게 조언을 해줄 수 있습니까?

답변1

AFAIK, 좋아 보이네요. 내가 사용하는 기본값은작은다른. 그것은에서 온다Linux 장치 드라이버 설명서

# To build modules outside of the kernel tree, we run "make"
# in the kernel source tree; the Makefile these then includes this
# Makefile once again.
# This conditional selects whether we are being included from the
# kernel Makefile or not.
ifeq ($(KERNELRELEASE),)

    # Assume the source tree is where the running kernel was built
    # You should set KERNELDIR in the environment if it's elsewhere
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    # The current directory is passed to sub-makes as argument
    PWD := $(shell pwd)

modules:
  $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
  $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
  rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers

.PHONY: modules modules_install clean

else
    # called from kernel build system: just declare what our modules are
    obj-m := hello.o
endif

관련 정보