2012-02-29 35 views
8

我有两个内核模块(说MODA和MODB)内核模块。 modA用EXPORT_SYMBOL(symA)导出符号,modB使用它。我有头modA.h为MODA:警告生成使用导出的符号

... 
extern void symA(int param); 
... 

modB.c

#include "modA.h" 
... 
static int __init modB_init(void) 
{ 
    symA(10); 
} 
... 

如果我insmod MODB一切工作正常,我的商业方法是正确的内核链接和功能symA正确调用。然而,当我建立商业方法编译器提出了一个警告:symA is undefined。 LKM是ELF可重定位的,为什么编译器会提出这种警告?这怎么能被删除?

回答

12

这个问题(以及如何正确编译在这种情况下)在http://www.kernel.org/doc/Documentation/kbuild/modules.txt

解释有时候,外部模块使用来自另一个 外部模块输出的符号。 kbuild的需要有所有符号 的充分了解,避免吐出未定义符号警告。针对这种情况存在三个 解决方案。

注:建议与顶层的kbuild文件的方法,但也可以 在某些情况下是不切实际的。

使用顶级的kbuild文件如果你有两个模块,foo.ko和 bar.ko,其中foo.ko需要从bar.ko符号,你可以使用一个 通用顶级的kbuild文件,以便双方模块编译在 相同的版本。考虑以下目录布局:

./foo/ <= contains foo.ko  ./bar/ <= contains bar.ko 

    The top-level kbuild file would then look like: 

    #./Kbuild (or ./Makefile):   obj-y := foo/ bar/ 

    And executing 

     $ make -C $KDIR M=$PWD 

    will then do the expected and compile both modules with   full 

对来自任一模块的符号的了解。

使用一个额外的Module.symvers文件当一个外部模块被编译, 一个Module.symvers文件生成包含未在内核中定义的所有输出的符号 。要访问 bar.ko中的符号,请将bar.ko 的编译中的Module.symvers文件复制到foo.ko所在的目录。在模块构建期间,kbuild将读取 外部模块目录中的Module.symvers文件,并且当构建完成时,会创建一个新的 Module.symvers文件,其中包含已定义的所有符号总和 ,而不是部分的内核。

使用“制造”变KBUILD_EXTRA_SYMBOLS如果是不切实际的,从另一个模块 副本Module.symvers,你可以在你的build文件指定的文件到KBUILD_EXTRA_SYMBOLS空间 分隔的列表。 这些文件将在 的符号表初始化过程中由modpost加载。

+0

太棒了!我错过了。谢谢你,Gossamer! – MirkoBanchi 2012-02-29 14:33:21