如何将内核静态库编译连接到驱动程序中去
来源:互联网 发布:怎么打开php文件 编辑:程序博客网 时间:2024/04/29 05:14
转载自:http://blog.chinaunix.net/uid-29396785-id-4045313.html
只为备份,内容未确认。
刚上邮箱的时候发现一位网友向我询问这个问题,同时发送了一个链接给我了。
上去一看,上面还留有我以前同样的提问,看看时间,都几年前在别人的帖子里面的提问了。貌似当时我遇到同样问题的时候也是到处发帖回帖询问来着的,问的地方有点多,要不是这位朋友给我链接,早不记得那个链接也有访问过,呵呵。
不过再往下看了后才发现,这个问题依然没有给出明确的回答,很多朋友给出的都是应用层库的链接,这和期望的内核层的链接是不一样的。
所以我把自己的一点理解写出来,给后面的朋友参考,期望对后来的朋友有所帮助。
我觉得在驱动程序里面编译链接内核静态库需要从三个方面注意:
1. 首先保证你正确生成了内核库文件,而非应用程序库文件;
2. 其次是除去静态库之外的驱动文件的正确性,包括内核库函数的调用和头文件的申明;
3. 正确修改驱动的Makefile;
这几个方面都正确之后,就能正确地将内核库编译进指定的驱动中去。
下面详细给出个最简单的例子给大家参考,毕竟有代码参考才是大家快速编程的王道。
代码目录结构如下:
DriverEntry.c
Makefile
lib
myalib.c
myalib.c
Makefile
1. 内核静态库文件的生成
内核库包含一个myalib.c和myalib.h文件,代码如下:
//myalib.c
void test(void)
{
printk("A lib test.\n");
}
//myalib.h
void test(void);
# This is the Makefile for parse.
RM = rm -f
CCFLAGS = -c
ARFLAG = -rc
CC = gcc
AR = ar
lib_OBJECTS = myalib.o
lib_SOURCE = myalib.c
LIB = libtest.a
libtest.a:$(lib_OBJECTS)
$(AR) $(ARFLAG) -o $@ $^
$(lib_OBJECTS):$(lib_SOURCE)
$(CC) $(CCFLAGS) -o $@ $^
clean:
$(RM) $(lib_OBJECTS.o)
$(RM) $(LIB)
在输入终端下执行”make”命令即可生成正确的内核库文件。
2. 驱动文件的准备
驱动代码包括一个DriverEntry.c文件。
#include <linux/init.h>
#include <linux/module.h>
#include "./lib/myalib.h"
MODULE_LICENSE("Dual BSD/GPL");
int init_module(void)
{
printk("into init_module.\n");
test();
return 0;
}
void cleanup_module(void)
{
printk("into cleanup_module.\n");
test();
}
可以看到,在驱动初始化中调用了库文件中的test()函数,并且包含其头文件。
3. Makefile的修改
修改驱动Makefile文件,加入内核库文件的编译链接。
这个地方的修改比较简单,只需内核库文件当做.o文件一样去进行编译链接即可。
# Makefile
ifneq ($(KERNELRELEASE),)
obj-m := drv.o $(LIB)
drv-objs := DriverEntry.o lib/libtest.a
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) -o $@ $(CFLAGS) -c $<
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.o *.ko *.o.cmd *.mod.c *.symvers
endif
OK,最后终端下执行”make”命令即可成功地将内核库文件和目标驱动文件链接到一起。
然后就可以装载驱动进行验证了。
最后说明下,以上只是个最简单的演示版代码,在这个基础上,大家可以根据自己的需要丰富内核库和驱动的内容,从而达到真正的项目用途的目的。
- 如何将内核静态库编译连接到驱动程序中去
- 如何将内核静态库编译连接到驱动程序中去
- 如何将内核静态库编译连接到驱动程序中去
- 如何把驱动程序编译到Linux内核中去
- 如何将驱动程序静态编译进内核
- 怎样将驱动静态的编译到内核中。
- Android系统篇之----编写简单的驱动程序并且将其编译到内核源码中
- Android系统篇之----编写简单的驱动程序并且将其编译到内核源码中
- 详解将驱动程序编译进linux内核
- 将驱动程序模块添加到内核
- Linux:驱动程序直接编译到内核
- 如何将jboss集成到eclipse中去
- 如何将Project中的任务传送到Outlook中去
- 如何将Project中的任务传送到Outlook中去
- 如何将自制的SurfaceView绘制到界面中去
- 如何将tomcat加入到linux服务中去
- Linux驱动程序如何编译进内核
- Linux驱动程序如何编译进内核
- codeforces#191_div2_C Magic Five 矩阵快速幂
- OpenCV IplImage数据结构
- 判断一个数中是不是含有1、含有多少个1
- numpy 数组与类型
- 图的小结
- 如何将内核静态库编译连接到驱动程序中去
- 数据库事务隔离级别
- 排序使得数组负数在正数左边且按照原来的顺序
- http状态码大全
- 计算几何基础模板(不间断更新)
- cocos2d-x 常见的32种切换场景的动画
- 数组左边减去右边数值的最大差值
- UVA 11178 Morley's Theorem
- 黑马程序员--网络通讯