LINUX.ORG.RU

проблема с компиляцией модулей


0

0

Такая проблема: почитываю тут книжку в переводе linux device driver, но

скомпилить примеры не могу, поскольку вылазят такие ошибки:

/usr/include/linux/module.h ESRCH - undeclared identifier в module.h есть print_symbol(const char* ftm, unsigned long address){return -ESRCH;}

если же я делаю makefile c таким содержанием FLAGS=-c -Wall -D _KERNEL_ -DMODULE PARAM=-l/lib/modules/$(shell uname -r)/build/include hello.o: hello.c $(GCC)$(FLAGS)$(PARAM) -o $@$^

то вылазит следующее: c -Wall -D _KERNEL_ -DMODULE-l/lib/modules/$(shell uname -r)/build/include

hello.o hello.c c - команда не найдена make:[hello.o]Ошибка 127(игнорирована) Но это же ключ...! модуль hello.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(&#8220;GPL&#8221;);

Видимо, не определен $GCC (добавь в Makefile строку GCC=gcc).
Еще, __KERNEL__, а не _KERNEL_.
Еще (это мое личное мнение) -D__KERNEL__ и -DMODULE не являются опциональными, поэтому их по смыслу корректнее объявлять в коде:
#define __KERNEL__
#define MODULE

Если ядро 2.5-2.6, то там компиляция происходит не так(желательно, через ядреный Makefile, как минимум нужно включить пути к arch includes).

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

>и gcc вместо GCC

Ты понял, что сам написал?
Еще раз: чтобы воспользоваться переменной, ее нужно определить.

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

такая вот ошибочка: при компиляции модуля /usr/include/linux/module.h:60: parse error before `atomic_t' /usr/include/linux/module.h:60: warning: no semicolon at end of struct or

union /usr/include/linux/module.h:60: warning: no semicolon at end of struct or

union /usr/include/linux/module.h:62: parse error before `}' /usr/include/linux/module.h:62: warning: data definition has no type or

storage class /usr/include/linux/module.h:91: parse error before `}' hello.c: In function `init_module': hello.c:18: warning: implicit declaration of function `printk' make: *** [hello.o] Ошибка 1

//компилил тот же пример , но на redhate7.3...

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

хочешь научиться писать модули ? собери ядро из исходников..трабля в том, что большинство дистрибутивов ставят kernel-includes криво.. итого : берем ядро с kernel.org (какое понравится), распаковываем, ставим ПРАВИЛЬНЫЕ ссылки /usr/include/linux -> /usr/src/linux/include/linux , /usr/include/asm -> /usr/src/linux/asm/<arch>/ (кажется так..) собираем ядро и добиваемся работоспособности всего чего только можно.. сети,звуки,видео etc etc

и вот только тепер-ча можно сидеть учиться писать модули

anonymous
()
Ответ на: комментарий от anonymous

кстати, общепринятая переменная Makefile (а точнее окружения)
- не GCC а СС :-)
есть еще CFLAGS,LD,LDFLAGS..CXX,CXXFLAGS..
то есть 'советчики', видимо только-только из школы..
..
если есть несколько компиляторов, то для выбора конкретного надо установить CC=path_to_compiler 

anonymous
()
Ответ на: комментарий от andruxa_last

Правильный путь у тебя прописан "-I/lib/modules/`uname -r`/build/include.

Но правильным он становится после установки исходников.

В /usr/include, как уже верно сказали, обычно туфта.

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