Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1586724
  • 博文数量: 77
  • 博客积分: 1205
  • 博客等级: 少尉
  • 技术积分: 4476
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-22 21:48
文章分类
文章存档

2018年(1)

2017年(1)

2015年(1)

2014年(18)

2013年(12)

2012年(44)

分类: LINUX

2013-07-08 16:56:55

内核模块如果引用到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:

点击(此处)折叠或打开

  1. obj-m := dep_on_A.o
  2. KERNELDIR := /lib/modules/$(shell uname -r)/build
  3. KBUILD_EXTMOD := /home/dennis/workspace/Linux/book/kmodule/A_mod
  4. PWD := $(shell pwd)

  5. default:
  6.         $(MAKE) -C $(KERNELDIR) M=$(PWD) modules


阅读(8041) | 评论(2) | 转发(8) |
给主人留下些什么吧!~~

MagicBoy20102013-07-26 10:14:08

laoyouji:那如果依赖的模块很多的话,那不是要写很多路径?

这是目前我所能想到的, 如果你知道有更好的方法,期待分享 :)

回复 | 举报

laoyouji2013-07-26 09:21:57

那如果依赖的模块很多的话,那不是要写很多路径?