[英]Can a linux kernel source use a function from driver?
我有一個可加載的module(driver)函數,Linux內核源需要使用它。
該函數已經由EXPORT_SYMBOL_GPL()
打開。
linux內核源代碼是linux-3.16.1/mm
的c文件之一。
但是,我在c文件中添加了extern function
,然后重新編譯了整個Linux內核源代碼。
錯誤消息打印undefined reference to fun
。
我認為該錯誤是在鏈接時發生的。
無法從驅動程序中找到功能參考。
我怎么解決這個問題?
我有一個可加載的module(driver)函數,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上使用它
簡而言之的問題:請考慮以下示例
extern int test_module_function();
int teste_function() {
return test_module_function();
}
當您編譯此源代碼時-編譯器不需要test_module_function()
主體,聲明就足夠了。 但是,當我們進行鏈接時,我們需要定義功能。 欲了解更多信息,請閱讀這個和這個 。
在您的情況下,您僅提供了聲明,因為EXPORT_SYMBOL_GPL()
僅使您的函數可從模塊調用(提供函數的extern
聲明)。 它不會在內核源代碼中復制功能體(請參閱此內容 )。 函數主體在您的模塊中,並且該模塊(我認為)沒有內置在內核中。 因此,鏈接器找不到它。
可能的解決方案-將模塊內置到內核中(如dragosht所述 )。
邊注:
我同意unwind和Ian Abbott的看法-尋找更好的解決方案,內核提供了API。 例如,看看其他模塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.