我正在嘗試使用多個源文件構建一個可加載的內核模塊。根據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] 删除。
我来说两句