如何使用LKM的导出符号编译内核?

时间:2013-10-08 03:21:04

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

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

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

如何获取内核编译以查看导出的符号?我在Google上看到的MOst示例是模块到模块的导出。

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

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

1 个答案:

答案 0 :(得分:2)

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

简而言之,整体可以导出可能由模块引用的符号。此外,模块可以导出由其他从属模块引用的符号。但相反的方向是不可能的。

听起来你需要稍微重构代码,这样你就不必从模块中导出。你是否可以让monolith导出一个函数指针,你的模块在加载时会填充它?您必须对其进行设置,以便在模块实际加载时,monolith将仅调用函数指针指向的函数。