我在内核源代码树之外进行编码。有两个模块,第一个模块 printt 有一个函数
printtty()
将字符串打印到当前 tty,第二个模块 hello 在初始化期间调用 printtty()
。
我在
printt模块中添加了
EXPORT_SYMBOL(printtty)
,在insmod ./printt.ko
之后,可以在printtty()
中看到/proc/kallsyms
的信息。
模块
hello的
make
进程一切正常。但是 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) 将
hello.ko
文件复制到 /lib/modules/version/kernel
下面的位置
(2) 将导出的符号从
hello.ko
添加到/lib/modules/version/build/Module.symvers
但我想知道有什么方法可以导出符号仅从外部模块(不修改内核源代码树)?
将此行添加到 hello 模块的 Makefile 的最顶部:
KBUILD_EXTRA_SYMBOLS := /home/your-user/path/to/printt/Module.symvers
(请务必输入您的 printt 模块的正确路径)。
现在重建你的 hello 模块,它将被正常加载。
有关详细信息,请参阅Documentation/kbuild/modules.txt,“6.3 来自另一个外部模块的符号”。