警告构建使用导出符号的内核模块

Mir*_*chi 8 linux gcc kernel-module

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

...
extern void symA(int param);
...
Run Code Online (Sandbox Code Playgroud)

并在modB.c:

#include "modA.h"
...
static int __init modB_init(void)
{
    symA(10);
}
...
Run Code Online (Sandbox Code Playgroud)

如果我的insmodmodB一切正常,我的modB在内核中正确链接,并symA正确调用函数.但是当我构建modB时,编译器会发出警告:symA is undefined.LKM是ELF可重定位的,为什么编译器会发出此警告?怎么可以删除?

sve*_*nfx 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
Run Code Online (Sandbox Code Playgroud)

任何一个模块的符号知识.

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

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