c文件如何编译为ko的MAKEFILE文件编写

首先需要知道:

obj-m = *.o

obj-y = *.o

上面两者的区别在于,前者才会生成ko文件,后者只是代码编译进内核,并不生成ko文件。

生成KO文件,分两种情况:单个.c文件和多个.c文件

1.单个.c文件

kernel配置文件中定义

CONFIG_RUNYEE_CAMVIB=m

注意上面的m,表示作为一个模块进行编译,最后在MAKEFILE中需要用到的编译开关。

然后再相应的源码目录中的MAKEFILE中添加如下语句:

obj-$(CONFIG_RUNYEE_CAMVIB) := camvib.o

上面的一行的作用就是编译camvib.c的源文件,同时会生成相应的camvib.ko文件,和编译生成

的camvib.o在同一目录

最后就是insmod动作了:

insmod /system/lib/modules/camvib.ko

2.多个.c文件生成ko文件

kernel配置文件中定义

CONFIG_TOUCHSCREEN_FOCALTECH=m

注意上面的m,表示作为一个模块进行编译,最后在MAKEFILE中需要用到的编译开关。

然后再相应的源码目录中的MAKEFILE中添加如下语句:

obj-$(CONFIG_TOUCHSCREEN_FOCALTECH) += focaltech_ts.o

focaltech_ts-objs := focaltech.o

focaltech_ts-objs += foc altech _ctl .o

focaltech_ts-objs += f ocaltech_ex_fu n .o

上面的意思就是编译生成 ko文件需要三个.c文件【focaltech.c focaltech_ctl.c focaltech_ex_fun.c】,最后

生成名为 focaltech_ts 的ko文件,注意ko文件名一定不能 为 focaltech。那么在obj-m和lpc-objs中都含有focaltech.o,

对make来讲会产生循环和混淆,因此也不能这样书写

最后就是insmod动作了:

insmod /system/lib/modules/focaltech_ts.ko

注意事项:

1 源代码书写要保证正确,MODULE_LICENSE();是一条语句,后面要有分号;

2 static void hello_exit()的返回类型为void;

3 make M=`pwd` M参数后面不是单引号,而是斜点``;

4 -c 指定包含kernel顶级Makefile的源码目录;

5 源代码要执行make menuconfig生成默认配置,无须修改任何内容;

6 make menuconfig 的运行可能需要安装necurses-dev;

7 生成ko模块文件所使用的源码版本要和insmod的目标内核版本一致;

8 2.6个版本内核下载 http://www.kernel.org/pub/linux/kernel/v2.6/;

9 make编译可能提示没有modpost等脚本文件,可以从其它源码目录拷到当前使用源码目录下,或者利用当前源码目录下的c文件直接编译生成;

10 如果insmod过程中出错,可以使用dmesg | tail 命令查看系统日志

11 模块的编译和插入,对版本一致性要求很严格,如果编译依赖的内核源码版本和目标平台正在运行的内核版本不一致的话,很可能模块无法正常insert,出现诸如“-1 Invalid module format”或“no symbol version for module layout”的错误

所以编译过程中:

不是为正在运行的内核编译模块:

make -C M='pwd'

为正在运行的内核编译模块:

make -C /lib/modules/'uname -r'/build M='pwd'

即可以保证insmod无误;

举例

内核源文件my.c

#include <linux/init.h>  
#include <linux/kernel.h>  
#include <linux/module.h>  
static int funcIn(void)  
{  
    printk("in module");  
    return 0;  
}  
static void funcOut(void)  
{  
    printk("out module");  
    return;  
}  
module_init(funcIn);  
module_exit(funcOut);  
MODULE_LICENSE("GPL");  
MODULE_AUTHOR("elfy"); 

Makefile 文件

    obj-m:=my.o  
    mymodule-objs:=module  
    KDIR:=/lib/modules/$(shell uname -r)/build  
    MAKE:=make  
    default:  
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules  
    clean:  
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean  

注意事项:

1、内核目录

2、Makefile中obj-m:=my.o 这个和源文件my.c要对应

3、mymodule-objs:=module 这个my也是和my.c对应的

如果源文件为your.c

这两句话就应该改为obj-m:=your.o

yourmodule-objs:=module

4、查看输出的时候 用dmesg输出信息太多,可以用grep过滤一下

dmesg | grep "keywords"

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值