【问题标题】:How to compile Kernel with a LKM's exported symbols?如何使用 LKM 的导出符号编译内核?
【发布时间】:2013-10-14 20:01:41
【问题描述】:

我是内核新手,需要一些帮助来编译带有内核模块导出符号的 Linux 内核。

我在 LKM 源代码中尝试了以下操作 - EXPORT_SYMBOL(func_name),LKM 编译并在其 Module.symvers 中生成符号。但是,当我尝试使用内核调用导出的符号来编译内核时,它会显示对“func_name”的未定义引用。

我应该如何获得内核编译以查看导出的符号?我在 Google 上看到的大多数示例都是模块到模块的导出。

我错过了什么?任何帮助表示赞赏!

编辑:我基本上想从内核调用 LKM 中的一个函数。

【问题讨论】:

  • 请举例说明您要做什么?

标签: android c compiler-construction linux-kernel kernel-module


【解决方案1】:

导出内核符号时,必须考虑依赖的顺序。听起来您正试图从模块中导出符号,并期望内核单体能够使用该导出的符号。但请记住,内核是静态链接的,因此在构建时必须能够解析其所有符号。如果您向单体应用程序添加一些代码,它试图引用模块导出的符号,那么它根本不会构建 - 链接器不知道模块符号,因为模块总是在单体应用程序之后加载。

简而言之,单体可以导出可能被模块引用的符号。模块也可以导出被其他依赖模块引用的符号。但相反的方向是不可能的。

听起来您需要对代码进行一些重构,以便不必从模块中导出。您能否改为让单体应用程序导出一个函数指针,您的模块在加载时将填充该函数指针?您必须对其进行设置,以便在模块实际上已加载时,单体应用程序只会调用函数指针指向的函数。

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2012-03-18
    • 2011-05-15
    • 2012-02-26
    • 2014-12-18
    相关资源
    最近更新 更多