1

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

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

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

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

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

4

1 回答 1

2

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

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

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

于 2013-10-08T04:09:22.133 回答