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

Linux 如何从外部模块导出符号?,linux,gcc,linux-kernel,kernel,Linux,Gcc,Linux Kernel,Kernel,我在内核源代码树之外编码。有两个模块,第一个printty有一个函数printty()将字符串打印到当前tty,第二个模块hello在初始化期间调用printty() 我在模块printt中添加了EXPORT\u SYMBOL(printty),在insmod./printt.ko之后,printty()的信息可以在/proc/kallsyms中看到 模块的make过程正常。但是insmod./hello.ko将导致如下错误: insmod: ERROR: could not insert mo

我在内核源代码树之外编码。有两个模块,第一个printty有一个函数
printty()
将字符串打印到当前tty,第二个模块hello在初始化期间调用
printty()

我在模块printt中添加了
EXPORT\u SYMBOL(printty)
,在
insmod./printt.ko
之后,
printty()
的信息可以在
/proc/kallsyms
中看到

模块的
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) 将.ko文件复制到/lib/modules/version/kernel下面的位置

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


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

在您的hello模块的Makefile的最顶部添加这一行:

KBUILD_EXTRA_SYMBOLS := /home/your-user/path/to/printt/Module.symvers
(确保输入到printt模块的正确路径)

现在重新构建您的hello模块,它将很好地加载

有关详细信息,请参见“6.3其他外部模块的符号”