linux编译单独一个模块makefile写法(转)

单个文件编译一个模块:

[html] view plain copy
  1. ifneq ($(KERNELRELEASE),)  
  2.   
  3. obj-m :mini2440_leds.o  
  4.   
  5. else  
  6. KDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2/  
  7.   
  8. all:  
  9.     make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-  
  10. clean:  
  11.     rm -f *.ko *.o *.mod.o *.mod.c *.symvers  
  12.   
  13. 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 可以用如下办法写:

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


KDIR 也可以写成如下形式:

KVERS=$(shell uname -r)

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

猜你喜欢

转载自blog.csdn.net/oushaojun2/article/details/80034985
今日推荐