我試圖在兩個模塊之間共享一個全局變量,以便了解如何正確使用EXPORT_SYMBOL
宏,但是我一直在收到Invalid paramaters
錯誤嘗試插入第二個模塊。嘗試插入訪問導出符號的模塊時出現「無效參數」錯誤
在第一模塊foo.c
:
#include <linux/module.h>
#include <linux/kernel.h>
extern unsigned myvar;
unsigned myvar = 42;
EXPORT_SYMBOL(myvar);
static int __init foo_init(void){
printk(KERN_INFO "HELLO FROM MODULE 1");
return 0;
}
static void __exit foo_exit(void){
printk(KERN_INFO "BYE FROM MODULE 1");
}
module_init(foo_init);
module_exit(foo_exit);
MODULE_LICENSE("GPL");
在第二模塊bar.c
:
#include <linux/module.h>
#include <linux/kernel.h>
extern unsigned myvar;
static int __init bar_init(void){
printk(KERN_INFO "HELLO FROM MODULE 2");
printk(KERN_INFO "myvar: %u", myvar);
return 0;
}
static void __exit bar_exit(void){
printk(KERN_INFO "BYE FROM MODULE 2");
}
module_init(bar_init);
module_exit(bar_exit);
MODULE_LICENSE("GPL");
我編譯在具有分離的生成文件不同的目錄中的每個模塊。然後我手動插入每個模塊:
# insmod foo.ko
# insmod bar.ko
Error: could not insert module bar.ko: Invalid parameters
如果我嘗試插入bar.ko
第一,我收到預期的未知符號錯誤:
# insmod bar.ko
Error: could not insert module bar.ko: Unknown symbol in module
這裏的符號轉儲:
# nm foo.ko | grep myvar
00000000ec933bae A __crc_myvar
0000000000001118 r __kcrctab_myvar
000000000000057c r __kstrtab_myvar
0000000000000b20 r __ksymtab_myvar
0000000000000180 D myvar
我正在運行一個Debian系統(內核v3.2.21)應用了Xenomai補丁:
# uname -r
3.2.21-xenomai-2.6.2.1-ipipe
不幸的是,我不認爲CONFIG_KALLSYMS_ALL
啓用,所以我不能在/proc/kallsyms/
看,以驗證myvar
實際上是出口。
你有一個共同的標題,你定義的符號共享? – Federico 2013-05-03 14:44:34
我在兩個文件中都有'extern unsigned myvar;'(我可以將它粘貼在頭文件中,但淨效應應該是相同的)。 – 2013-05-03 14:50:17
有你的模塊module_init()和module_exit()?你的代碼中有一個EINVAL錯誤返回? – Federico 2013-05-03 15:07:16