【问题标题】:Existing Linux Module Symbol现有的 Linux 模块符号
【发布时间】:2011-11-28 15:50:05
【问题描述】:

我正在将一个 Linux 模块 (PageMgrMod) 移植到更新的内核,但现在这些功能对其他模块不可见。例如,加载使用PageMgrMod 的模块会出现错误

    no symbol version for init_pgmgr
    Unknown symbol init_pgmgr

但读取/proc/kallsyms 显示符号存在

    ffffffff81883c0d T x86_init_pgd_noop
    ffffffffa012a5c0 r __ksymtab_init_pgmgr [PageMgrMod]
    ffffffffa012a669 r __kstrtab_init_pgmgr [PageMgrMod]
    ffffffffa012a600 r __kcrctab_init_pgmgr [PageMgrMod]
    ffffffffa012a380 T init_pgmgr   [PageMgrMod]

此功能在 2.6.18 内核上有效,但在 2.6.32-24 内核上失败。

我见过类似的问题,但由于我无法修改其他模块,因此这些解决方案没有帮助。

如果有所不同,则模块源位于不同的文件夹中。

【问题讨论】:

  • 您在构建使用PageMgrMod 的模块时是否使用了来自PageMgrMod 模块的Module.symvers 文件?使用不正确的 .symvers 文件(或根本没有文件)可能会导致您描述的错误。

标签: linux linux-kernel linux-device-driver kernel kernel-module


【解决方案1】:

要使init_pgmgr 对其他模块可见,请添加

EXPORT_SYMBOL(init_pgmgr);

PageMgrMod 模块。如果没有上述声明,该符号可用于任何内置于内核的代码(在某些地方称为外部符号),但不可用于其他可加载模块。

这类似于问题#413955 How to write Linux driver module call/use another driver module?

【讨论】:

  • 感谢您的回复,我已经将 EXPORT_SYMBOL marco 用于我的功能。这些符号对其他模块可见,但似乎它们的版本(?)不是他们应该的。总的来说我不能真的明白为什么我会收到这些消息,因为一切都在旧内核版本中运行。
猜你喜欢
  • 2018-12-21
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多