Linux内核源可以使用驱动程序中的函数吗?

时间:2016-02-10 13:44:38

标签: c linux linux-kernel driver

我有一个linux内核源需要使用的可加载模块(驱动程序)函数。

该功能已由EXPORT_SYMBOL_GPL()打开。

linux内核源代码是linux-3.16.1/mm中的c文件之一。

但是,我在c文件中添加extern function并重新编译整个Linux内核源代码。

错误消息print undefined reference to fun

我认为错误发生在链接时间

无法从驱动程序中找到函数引用。

我该如何解决这个问题?

2 个答案:

答案 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()的主体,声明就足够了。但是当我们连接时 - 我们需要定义功能。有关详情,请参阅thisthis

在您的情况下,您只提供了声明,因为EXPORT_SYMBOL_GPL()只是使您的函数可以从模块调用(提供extern函数声明)。它不会在内核源代码中复制函数体(参见this)。函数体在你的模块中,而那个模块(我推测)并没有内置到内核中。所以链接器无法找到它。

可能的解决方案 - 将模块内置到内核中(如 dragosht 所述)。

旁注:
我同意 unwind Ian Abbott - 寻找更好的解决方案,内核提供API。例如,看看其他模块。