Не могу исправить ошибку (C; kernel module)

Модератор: Модераторы разделов

Аватара пользователя
kernel_mode
Сообщения: 347
Статус: infinity++
ОС: Gentoo(desktop)/Arch(laptop)

Не могу исправить ошибку

Сообщение kernel_mode »

Вот решил занаться созданием модуля для ядра, начал с простого:

Код: Выделить всё

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

#define MODULE_AUTOR "kernel_mode"
#define MODULE_DESC "sample kernel module"

static int __init init_module(void)
{
        printk(KERN_ALERT "hello");
        return 0;
}

static void __exit cleanup_module(void)
{
        printk(KERN_ALERT "Goodbye!");
}

MODULE_LICENSE("GPL");
MODULE_AUTOR(MODULE_AUTOR);
MODULE_DESCRIPTION(MODULE_DESC);

Вывод make:

Код: Выделить всё

[root@myhost Modules]# make -C /usr/src/linux-`uname -r` SUBDIRS=$PWD modules
make: Entering directory `/usr/src/linux-2.6.18-ARCH'
  CC [M]  /home/kernel_mode/Projecs/Modules/hello-2.o
/home/kernel_mode/Projecs/Modules/hello-2.c:11: error: static declaration of 'init_module' follows non-static declaration
include/linux/module.h:65: error: previous declaration of 'init_module' was here
/home/kernel_mode/Projecs/Modules/hello-2.c:17: error: static declaration of 'cleanup_module' follows non-static declaration
include/linux/module.h:66: error: previous declaration of 'cleanup_module' was here
/home/kernel_mode/Projecs/Modules/hello-2.c:22: error: expected identifier or '(' before string constant
make[1]: *** [/home/kernel_mode/Projecs/Modules/hello-2.o] Ошибка 1
make: *** [_module_/home/kernel_mode/Projecs/Modules] Ошибка 2
make: Leaving directory `/usr/src/linux-2.6.18-ARCH'
[root@myhost Modules]#

Что-то я никак понять не могу в чём ошибся...
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: Не могу исправить ошибку

Сообщение Alxn1 »

Может быть, что данные функции не должны быть статическими? Похоже, что на это ругается GCC.
Спасибо сказали:
Аватара пользователя
makss
Сообщения: 226
ОС: Win+ Lin

Re: Не могу исправить ошибку

Сообщение makss »

//файл hello_knz.c
#include <linux/kernel.h>
#include <linux/module.h>
int init_module(void)
{
printk("<1>Hello, world\n");

return 0;
};


void cleanup_module(void)
{
printk("<1>Good bye cruel world\n");
}

MODULE_LICENSE(“GPL”);

==================================================

Для компиляции такого модуля можно использовать следующий Makefile. Не забудьте поставить символ табуляции перед строкой, начинающейся с $(CC) ... .

==================================================
FLAGS = -c -Wall -D__KERNEL__ -DMODULE
PARAM = -I/lib/modules/$(shell uname -r)/build/include

hello_knz.o: hello_knz.c
$(CC) $(FLAGS) $(PARAM) -o $@ $^


это из книжки
не воспринимайте Linux c позиции Windows, учитесь использовать командную строку
Спасибо сказали:
Аватара пользователя
kernel_mode
Сообщения: 347
Статус: infinity++
ОС: Gentoo(desktop)/Arch(laptop)

Re: Не могу исправить ошибку

Сообщение kernel_mode »

makss писал(а):
06.12.2006 00:34
//файл hello_knz.c
#include <linux/kernel.h>
#include <linux/module.h>
int init_module(void)
{
printk("<1>Hello, world\n");

return 0;
};


void cleanup_module(void)
{
printk("<1>Good bye cruel world\n");
}

MODULE_LICENSE("GPL");

==================================================

Для компиляции такого модуля можно использовать следующий Makefile. Не забудьте поставить символ табуляции перед строкой, начинающейся с $(CC) ... .

==================================================
FLAGS = -c -Wall -D__KERNEL__ -DMODULE
PARAM = -I/lib/modules/$(shell uname -r)/build/include

hello_knz.o: hello_knz.c
$(CC) $(FLAGS) $(PARAM) -o $@ $^


это из книжки

А в The Linux Module Programming gude было написано протото сделать такой Makefile:
obj-m += hello-2.o :)
И такой make: make -C /usr/src/linux-`uname -r` SUBDIRS=$PWD modules
Наверное Makefile нправильно написал, днём проверю.
=====
Всё исправил. Нужно было static убрать. (а компилируется и с вышеописанным Makefile'ом)
Спасибо сказали:
Аватара пользователя
makss
Сообщения: 226
ОС: Win+ Lin

Re: Не могу исправить ошибку

Сообщение makss »

Всё исправил. Нужно было static убрать. (а компилируется и с вышеописанным Makefile'ом)

в ядре 2.6 можно и с таким makefile
obj-m += hello-2.o
более ранние версии требуют другой подход ;)
не воспринимайте Linux c позиции Windows, учитесь использовать командную строку
Спасибо сказали:
Аватара пользователя
kernel_mode
Сообщения: 347
Статус: infinity++
ОС: Gentoo(desktop)/Arch(laptop)

Re: Не могу исправить ошибку

Сообщение kernel_mode »

makss писал(а):
06.12.2006 12:49
Всё исправил. Нужно было static убрать. (а компилируется и с вышеописанным Makefile'ом)

в ядре 2.6 можно и с таким makefile
obj-m += hello-2.o
более ранние версии требуют другой подход ;)

Извиняюсь, не знал :)
(да и я пока не драйвера "Hello World All-In-One Driver" для всех ядер начиная с 2.2 пишу ^_^ , а вообще спаибо, пригодится)
Спасибо сказали: