在驱动程序里面编译链接内核静态库需要从三个方面注意:
1. 首先保证你正确生成了内核静态库文件,而非应用程序库文件;
2. 其次是除去静态库之外的驱动文件的正确性,包括内核库函数的调用和头文件的申明;
3. 正确修改驱动的Makefile;
这几个方面都正确之后,就能正确地将内核库编译进指定的驱动中去。
2.1编译内核静态库文件
下面给出一个最简单的详细例子给大家参考,毕竟有代码参考才是大家快速编程的王道。
模块代码目录结构如下:
driver.c | |
Makefile | |
lib | myalib.c |
myalib.c |
Makefile |
内核静态库包含一个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)
- $(RM) $(LIB)
在输入终端下执行”make”命令即可生成正确的内核库libtest.a文件
2.2 链接内核静态库文件
驱动代码包括一个driver.c文件。
- #include <linux/init.h>
- #include <linux/module.h>
- #include "./lib/myalib.h" //如果这里不加lib,那么需要在Makefile中添加EXTRA_CFLAGS += -I$(绝对路径)
- 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()函数,并且包含其头文件。
2.3 Makefile的修改
修改驱动Makefile文件,加入内核库文件的编译链接。
这个地方的修改比较简单,只需内核库文件当做.o文件一样去进行编译链接即可。
- # Makefile
- KERNELRELEASE=
- ifneq ($(KERNELRELEASE),)
- obj-m := drv.o
- drv-objs := driver.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
注意添加的lib/libtest.a
OK,最后终端下执行”make”命令即可成功地将内核库文件和目标驱动文件链接到一起。然后就可以装载驱动进行验证了。
最后需要说明一下,以上只是个最简单的演示版代码,在这个基础上,大家可以根据自己的需要丰富内核库和驱动的内容,从而达到真正的项目用途的目的。
阅读(753) | 评论(0) | 转发(0) |