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

2023-10-28 08:04
文章标签 编译 编写 makefile ko

本文主要是介绍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"

这篇关于c文件如何编译为ko的MAKEFILE文件编写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/291839

相关文章

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

使用Java编写一个文件批量重命名工具

《使用Java编写一个文件批量重命名工具》这篇文章主要为大家详细介绍了如何使用Java编写一个文件批量重命名工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景处理1. 文件夹检查与遍历2. 批量重命名3. 输出配置代码片段完整代码背景在开发移动应用时,UI设计通常会提供不

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

Golang test编译使用

创建文件my_test.go package testsimport "testing"func TestMy(t *testing.T) {t.Log("TestMy")} 通常用法: $ go test -v -run TestMy my_test.go=== RUN TestMyTestMy: my_test.go:6: TestMy--- PASS: TestMy (0.

Wondows dos下怎么编写bat批处理文件

最近搞php,在运行时,以Nginx+php-cgi.exe方式运行Wordpress项目 打开dos,先cd到php-cgi.exe文件当前目录下执行启动命令:php-cgi.exe -b 127.0.0.1:9001再打开一个dos,再cd到nginx.exe文件当前目录下执行启动命令:start nginx 大概过程要经过这些步骤,觉得很麻烦,就学下怎么编写一个bat文件,以双击运行代替