0

我们编写了许多内核模块,其中许多带有导出的符号,除了 2 个符号(令人费解)之外,它们都可以正常工作。我们已将它们与其他所有符号一样导出,但是这两个符号在插入内核后不会全局导出。

在我们的 C 代码中(在 wdt.ko 中):

EXPORT_SYMBOL(WDT_Enable);
EXPORT_SYMBOL(WDT_Disable);

如果我们nm在生成的内核对象上运行,它们会正确显示:

nm wdt.ko | grep WDT
00000000 T WDT_Enable
00000000 T WDT_Disable

这应该意味着这些符号是全局导出的。一旦我们 insmod 内核对象:

# insmod wdt.ko
# insmod apphandler.ko
apphandler: Unknown symbol WDT_Enable
apphandler: Unknown symbol WDT_Disable

如果我们看一下 kallsyms:

# cat /proc/kallsyms | grep WDT
c12504dc t WDT_Enable  [wdt]
c12502d8 t WDT_Disable [wdt]

一旦它们进入内核,它们就不是全局的。

我们已经确认正确的文件被插入内核并且函数在同一个模块中是可见的,但我们无法解释为什么这些符号突然变成本地而不是像nm建议的那样是全局的。

有谁知道我们的错误可能在哪里?

4

1 回答 1

1

好的 - 在发布问题后不久,我们注意到我们的包含路径缺少模块包含:

#include <linux/module.h>

该代码似乎编译了#include没有包含在内的文件,并且编译器没有产生错误或投诉,但最终结果是后续模块无法使用这些符号。

由于包含头文件,上述符号可用于模块,内核能够解析和执行代码。

于 2015-10-26T08:54:44.990 回答