繁体   English   中英

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

[英]Warning building a kernel module that uses exported symbols

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

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

modB.c

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

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

这个问题(以及如何在这种情况下正确编译)在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访问符号,请将module.symvers文件从bar.ko的编译复制到构建foo.ko的目录。 在模块构建期间,kbuild将读取外部模块目录中的Module.symvers文件,并且在构建完成时,将创建一个新的Module.symvers文件,其中包含已定义的所有符号的总和,而不是内核的一部分。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM