無法讓多文件內核模塊工作

羅馬

我正在嘗試使用多個源文件構建一個可加載的內核模塊。根據https://www.kernel.org/doc/Documentation/kbuild/makefiles.txt 的第 3.3 節,我必須將 obj-m 用於主目標文件,並將 modulename-y 用於其餘部分。這是我的 mwe:

helpers.h

#ifndef __HELPERS_H__
#define __HELPERS_H__

void helper_print_init(void);
void helper_print_exit(void); 

#endif // __HELPERS_H__

helpers.c

#include "helpers.h"
#include <linux/kernel.h>

void helper_print_init(void) {
    printk("multi_file_ko_init_helper\n");
}

void helper_print_exit(void) {
    printk("multi_file_ko_exit_helper\n");
}

多文件Ko.c

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>

//#include "helpers.h"

static int __init multi_file_ko_init(void) {
    printk("multi_file_ko_init\n");
//    helper_print_init();
    return 0;
}

static void __exit multi_file_ko_exit(void) {
    printk("multi_file_ko_exit\n");
//    helper_print_exit();
}

module_init(multi_file_ko_init);
module_exit(multi_file_ko_exit);

MODULE_LICENSE("MIT");
MODULE_AUTHOR("AUTHOR");
MODULE_DESCRIPTION("gpio");
MODULE_VERSION("0.0");

請注意, multiFileKo.c 目前甚至不實際使用助手。我試圖實際調用這些函數,但為了簡單起見,只是從 mwe 中註釋掉了一些東西。

現在,如果我像下面這樣用 kbuild 編譯它,只使用主文件,我會按預期得到 dmesg 輸出:

obj-m := multiFileKo.o

但是當我嘗試編譯它與幫助程序鏈接時,即使沒有按如下方式實際使用它們,即使 insmod/rmmod 似乎在工作,dmesg 仍然保持沉默:

obj-m := multiFileKo.o
multiFileKo-y := helpers.o

顯然,如果我取消註釋 multiFileKo.c 中的所有內容,它也不起作用。因此,無論附加目標文件做什麼,鏈接附加目標文件的事實似乎都在破壞我的模塊。

使用 multiFileKo-objs 的方法對我也不起作用。我之前看到過這個,但可以確定它的來源,因為 makefiles 手冊僅在主機程序的上下文中使用它。

羅馬

導致解決方案的信息由@Tsyvarev 提供。原始信息可以在第一篇文章的評論中找到。

obj-m := multiFileKo.o定義模塊的名稱。默認情況下,它還使用 multiFileKo.c 作為源文件。但是這個原則只適用於單源文件模塊。

如果使用多個源文件來創建一個模塊,obj-m := multiFileKo.o應定義模塊名稱,而不是源。所有目標文件(引用實際來源)然後應列在multiFileKo-objs :=列表中。源文件不能與模塊同名。

從我的實驗和 make 實用程序手冊中,我還可以說列出源代碼似乎multiFileKo-y :=也有效。-obj由於兼容性,可能仍在工作,因為現在製作文檔建議使用-y列表。

總而言之,正確的做法是:

obj-m := multiFileKo.o
multiFileKo-y := multiFileKo_main.o helpers.o

源文件:

multiFileKo_main.c // contains init and exit functions
helpers.c

輸出將存儲在 multiFileKo.ko

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

無法導出多個模塊 [ExpressJs]

無法從父文件夾導入模塊

內核模塊寫入 proc 不起作用

SeedLabs 防火牆實驗室:實現一個簡單的內核模塊,構建內核模塊失敗

為什麼顯示模塊已連接但仍然無法工作?

無法運行 .py 文件 | AttributeError: 模塊“collections”沒有屬性“MutableSequence”

如何測量Linux內核模塊中函數的執行時間?

無法讓“if hasclass addclass”工作(jQuery)

NestJS Axios 模塊 - 無法解析依賴項

無法在nextjs中導入模塊

無法導入節點模塊

無法安裝 Windows 的 python 詛咒模塊

Python unittest無法導入其他模塊

無法讓 ASP.NET 上傳文件示例在 IIS 本地網絡上工作

無法在測試文件夾下使用緊湊樣式的模塊和類(NameError)

無法讓烏龜 ontimer() 函數工作

無法讓我的樣式表工作 (atom/html)

無法讀取文件內容

pytest 無法多次模擬同一個模塊

我無法讓我的網頁從同一文件夾內的 xml 文件中提取數據

Python - 無法重新排列內核以執行另一個過程

無法在多模塊 Maven 項目中解析值“${test.name}”中的佔位符“test.name” - Spring Boot

無法讓響應式文本輸入保持在表單的邊界內

Javascript如何使用模塊從文件中導入/導出所有內容?

無法解析模塊說明符“刺激自動完成”

python請求模塊無法使用錯誤消息

找不到模塊:無法解析“@mui/icons-material/FileDownload”

找不到模塊:無法解析“@material-ui/styles”(反應)

如果無法訪問 JavaScript 模塊中的參數