Неопределенные символы в модуле ядра C ++ hello world - PullRequest
0 голосов
/ 01 июля 2018

Я добавил поддержку C ++ в ядро ​​Linux версии 4.14.41, скомпилировал его и успешно загрузился с использованием ядра. Я могу проверить правильность модуля C ++, вставив LKM. Это модуль, который я пытаюсь загрузить:

#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.

дмесг :

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_init, end_init и begin_fini определены в lib/gcc/crtstuff.c (который был перенесен в ядро). Эти функции объявлены как extern в crtstuff.c и linux/module.h. Этот module.h включен в модуль helloworld выше, но, тем не менее, эти символы становятся неопределенными. Итак, как я могу определить эти функции?

1 Ответ

0 голосов
/ 01 июля 2018

Ваша реализация ядра C ++ не завершена. Вам нужно будет реализовать глобальную поддержку конструктора и деструктора (правильно обрабатывать секции .init_array и .fini_array) или прекратить использование этих функций C ++ в исходном коде. Это требует сотрудничества с загрузчиком модулей ядра. Изменения в коде запуска не будут работать, поскольку код запуска не связан с модулями ядра.

...