The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Модуль ядра. Функция printk."
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Модуль ядра. Функция printk."
Сообщение от Morozov emailИскать по авторуВ закладки on 08-Окт-03, 14:58  (MSK)
Пытался я откомпилировать пример из книги Ори Померанца "Ядро Linux. Програмирование модулей." Пример самый простой - hello.c.
Использовал ASPLinux, GCC.
Но, что-то сразу не пошло.
В пример пришлось добавить несколько строк что бы он откомпилировался.
Я делал так.

//hello.c
#define __KERNEL__ //добавил я
#define MODULE     //добавил я
#define LINUX      //добавил я

#include <linux/kernel.h>
#include <asm/atomic.h>//добавил я для atomic_t

#define MODVERSIONS    //добавил я

#include <linux/module.h>

#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#ifdef

int init_module()
{
    printk("Hello, world!!!\n");
    return 0;
}

void cleanup_module
{
    printk("Goodbye!!!\n");
}

Затем
gcc -c hello.c
insmod hello.o

Получаю следующие:
hello.o: unresolved symbol printk
hello.o:
Hint: You are trying to load a module without a GPL compatible license and it has unresolved symbols. The module may be trying to access GPL ONLY ymbols but the problem is more likely to be a coding or user error. Contact the module supplier for assistance, only they can help you.

Если убираю printk, то результат такой.

Warning: loading hello.o will taint the kerne: no license
и т.д.

Как это перевести я знаю.
А вот что с этим делать? Как заставить работать printk?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Модуль ядра. Функция printk."
Сообщение от aXeL emailИскать по авторуВ закладки on 09-Окт-03, 14:13  (MSK)
>//hello.c
>#define __KERNEL__ //добавил я
>#define MODULE     //добавил я
>#define LINUX      //добавил я


А ты не пробовал откомпилировать так как сказано в Померанце?
там же приведён пример makefile :)
Лично у меня всё работало нормально

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Модуль ядра. Функция printk."
Сообщение от Morozov emailИскать по авторуВ закладки on 10-Окт-03, 12:25  (MSK)
>>//hello.c
>>#define __KERNEL__ //добавил я
>>#define MODULE     //добавил я
>>#define LINUX      //добавил я
>
>
>А ты не пробовал откомпилировать так как сказано в Померанце?
>там же приведён пример makefile :)
>Лично у меня всё работало нормально

C #define ...  всё понятно.
Но вот когда я пытался сделать всё так как у Памеранца (скопировал с книжки и hello.c и Makefile) компилятор начал ругаться на 60 или 62 строку в module.h. Как я понял ему не нравилось отсутствие объявления atomic_t. Вот я и добавил файл asm/atomic.h.

У меня дистрибутив ASP Linux 7.3 Deluxe Edition.

Можешь что-нибудь по проблеме предложить (unresolved symbol printk)?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Модуль ядра. Функция printk."
Сообщение от Murr Искать по авторуВ закладки on 09-Окт-03, 18:44  (MSK)
gcc -c -I/lib/modules/`uname -r`/build/include ...
  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Модуль ядра. Функция printk."
Сообщение от Morozov emailИскать по авторуВ закладки on 10-Окт-03, 12:12  (MSK)
>gcc -c -I/lib/modules/`uname -r`/build/include ...

Спасибо за попытку помочь, но результат тот же.
hello.o: unresolved symbol printk
hello.o:
Hint: You are trying to load a module without a GPL ....

К стате не мог бы ты пояснить почему надо компилировать так как ты предлагаешь?
А так же может будут ещё какие предложения по повуду unresolved symbol printk.  

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Модуль ядра. Функция printk."
Сообщение от dmitry emailИскать по авторуВ закладки on 10-Окт-03, 13:43  (MSK)
>>gcc -c -I/lib/modules/`uname -r`/build/include ...
>
>Спасибо за попытку помочь, но результат тот же.
>hello.o: unresolved symbol printk
>hello.o:
>Hint: You are trying to load a module without a GPL ....

чтобы не было подобного я обчно делаю:

#ifdef MODULE_LICENSE
MODULE_LICENSE("GPL");
#endif
#ifdef MODULE_AUTHOR
MODULE_AUTHOR("(C) by ... Inc., 2003");
#endif
#ifdef MODULE_DESCRIPTION
MODULE_DESCRIPTION("... driver");
#endif

(ifdef чтобы компилилось на 2.2.X ветке)

не те ты книжки читаешь. Поищи че-нить посвежее и поумнее.
Или смотри, как сделан
/usr/src/linux/drivers/bluetooth/hci_vhci.c


WBR, Dvorkin

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Модуль ядра. Функция printk."
Сообщение от Murr Искать по авторуВ закладки on 10-Окт-03, 15:04  (MSK)
>>gcc -c -I/lib/modules/`uname -r`/build/include ...
>
>Спасибо за попытку помочь, но результат тот же.
>hello.o: unresolved symbol printk
>hello.o:
>Hint: You are trying to load a module without a GPL ....
>
Странно...

>
>К стате не мог бы ты пояснить почему надо компилировать так как
>ты предлагаешь?
Чтобы версии модуля согласовались с версией ядра.

