LINUX.ORG.RU

Не компилируется модуль ядра

 ,


0

2

Я набрал следующий код:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int test_init(void) {
  printk(KERN_ALERT"Hello!\n");
  return 0;
}
static void test_exit(void) {
  printk(KERN_ALERT"End!\n");
}
module_init(test_init);
module_init(test_exit);
Makefile содержит одну строку:
obj-m += hello.o
Собираю командой:
make -C /usr/src/linux-headers-`uname -r` SUBDIRS=$PWD modules
В итоге получаю:
make: Entering directory '/usr/src/linux-headers-4.10.0-28-generic'
  CC [M]  /home/vasya/gcc/kernel/hello.o
In file included from /home/vasya/gcc/kernel/hello.c:2:0:
./include/linux/module.h:130:27: error: redefinition of ‘__inittest’
  static inline initcall_t __inittest(void)  \
                           ^
/home/vasya/gcc/kernel/hello.c:13:1: note: in expansion of macro ‘module_init’
 module_init(test_exit);
 ^
./include/linux/module.h:130:27: note: previous definition of ‘__inittest’ was here
  static inline initcall_t __inittest(void)  \
                           ^
/home/vasya/gcc/kernel/hello.c:12:1: note: in expansion of macro ‘module_init’
 module_init(test_init);
 ^
/home/vasya/gcc/kernel/hello.c: In function ‘__inittest’:
/home/vasya/gcc/kernel/hello.c:13:13: error: return from incompatible pointer type [-Werror=incompatible-pointer-types]
 module_init(test_exit);
             ^
./include/linux/module.h:131:11: note: in definition of macro ‘module_init’
  { return initfn; }     \
           ^
/home/vasya/gcc/kernel/hello.c: At top level:
./include/linux/module.h:132:6: error: redefinition of ‘init_module’
  int init_module(void) __attribute__((alias(#initfn)));
      ^
/home/vasya/gcc/kernel/hello.c:13:1: note: in expansion of macro ‘module_init’
 module_init(test_exit);
 ^
./include/linux/module.h:132:6: note: previous definition of ‘init_module’ was here
  int init_module(void) __attribute__((alias(#initfn)));
      ^
/home/vasya/gcc/kernel/hello.c:12:1: note: in expansion of macro ‘module_init’
 module_init(test_init);
 ^
cc1: some warnings being treated as errors
scripts/Makefile.build:301: recipe for target '/home/vasya/gcc/kernel/hello.o' failed
make[1]: *** [/home/vasya/gcc/kernel/hello.o] Error 1
Makefile:1524: recipe for target '_module_/home/vasya/gcc/kernel' failed
make: *** [_module_/home/vasya/gcc/kernel] Error 2
make: Leaving directory '/usr/src/linux-headers-4.10.0-28-generic'
В чём может быть проблема?

make -C /usr/src/linux-headers-`uname -r` SUBDIRS=$PWD modules

Попробуй

make -C /usr/src/linux-headers-`uname -r` M=$PWD modules

i-rinat ★★★★★
()
Ответ на: комментарий от xpahos

нужен module_exit

Спасибо, действительно помогло! Но возникла другая проблема: при выполнении sudo insmod ./hello.ko и sudo rmmod ./hello.ko сообщения не выводятся, printk не работает почему-то. Чёт я жёстко туплю)

Gargamel
() автор топика
Ответ на: комментарий от xpahos

для начала добавь макросы __init и __exit.

Зачем? Это имеет смысл только для in-tree модулей.

Deleted
()
Ответ на: комментарий от Gargamel
[140423.893357] testmod: loading out-of-tree module taints kernel.
[140423.903409] Hello!
[140437.720703] End!

Норм всё.

Radjah ★★★★★
()
Ответ на: комментарий от Deleted

Точно, спасибо! Видимо я неправильно что-то понял.

Gargamel
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.