1. 程式人生 > >linux編譯單獨一個模組makefile寫法(轉)

linux編譯單獨一個模組makefile寫法(轉)

單個檔案編譯一個模組:

  1. ifneq ($(KERNELRELEASE),)  
  2. obj-m :mini2440_leds.o  
  3. else  
  4. KDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2/  
  5. all:  
  6.     make -C $(KDIR) M=$(PWD) modules ARCH=armCROSS_COMPILE=arm-linux-  
  7. clean:  
  8.     rm -f *.ko *.o *.mod.o *.mod.c *.symvers  
  9. endif  
將mini2440_leds.c編譯為mini2440_leds.ko 檔案 ,KDIR為linux核心路徑。

多個檔案編譯成為一個模組:

        我們對多個 *.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 可以用如下辦法寫:

  1. EXTRA_CFLAGS    := -g -O2  
  2. ifneq ($(KERNELRELEASE),)  
  3. obj-m           = root.o  
  4. root-objs           :hide_file.o hook.o k_file.o   
  5. else  
  6. KDIR := /home/sina/work/rootkit/linux-3.0.1  
  7. all:  
  8.     make -C $(KDIR) M=$(PWD) KBUILD_EXTRA_SYMBOLS=./Module.symvers modules  
  9. clean:  
  10.     rm -f *.ko *.o *.mod.o *.mod.c *.order *~  *.symvers  
  11. endif  

KDIR 也可以寫成如下形式:

KVERS=$(shell uname -r)

KDIR :=/lib/modules/$(KVERS)/build