>А так же может будут ещё какие предложения по повуду unresolved symbol
>printk.
Что тебе пишет grep printk /proc/ksyms ?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Модуль ядра. Функция printk."
Сообщение от Morozov emailИскать по авторуВ закладки on 10-Окт-03, 16:12  (MSK)
>Что тебе пишет grep printk /proc/ksyms ?

Пишет:
c0117dc0 printk_R1b7d4074
c036afc8 tux_Dprintk_Ra12c9a12
c036afc4 tux_TDprintk_Rc0ce7778
Только я из этого ни чего не понимаю.
Что дальше делать?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "Модуль ядра. Функция printk."
Сообщение от Dvorkin emailИскать по авторуВ закладки on 11-Окт-03, 12:12  (MSK)
>>Что тебе пишет grep printk /proc/ksyms ?
>
>Пишет:
>c0117dc0 printk_R1b7d4074
>c036afc8 tux_Dprintk_Ra12c9a12
>c036afc4 tux_TDprintk_Rc0ce7778
>Только я из этого ни чего не понимаю.
>Что дальше делать?

это всего-лишь означает что у тебя в ядре MODVERSIONS support включен
Modversions - вещь важная

вот тебе шаблоны:

Makefile.in:
[dvorkin@linuxoid module_src]$ cat ./Makefile.in
CC=@CC@
KERNEL_NAME=@KERNEL_NAME@
KERNEL_VER=@KERNEL_VER@
KERNEL_PATH=@KERNEL_PATH@

KERNEL_MODULES := /lib/modules/$(KERNEL_VER)/build
#KERNEL_DIR := /usr/src/$(KERNEL_PATH)/

CFLAGS = -Wall -O2
MODFLAGS = -D__KERNEL__ -DLINUX -DMODULE -DEXPORT_SYMTAB -I$(KERNEL_MODULES)/include/

#include $(KERNEL_DIR)/.config

all: vspm.o

vspm.o: vspm.c
        $(CC) $(CFLAGS) $(MODFLAGS) -c vspm.c -o ../vspm.o

clean:
        rm -f *.o *~ core

vspm.o: vspm.h config.h Makefile

module header:
/* Deal with CONFIG_MODVERSIONS */
#include <linux/config.h>   /* some internal definitions */
#if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS)
#define MODVERSIONS
#endif
#ifdef MODVERSIONS
#include <linux/modversions.h>
#endif

#include <linux/kernel.h>   /* We're doing kernel work */
#include <linux/module.h>   /* Specifically, a module */
#ifdef CONFIG_SMP
#define __SMP__
#endif
........

WBR, Dvorkin

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Модуль ядра. Функция printk."
Сообщение от Murr Искать по авторуВ закладки on 10-Окт-03, 15:09  (MSK)
И на кой ляд тебе MODVERSIONS, тем более так криво определенные?
Убей всю эту ересь, связанную с MODVERSIONS...
  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Модуль ядра. Функция printk."
Сообщение от Murr Искать по авторуВ закладки on 11-Окт-03, 11:53  (MSK)
[root@win2k murr]# cat test.c
#define __KERNEL__ //добавил я
#define MODULE     //добавил я
#define LINUX      //добавил я

#include <linux/kernel.h>
#include <asm/atomic.h>//добавил я для atomic_t

#define MODVERSIONS    //добавил я

#include <linux/module.h>

#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif

int init_module()
{
    printk("Hello, world!!!\n");
    return 0;
}

void cleanup_module()
{
    printk("Goodbye!!!\n");
}
[root@win2k murr]# gcc -c -I/lib/modules/`uname -r`/build/include
gcc: no input files
[root@win2k murr]# gcc -c -I/lib/modules/`uname -r`/build/include test.c
[root@win2k murr]# /sbin/insmod ./test.o
Warning: loading ./test.o will taint the kernel: no license
  See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Module test loaded, with warnings
[root@win2k murr]#


Работает как на ядре с версиями, так и без ...

  Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "Модуль ядра. Функция printk."
Сообщение от Morozov emailИскать по авторуВ закладки on 14-Окт-03, 14:10  (MSK)
Спасибо всем за помощь.
В результате у меня для моего ASPLinux 7.3 получился следующий рабочий вариант.

hello.c:

#include <asm/atomic.h>
#include <linux/kernel.h>
#include <linux/module.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("(C) by  ... Inc, 2003");
MODULE_DESCRIPTION("Hello module.");

int init_module()    { printk("Hello modele instaled.\n");   return (0); }
void cleanup_module(){ printk("Hello module uninstalled.\n"); return;    }

Makefile:

CC=gcc
MODFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux-2.4/include/
hello.o : hello.c /usr/src/linux-2.4/include/linux/version.h
$(CC) $(MODFLAGS) -c hello.c

Ещё раз всем спасибо за помощь.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "Модуль ядра. Функция printk."
Сообщение от ushik emailИскать по авторуВ закладки on 25-Фев-04, 16:36  (MSK)
в общем модуль порочился потому, чтов  него не вставлена GPL лицензия: кажется MODULE_LICENSE(GPL)  надо написать или что то подобное. Но даже без лицензии модуль вставляется в ядро(ну разве чтьо ядро ругается).
При компилированнии этого примера из померантца тоже трабы были( у меня RH 7.3, ядро 2.4.18-3) изменял version.h - там почему то было 2.9.9
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру