Chinaunix首页 | 论坛 | 博客
  • 博客访问: 913420
  • 博文数量: 119
  • 博客积分: 2493
  • 博客等级: 大尉
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-03 14:00
文章分类

全部博文(119)

文章存档

2013年(19)

2012年(100)

分类: LINUX

2012-08-15 09:39:04

        学习内核,避免不了要和模块打交道,而模块的编译一直都是用
以前写好的makefile文件,没有研究过模块是如何编译的,后来在内核
里面找到了一份文档,才发现模块的编译的方式很“丰富”
linux/Document/kbuild/module.txt文件中有详细的讲解。
---------------------------------------------------------------------------------------
一,一般的模块的编译。
我喜欢用的一种格式如下:


  1. obj-m := find_mod.o
  2. kernel_path=/home/linux/kernel/linux-3.5

  3. all:
  4.      make -C $(kernel_path) M=$(PWD) modules
  5. clean:
  6.      make -C $(kernel_path) M=$(PWD) clean
只需要指定好三个参数:
1,内核源代码的绝对路径,kernel_path。
2,模块所在的位置,一般都是当前目录,PWD变量指定。
3,产生的模块的目标文件。这文件名要和模块.c文件名一致。

------------------------------------------------------------------------------------------
二,多个C文件的模块编译。
在用户态编程时,很多时候都是多个文件编译,这么多文件组成一个项目。
这么多文件可以由makefile组织到一起,同样模块中也可以编译多个文件。
而且实现起来也特别简单。

  1. obj-m := hello.o
  2. hello-y := hello1.o hello2.o
  3. kernel_path=/home/linux/kernel/linux-3.5

  4. all:
  5.      make -C $(kernel_path) M=$(PWD) modules
  6. clean:
  7.      make -C $(kernel_path) M=$(PWD) clean
假如有两个C文件,hello1.c hello2.c将这两个文件编译的方式
见上面的Makefile文件。
-----------------------------------------------------------------------------------------
三,多个模块同时编译。

C文件:hello.c find_mod.c
目标模块:hello.ko  find_mod.ko
  1. obj-m := find_mod.o
  2. obj-m += hello.o
  3. kernel_path = /home/linux/kernel/linux-3.5
  4. all:
  5.       make -C $(kernel_path) M=$(PWD) modules
  6. clean:
  7.      make -C $(kernel_path) M=$(PWD) clean
----------------------------------------------------------------------------------------
四,其他。
还有很多其他的编译方式,比如说要在包含指定目录的.h文件,该如何
包含,加入这个模块中有多个目录,又该怎么编写Makefile,等等,这
些在module.txt中就有介绍。

---------------------------------------------------------------------------------------


阅读(6102) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~