【问题标题】:Warning building a kernel module that uses exported symbols警告构建使用导出符号的内核模块
【发布时间】:2012-03-18 23:20:12
【问题描述】:

我有两个内核模块(比如 modA 和 modB)。 modA 导出带有EXPORT_SYMBOL(symA) 的符号,modB 使用它。我有 modA 的标题 modA.h

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

modB.c:

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

如果 i insmod modB 一切正常,我的 modB 在内核中正确链接并且函数 symA 被正确调用。但是,当我构建 modB 时,编译器会发出警告:symA is undefined。 LKM 是可重定位的 ELF,那么为什么编译器会发出此警告?这个怎么去掉?

【问题讨论】:

    标签: linux gcc kernel-module


    【解决方案1】:

    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 文件,其中包含所有符号的总和 已定义且不是内核的一部分。

    使用“make”变量 KBUILD_EXTRA_SYMBOLS 如果不切实际 从另一个模块复制Module.symvers,你可以分配一个空间 在构建文件中将文件列表分隔为 KBUILD_EXTRA_SYMBOLS。 这些文件将在初始化期间由 modpost 加载 它的符号表。

    【讨论】:

    • 太棒了!我错过了。谢谢游丝!
    猜你喜欢
    • 2016-02-22
    • 2012-02-26
    • 2013-02-12
    • 2014-03-01
    • 2019-07-22
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    相关资源
    最近更新 更多