模块中的未知符号:printk_all_partitions

时间:2016-04-18 15:31:23

标签: linux-kernel kernel-module

我编译了这段代码:

#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”开头,还有哪种方法可以知道是否导出了一个?

1 个答案:

答案 0 :(得分:1)

通常这一行

obj-m += printk_all_partitions.o

是您尝试创建的模块的名称。在这种情况下,您将模块命名为与现有符号相同,这是故意的吗?