Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1427031
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: LINUX

2012-05-04 22:54:20




在驱动程序里面编译链接内核静态库需要从三个方面注意:
1. 首先保证你正确生成了内核静态库文件,而非应用程序库文件;
2. 其次是除去静态库之外的驱动文件的正确性,包括内核库函数的调用和头文件的申明;
3. 正确修改驱动的Makefile;
这几个方面都正确之后,就能正确地将内核库编译进指定的驱动中去。
 

2.1编译内核静态库文件

 
下面给出一个最简单的详细例子给大家参考,毕竟有代码参考才是大家快速编程的王道。
模块代码目录结构如下:
 

driver.c

 

Makefile

 

lib

myalib.c

myalib.c

Makefile

内核静态库包含一个myalib.c和myalib.h文件,代码如下:

  1. //myalib.c
  2. void test(void)
  3. {
  4.     printk("A lib test.\n");
  5. }

 

  1. //myalib.
  2. void test(void);

 

  1. # This is the Makefile for parse.
  2. RM = rm -f

  3. CCFLAGS = -c
  4. ARFLAG = -rc

  5. CC = gcc
  6. AR = ar

  7. lib_OBJECTS = myalib.o
  8. lib_SOURCE = myalib.c

  9. LIB = libtest.a

  10. libtest.a:$(lib_OBJECTS) 
  11.     $(AR) $(ARFLAG) -o $@ $^

  12. $(lib_OBJECTS):$(lib_SOURCE) 
  13.     $(CC) $(CCFLAGS) -o $@ $^

  14. clean:
  15.     $(RM) $(lib_OBJECTS)
  16.     $(RM) $(LIB)

在输入终端下执行”make”命令即可生成正确的内核库libtest.a文件

 

2.2 链接内核静态库文件

 

驱动代码包括一个driver.c文件。

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include "./lib/myalib.h" //如果这里不加lib,那么需要在Makefile中添加EXTRA_CFLAGS += -I$(绝对路径)

  4. MODULE_LICENSE("Dual BSD/GPL");

  5. int init_module(void)
  6. {
  7.     printk("into init_module.\n");
  8.     test();
  9.     return 0;
  10. }

  11. void cleanup_module(void)
  12. {
  13.     printk("into cleanup_module.\n");
  14. test();
  15. }

 

可以看到,在驱动初始化中调用了库文件中的test()函数,并且包含其头文件。

 

 

2.3 Makefile的修改


修改驱动Makefile文件,加入内核库文件的编译链接。
这个地方的修改比较简单,只需内核库文件当做.o文件一样去进行编译链接即可。

 

  1. # Makefile
  2. KERNELRELEASE=
  3. ifneq ($(KERNELRELEASE),)
  4.     obj-:= drv.o
  5.     drv-objs := driver.o lib/libtest.a
  6. else
  7.     KDIR := /lib/modules/$(shell uname -r)/build
  8.     PWD := $(shell pwd)
  9. $(OBJDIR)/%.o: $(SRCDIR)/%.c
  10.     $(CC) -o $@ $(CFLAGS) -c $<
  11. default:
  12.     $(MAKE) -C $(KDIR) M=$(PWD) modules
  13. clean:
  14.     rm -*.*.ko *.o.cmd *.mod.*.symvers
  15. endif

注意添加的lib/libtest.a


OK,最后终端下执行”make”命令即可成功地将内核库文件和目标驱动文件链接到一起。然后就可以装载驱动进行验证了。

最后需要说明一下,以上只是个最简单的演示版代码,在这个基础上,大家可以根据自己的需要丰富内核库和驱动的内容,从而达到真正的项目用途的目的。
阅读(644) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~