Compiling Modules
先日パクッて作った Makefile が以下
obj-m := hello.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
これは kernel source tree の中に作ってないので余計な記述 (下 3 行) が必要になるのだろうな、と。でも、カーネル自分で作った実績があれば基本上記な Makefile で試験できるモジュールが作れる、というのは凄い。
もう少し補足というか確認してみるに、-C オプションは make なプロセスのカレントディレクトリを変える、という意味で良いのかな??
てーコトは大元の Makefile で make が走るのか。見てみると以下の記述に hit
# Use make M=dir to specify directory of external module to build # Old syntax make ... SUBDIRS=$PWD is still supported # Setting the environment variable KBUILD_EXTMOD take precedence ifdef SUBDIRS KBUILD_EXTMOD ?= $(SUBDIRS) endif ifdef M ifeq ("$(origin M)", "command line") KBUILD_EXTMOD := $(M) endif endif
む。上記の SUBDIRS 云々はダウト、というか古い (Old syntax) らしい。試してみました。ってか、ifeq のソレは何か?
$ ls Makefile Makefile~ Module.symvers hello.c hello.ko hello.mod.c hello.mod.o hello.o $ LANG=C make clean make: *** No rule to make target `clean'. Stop. $ LANG=C rm Module.symvers *.ko *.o *~ *.mod.c rm: cannot remove `*~': No such file or directory $ LANG=C ls Makefile hello.c $ LANG=C make make -C /lib/modules/2.6.20/build M=/home/rms/kernel/kernel_exercise/1.kernel_module modules make[1]: Entering directory `/home/rms/kernel/linux-2.6.20' CC [M] /home/rms/kernel/kernel_exercise/1.kernel_module/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/rms/kernel/kernel_exercise/1.kernel_module/hello.mod.o LD [M] /home/rms/kernel/kernel_exercise/1.kernel_module/hello.ko make[1]: Leaving directory `/home/rms/kernel/linux-2.6.20' $
で、この M あるいは SUBDIRS は KBUILD_EXTMOD に代入される模様。しかし大元の Makefile 大変ッス。
明日は
職場にLinux カーネル解析入門を持っていく予定。しかし持ってって何すんだ、とゆー話があるな (わら