我编译了这段代码:
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/genhd.h> // declaration of printk_all_partitions()
MODULE_LICENSE("GPL");
int __init start (void) {
printk ("evaluating the module ") ;
printk_all_partitions();
printk (" module inserted .. ");
return 0 ;
}
void __exit x(void) {
printk ("module unloaded ..");
}
module_init(start);
module_exit (x);
MODULE_LICENSE("GPL");
makefile是:
EXTRA_CFLAGS += -Wall
obj-m += printk_all_partitions.o
all :
make -C /lib/modules/$(shell uname -r )/build M=$(PWD) modules
clean :
make -C /lib/modules/$(shell uname -r )/build M=$(PWD) clean
当我跑步时,我得到了
WARNING: "printk_all_partitions" [/root/c++/modulez/multiple_source_files/printk_plm/printk_all_partitions.ko] undefined!
egrep -w'printk | printk_all_partitions'/ proc / kallsyms:
ffffffff8162f135 T printk
ffffffff81ac7b46 T printk_all_partitions
现在printk和printk_all_partitions之间的唯一区别是Module.symvers中不存在printk_all_partitions 和printk是:
0x27e1a049 printk vmlinux EXPORT_SYMBOL
当我完成写作的时候,我发现一个函数也必须是EXPORT_SYMBOL-ed才能使它工作
但如果(某种程度上)Modules.symvers被删除,并且内核源代码不可用,则printk和printk_all_partitions都以“T”开头,还有哪种方法可以知道是否导出了一个?
答案 0 :(得分:1)
通常这一行
obj-m += printk_all_partitions.o
是您尝试创建的模块的名称。在这种情况下,您将模块命名为与现有符号相同,这是故意的吗?