繁体   English   中英

Hello World C ++内核模块中的未定义符号

[英]Undefined symbols in hello world C++ kernel module

我已将C ++支持添加到Linux内核版本4.14.41,对其进行了编译并成功使用内核进行了引导。 我可以通过插入LKM来检查C ++模块的正确性。 这是我要加载的模块:

#include<c++/begin_include.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<c++/end_include.h>


MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("LKM in c++");
MODULE_AUTHOR("MOOL");

class hello
{

public:
        hello();
       void hi();
};
void hello::hi()
{
  printk("Hello world!! \n");
}

hello::hello()
{
        printk("Constructor is being called \n");
        }
 extern "C"
{
   static int __init test_classes_init()
   {
        class hello obj;
        obj.hi();
        printk("Module inserted:\n");
        return 0;
   }
   static void __exit test_classes_fini()
   {
        printk("Module removed:\n");
   }

   module_init(test_classes_init);
   module_exit(test_classes_fini);

}

Makefile:

obj-m = helloworld.o
KVERSION=$(shell uname -r)
all:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

当我输入make命令时,将生成带有警告的helloworld.ko

WARNING: "begin_fini" [/home/jai/Downloads/helloworld/helloworld.ko] undefined !
WARNING: "end_init" [/home/jai/Downloads/helloworld/helloworld.ko] undefined !
WARNING: "begin_init" [/home/jai/Downloads/helloworld/helloworld.ko] undefined !

但是,当我尝试使用insmod helloworld.ko插入它时,发生undefined symbol错误。

dmesg

loading out-of-tree module taints kernel
Unknown symbol begin_init (err 0)
Unknown symbol end_init (err 0)
Unknown symbol begin_fini (err 0)

这些begin_initend_initbegin_finilib/gcc/crtstuff.c中定义(已移植到内核中)。 这些函数在crtstuff.clinux/module.h都声明为extern module.h已包含在上面的helloworld模块中,但这些符号仍未定义。 那么,如何定义这些功能?

您的内核C ++实现不完整。 您将必须实现全局构造函数和析构函数支持(正确处理.init_array.fini_array部分),或者停止在源代码中使用这些C ++功能。 这需要内核模块加载器的配合。 由于启动代码未链接到内核模块中,因此无法更改启动代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM