.c文件如何编译为ko的MAKEFILE文件编写
首先需要知道:
obj-m = *.o
obj-y = *.o
上面两者的区别在于,前者才会生成ko文件,后者只是代码编译进内核,并不生成ko文件。
生成KO文件,分两种情况:单个.c文件和多个.c文件【以展讯7730 ANDROID4.4为例】
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 +=
focaltech_ctl.o
focaltech_ts-objs +=
focaltech_ex_fun.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"
.c文件如何编译为ko的MAKEFILE文件编写的更多相关文章
- Configure,Makefile.am, Makefile.in, Makefile文件
一 软件安装关于 makefile文件问题 如果拿到的工程文件中,没有Makefile文件,而只有configure.in和Makefile.am文件,我们是不能够直接进行编译的,必须根据config ...
- Linux下多个.c文件的编译和Makefile文件
在编程的时候,我们可以把一个完整程序的每个函数分离出来,写成.c文件,最后再一起编译和链接.这样有利于程序功能模块化,也方便检查代码错误. .h文件:里面编辑该程序需要引用的头文件. #ifndef ...
- Linux内核Makefile文件(翻译自内核手册)
--译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 Thi ...
- 使用automake等命令自动生成Makefile文件 (转载)
使用automake等命令自动生成Makefile文件 Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...
- 实例学习写Makefile文件
目录 0. 扫盲 1. 编译,链接 2. Makefile文件执行 3. Makefile书写规则 4. 案例 5. Makefile是如何工作的 6. 拔高,参考 0. 扫盲 Linux 环境下的程 ...
- Linux平台Makefile文件的编写基础篇(转)
目的: 基本掌握了 make 的用法,能在Linux系统上编程.环境: Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境.准备: ...
- Linux学习之Makefile文件的编写
转自:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html 目的: 基本掌握了 make 的用法,能在Linux系统上编 ...
- makefile文件写法解析
一.makefile文件示例 makefile文件并不难写,一个makefile模版如下所示,所有makefile文件在此基上稍微修改就可以了. # this is a makefile #这一行是注 ...
- 面试题----makefile文件的作用
make工具和makefile文件 make工具和makefile文件简介 make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具.它不仅常被用于控制源代码的编译和链接,而且还 ...
随机推荐
- ASP代码审计 -4.命令执行漏洞总结
命令执行漏洞: 保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令 <%ip=request("ip" ...
- JSON.parse()的正确用法
昨天晚上在项目中使用JSON.parse()来将字符串格式的数据转换成json,结果悲剧了,总感觉方法没有用错,可是就是报错!想了好久,最后发现原来是json字符串格式不标准! 如:var a = “ ...
- C# 深拷贝通用方法
C#深拷贝通用方法(引用类型的拷贝) /// <summary> /// 深度COPY /// </summary> /// <typeparam name=" ...
- [zz] be similar with和be similar to的区别
http://wenda.tianya.cn/question/4cb13da080ee34c9 be similar to后边既可以加物主代词又可以加人,即:be similar to sth/sb ...
- 关于windows字体的一些笔记
windows如何管理字体 windows的字体管理在注册表的windows/font这部分(具体路径忘记了),这里会记录字体的名称和名称,如果有具体指出路径,windows启动的时候会从这个路径去加 ...
- VS2012打开解决方案崩溃或点击项目崩溃
打开项目文件就VS2012就崩溃 解决方案: 步骤1:开始-->所有程序-->Microsoft Visual Studio 2012-->Visual Studio Tools-- ...
- 【uTenux实验】消息缓冲区
uTenux的消息缓冲区是一个通过传递大小可变的消息来实现同步和通信的对象. 消息缓冲区由三部分组成:1.待发消息队列 2.等接收消息的任务队列 3.用来保存缓冲消息的空间. 和信号相比,消息队列 ...
- C#和Javascript间互转的Xxtea加解密
很有意思的一件事情,当我想要找 Xxtea 加解密算法的时候,发现了前同事(likui318)的代码,不妨分享出来.此代码满足: 1:Xxtea支持中文: 2:支持 JS 和 C# 加解密之间的互转: ...
- jmf找不到摄像头设备解决办法
1.安装的jdk需要时32位的. 2.在jmfregistry中注册捕获设备. 3.jar文件必须和配置文件在一起.可以新建User library把jar文件添加进去.
- oracle数据库如何创建角色并对角色授予权限
目标: 1.创建角色test1_role, 授予create session 权限 2.创建角色test2_role,授予create procedure, create sequence, crea ...