如何从外部模块导出符号?

10

我正在编写内核源代码之外的代码。有两个模块,第一个名为printt,其中包含一个函数printtty(),用于向当前终端打印字符串,第二个模块名为hello,在初始化期间调用printtty()

我已经在模块printt中添加了EXPORT_SYMBOL(printtty),并且在执行insmod ./printt.ko之后,可以在/proc/kallsyms中看到printtty()的信息。

模块hellomake过程没有问题。但是执行insmod ./hello.ko会导致错误,类似于:

insmod: ERROR: could not insert module hello.ko: Invalid parameters

dmesg 显示

hello: no symbol version for printtty
hello: Unknown symbol printtty (err -22)`.

我已经通过以下步骤解决了问题:

(1) 将 .ko 文件复制到 /lib/modules/version/kernel 的某个位置。

(2) 将导出的符号添加到 /lib/modules/version/build/Module.symvers 文件中。

但是我想知道是否有一种方法可以仅从外部模块导出符号(而无需修改内核源代码树)?

1个回答

13

在你的Makefile文件的最顶部添加以下这行代码,用于你的hello模块:

KBUILD_EXTRA_SYMBOLS := /home/your-user/path/to/printt/Module.symvers

(确保将正确路径放入您的printt模块中)。

现在重新构建您的hello模块,它将被成功加载。

详情请参见Documentation/kbuild/modules.txt,“6.3来自另一个外部模块的符号”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接