Linux Kernel Module编程,多个源文件编译成一个模块的解决方案
来源:互联网 发布:淘宝商城货到付款童装 编辑:程序博客网 时间:2024/06/06 15:55
陆陆续续也写了几个Linux内核模块了,但每次都是把代码写在一个源文件中,上次尝试了写在两个.c文件中,结果没有编译通过。
无奈之下,将其中一个.c文件重命名成.h文件,再include当另一个当中。但是,在.h文件中写函数的实现总感觉怪怪的。
今天查看了以下Kbuild的文档,有如下描述:
If a kernel module is built from several source files, you specify
that you want to build a module in the same way as above.
Kbuild needs to know which the parts that you want to build your
module from, so you have to tell it by setting an
$(<module_name>-objs) variable.
Example:
#drivers/isdn/i4l/Makefile
obj-$(CONFIG_ISDN) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
In this example, the module name will be isdn.o. Kbuild will
compile the objects listed in $(isdn-objs) and then run
"$(LD) -r" on the list of these files to generate isdn.o.
整理自己的源文件成两个.c文件(simpLB.c和sahu_lb_tools.c)、一个.h文件(sahu_lb.h)和Makefile文件。两个.c文件都包含了sahu_lb.h
按照Kbuild的文档所述,把Makefile改成如下内容:
obj-m +=simpLB.o
simpLB-objs:=sahu_lb_tools.o
all:
make -C /lib/modules/`uname -r`/build M=`pwd`
clean:
make -C /lib/modules/`uname -r`/build M=`pwd` clean
install:
/sbin/insmod simpLB.ko
remove:
/sbin/rmmod simpLB
编译没有问题,但是安装后模块的功能没有实现,就连我在init_module()中打印的提示信息都没有。lsmod却有simpLB。
只好再上网查了查,发现如下文章:
http://www.linuxquestions.org/questions/programming-9/linking-multiple-files-kernel-module-programming-701735/
按照文章的的建议,我把Makefile修改成如下内容:
obj-m +=sahuLB.o
sahuLB-objs:=simpLB.o sahu_lb_tools.o
all:
make -C /lib/modules/`uname -r`/build M=`pwd`
clean:
make -C /lib/modules/`uname -r`/build M=`pwd` clean
install:
/sbin/insmod sahuLB.ko
remove:
/sbin/rmmod sahuLB
问题解决!
- Linux Kernel Module编程,多个源文件编译成一个模块的解决方案
- Linux Kernel Module编程,多个源文件编译成一个模块的解决方案
- 多个源文件编译成一个模块注意Makefile 书写
- C语言多个源文件编译成一个程序
- 关于C语言多个源文件编译成一个程序
- linux 编译进内核 && 编译成模块module
- Linux kernel 分析之十三:kbuild系统-编译到内核和编译成模块的区别
- 将多个源文件编译成一个ko
- Linux如何源文件逐步编译成可执行文件
- linux 驱动如何编译成module
- 使用CMake将一个源文件编译成一个可执行的二进制文件
- Linux下的ds18b20驱动(编译成模块)
- 关于linux内核无法编译成模块的解决方法
- 读Kernel感悟-kbuild系统-编译到内核和编译成模块的区别
- Linux下如何将源文件逐步编译成目标文件的过程
- 把多个源码编译成一个ko文件的方法
- 把多个源码编译成一个ko文件的方法
- 经典的第一个linux内核模块编程----hello,Kernel!
- MS SQL Server:排名函数详解
- ClearCase完全攻略(七)UCM实例:创建Stream,加入项目Join Project
- tagName和nodeName的区别
- C#接口实例详解
- Linux信号量 sem_t简介
- Linux Kernel Module编程,多个源文件编译成一个模块的解决方案
- .net 2.0下 的HashSet——封装Dictionary
- 把JavaScript 放置到何处
- 如何使用 ubuntu apt-get
- smartforms 强制分页
- SQL优化-索引
- 发现没写博文激活
- Android AppWidget框架妄析: Android中的借尸还魂
- java6 servlet3.0 web安全