linux驱动模块的依赖

内核模块如果引用到Linux内核中的符号,这个则不属于模块间的依赖,因为内核导出的符号本身就是供内核模块所使用。本帖要讨论的是在两个独立编译的模块A和B之间,B如果要引用A导出的符号,在Makefile中该如何把这一信息加入的问题。
绝大多数情形下,内核配置时能会启用CONFIG_MODVERSIONS,这意味着无论是内核还是内核模块,在导出符号时都会为该符号生成CRC校验码,这个校验码保存在Module.symvers文件中。
最常见的是,模块会引用到内核导出的符号,此时模块的Makefile没有什么特殊的地方。现在假设A导出一个符号A_sym,那么A_sym的CRC校 验码会存在于A模块所在目录的Module.symvers文件中,如果B模块引用到A模块的A_sym符号,那么是需要在它的‘__versions‘ section中生成A_sym符号的校验码的,这个校验码直接取自于A模块的Module.symvers文件。如果B模块在编译时从它的 Makefile中无法获得这一信息,首先编译阶段就会产生一个WARNING,其次加载阶段也会因为符号没有CRC校验码而导致加载失败。
此时我们需要在B模块的Makefile文件中加上下面一行,以告诉模块的编译工具链到何处查找A_sym符号的CRC校验码:
KBUILD_EXTMOD := A模块所在的目录
如此,modpost工具除了到内核所在目录下查找外,还会到KBUILD_EXTMOD指定的目录下查找Module.symvers,以确定本模块所有未定义符号的CRC值。

最后给一个具体的Makefile:

点击(此处)折叠或打开
obj-m := dep_on_A.o
KERNELDIR := /lib/modules/$(shell uname -r)/build
KBUILD_EXTMOD := /home/dennis/workspace/Linux/book/kmodule/A_mod
PWD := $(shell pwd)
default:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

时间: 2024-10-19 23:52:26

linux驱动模块的依赖的相关文章

linux驱动模块编写规范以及Makefiel文件的编写规范

内核驱动模块的编写规范 驱动模块一般涉及的必用的头文件: <linux/init.h><linux/module.h><linux/kernel.h> 驱动模块的入口函数的规范: int __init entry_name(void){ /*xxx*/ return 0;} module_init(entry_name); 驱动模块的出口函数规范: void __exit exit_name(void){ } module_exit(exit_name); 模块的信息的

Linux驱动模块生成和加载分析

Linux驱动模块生成和加载分析 0x00 Hello World 先奉上本文需要分析的例子,这里以Hello World程序作为例子来分析吧: hello.c #include <linux/init.h> #include <linux/kernel.h> int __init hello_init(void) { printk(KERN_INFO "Hello world!\n"); return 0; } void __exit hello_exit(v

linux 驱动模块开发初体验

2020-02-09 关键字: 在嵌入式 Linux 开发中,驱动程序通常都是用 C语言 来编写的,并经编译后生成为目标文件,即 '.o' 文件.随后又可在编译系统时以两种形式打包成系统镜像文件: 1.uImage 即内核的二进制文件.这种形式是直接将内核驱动程序打包进系统文件中.这种形式的驱动程序将会在内核加载时运行,即随系统启动而运行.这种形式的驱动预置在一定程度上会影响系统的开机耗时. 2.ko 文件 即 kernel object,这种形式是将驱动程序以独立的模块文件存在于系统中.这种形

我的第一个Linux 驱动模块编程实验

2014.04.28 module 首测 1)环境:Centos release 6.5 (Final) kernel: 2.6.32-358.23.2.e16.centos.plus.i686 2)源文件及Makefile 源文件:是一个入门的Hello.c文件,网上到处可以找得到. Makefile 第一版本内容如下: obj-m := hello.o 3)make 时的命令 make -C /lib/modules/$(uname -r)/build  SUBDIRS=$PWD modul

linux系统和依赖包常用下载地址

http://ftp.gnome.org/pub/gnome/sources/gstreamer/0.10/ http://www.linuxfromscratch.org/blfs/view/svn/ http://www.linuxfromscratch.org/blfs/view/svn/multimedia/gstreamer.html http://www.cnbeta.com/articles/194758.htm 搜狐开源镜像站:http://mirrors.sohu.com/ 网

linux下的依赖关系

1.一般来说依赖关系可以使得软件较小并且某个lib修复bug以后所有被依赖的软件都能得到好处. 依赖关系下,对于维护也有利有弊,第一,若某个被依赖的软件出现bug或者漏洞,这时候就只需要维护一个软件,可以不动依赖它的上层软件,而win下面,(除了系统的api),安装包都被打成静态包了,这时候如果有个bug,那每个软件都需要打补丁:其二,简化了安装,无须判断其他需要链接的软件的位置. 有些时候依赖关系也确实有点烦人.我上次碰到一个例子: 我安装的是gentoo,并且安装了docky这个软件,而do

Docker(linux container) 所依赖的底层技术

1 Namespace 用来做PID的隔离,有了namespace,在docker container里头看来,就是一个完整的linux的世界.在host看来,container里的进程,就是一个普通的host进程,namespace提供这种pid的映射和隔离效果,host承载着container,就好比造物者创造一个个世外桃源. 2 Cgroups 在我的另外一篇博文里,有详细介绍cgroup如何做到内存,cpu和io速率的隔离,移步cgroups 3 Chroot 如何在container里

简单的Linux 驱动模块编译,加载过程

简单的Linux 驱动模块编译,加载过程 2010-03-14 14:48:24|  分类: Driver |  标签: |字号大中小 订阅 本文记录我的第一个Linux设备驱动程序的编译过程.遇到问题的解决方法. 环境:2.4.18-14的内核,Linux内核源码:2.4.18.       Linux内核源码路径:/usr/src/linux(这个源码是从kernel.org网站download的2.4.18版本)        按照<linux设备驱动开发详解>一书中的步骤实现经典例子&

【转】Linux驱动模块编译进内核中

原文网址:http://blog.chinaunix.net/uid-29287950-id-4573481.html BQ27501驱动编译进内核 一.       驱动程序编译进内核的步骤 在 linux 内核中增加程序需要完成以下三项工作: 1. 将编写的源代码复制到 Linux 内核源代码的相应目录: 2. 在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项: 3. 在目录的 Makefile 文件中增加对新源代码的编译条目. bq27501驱动编译到内核中具体步骤如下: