linux編譯單獨一個模組makefile寫法(轉)
阿新 • • 發佈:2019-01-31
單個檔案編譯一個模組:
- ifneq ($(KERNELRELEASE),)
- obj-m := mini2440_leds.o
- else
- KDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2/
- all:
- make -C $(KDIR) M=$(PWD) modules ARCH=armCROSS_COMPILE=arm-linux-
- clean:
- rm -f *.ko *.o *.mod.o *.mod.c *.symvers
- endif
多個檔案編譯成為一個模組:
我們對多個 *.c 檔案情況做一個說明:我們希望建立一個模組的名字叫做hello,我們有三個*.c檔案,分別為hello.c, file1.c和file2.c。這樣是有問題的,
因為在Makefile中 obj-m := hello.o,這是指定模組的名稱,
hello-objs := file1.o file2.o hello.o,這裡是說hello模組包括的的obj檔案,
如果我們在裡面不填寫hello.o,那麼實際並沒有編譯hello.c,而是在CC[M] file1.o和file2.o,通過LD[M]得到模組hello.o,
如果我們在這裡填寫了hello.o,那麼在obj-m和hello-objs中都含有hello.o,對make來講會產生迴圈和混淆,因此也不能這樣書寫。
如果我們由多個C檔案來構造一個模組,那麼C檔案的名字不能和模組名字一樣, 在這個例子中我們可以將hello.c改名為hello_main.c,在Makefile中obj-m := hello.o,hello-objs = file1.o file2.o hello_main.o。
比如,當前目錄下有如系檔案:
hide_file.c hook.c k_file.c config.h hook.h k_file.h
想編譯為模組 root.ko 其中hook.c 為主檔案,Makefile 可以用如下辦法寫:
- EXTRA_CFLAGS := -g -O2
- ifneq ($(KERNELRELEASE),)
- obj-m = root.o
- root-objs := hide_file.o hook.o k_file.o
- else
- KDIR := /home/sina/work/rootkit/linux-3.0.1
- all:
- make -C $(KDIR) M=$(PWD) KBUILD_EXTRA_SYMBOLS=./Module.symvers modules
- clean:
- rm -f *.ko *.o *.mod.o *.mod.c *.order *~ *.symvers
- endif
KDIR 也可以寫成如下形式:
KVERS=$(shell uname -r)
KDIR :=/lib/modules/$(KVERS)/build