我有一个linux内核源需要使用的可加载模块(驱动程序)函数。
该功能已由EXPORT_SYMBOL_GPL()
打开。
linux内核源代码是linux-3.16.1/mm
中的c文件之一。
但是,我在c文件中添加extern function
并重新编译整个Linux内核源代码。
错误消息print undefined reference to fun
。
我认为错误发生在链接时间。
无法从驱动程序中找到函数引用。
我该如何解决这个问题?
答案 0 :(得分:1)
我有一个linux内核源码的可加载模块(驱动程序)函数 需要使用。
是。这个有可能。但不是你想要的直截了当的方式。 大多数驱动程序以与可加载内核模块(LKM)相同的方式工作。
考虑一个示例GPIO驱动程序(CONFIG_ATH79)。
在以下链接中,我们可以看到函数被分配给函数指针的结构。
http://lxr.free-electrons.com/source/drivers/gpio/gpio-ath79.c#L124
这里定义结构
http://lxr.free-electrons.com/source/include/linux/gpio/driver.h#L90
类似的方式,它可以做到。在相应的头文件中声明一个结构,该结构应该包含在LKM中。
从LKM填充该结构并在linux-3.16.1 / mm / fileX.c上使用
答案 1 :(得分:0)
问题简而言之:考虑这个例子
extern int test_module_function();
int teste_function() {
return test_module_function();
}
编译此源代码时 - 编译器不需要test_module_function()
的主体,声明就足够了。但是当我们连接时 - 我们需要定义功能。有关详情,请参阅this和this。
在您的情况下,您只提供了声明,因为EXPORT_SYMBOL_GPL()
只是使您的函数可以从模块调用(提供extern
函数声明)。它不会在内核源代码中复制函数体(参见this)。函数体在你的模块中,而那个模块(我推测)并没有内置到内核中。所以链接器无法找到它。
可能的解决方案 - 将模块内置到内核中(如 dragosht 所述)。
旁注:
我同意 unwind 和 Ian Abbott - 寻找更好的解决方案,内核提供API。例如,看看其他模块。