Я добавил поддержку 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
выше, но, тем не менее, эти символы становятся неопределенными. Итак, как я могу определить эти функции?