学习内核,避免不了要和模块打交道,而模块的编译一直都是用以前写好的makefile文件,没有研究过模块是如何编译的,后来在内核
里面找到了一份文档,才发现模块的编译的方式很“丰富”linux/Document/kbuild/module.txt文件中有详细的讲解。
---------------------------------------------------------------------------------------
一,一般的模块的编译。
我喜欢用的一种格式如下:- obj-m := find_mod.o
- kernel_path=/home/linux/kernel/linux-3.5
- all:
- make -C $(kernel_path) M=$(PWD) modules
- clean:
- make -C $(kernel_path) M=$(PWD) clean
只需要指定好三个参数:
1,内核源代码的绝对路径,kernel_path。
2,模块所在的位置,一般都是当前目录,PWD变量指定。
3,产生的模块的目标文件。这文件名要和模块.c文件名一致。------------------------------------------------------------------------------------------
二,多个C文件的模块编译。
在用户态编程时,很多时候都是多个文件编译,这么多文件组成一个项目。
这么多文件可以由makefile组织到一起,同样模块中也可以编译多个文件。
而且实现起来也特别简单。
- obj-m := hello.o
- hello-y := hello1.o hello2.o
- kernel_path=/home/linux/kernel/linux-3.5
- all:
- make -C $(kernel_path) M=$(PWD) modules
- clean:
- make -C $(kernel_path) M=$(PWD) clean
假如有两个C文件,hello1.c hello2.c将这两个文件编译的方式见上面的Makefile文件。-----------------------------------------------------------------------------------------
三,多个模块同时编译。
C文件:hello.c find_mod.c
目标模块:hello.ko find_mod.ko
- obj-m := find_mod.o
- obj-m += hello.o
- kernel_path = /home/linux/kernel/linux-3.5
- all:
- make -C $(kernel_path) M=$(PWD) modules
- clean:
- make -C $(kernel_path) M=$(PWD) clean
----------------------------------------------------------------------------------------
四,其他。
还有很多其他的编译方式,比如说要在包含指定目录的.h文件,该如何
包含,加入这个模块中有多个目录,又该怎么编写Makefile,等等,这
些在module.txt中就有介绍。
---------------------------------------------------------------------------------------
阅读(6102) | 评论(0) | 转发(2) |