Portál AbcLinuxu, 10. května 2025 08:22

Dotaz: Exportovane symboly

8.11.2007 16:40 jindol | skóre: 2
Exportovane symboly
Přečteno: 282×
Odpovědět | Admin
Ahoj,
chtel jsem se zeptat jak se pouzivaji exportovane jaderne symboly.
Pr: mam zavedeny vlastni jednoduchy modul ktery exportuje jednu funkci. Nic vic nedela. V /proc/kallsyms je ta funkce videt. Chtel bych ji ale pouzit v jinem modulu a nevim jak.
Pri kompilaci se vypise:
WARNING: "funkce" [/home/..../mymodule.ko] undefined!
Mohl by mi nekdo poradit?
Diky
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Josef Kufner avatar 8.11.2007 21:23 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Exportovane symboly
Odpovědět | | Sbalit | Link | Blokovat | Admin
Undefined? Definuj!

Hint: Hlavičkové soubory.
Hello world ! Segmentation fault (core dumped)
8.11.2007 22:10 jindol | skóre: 2
Rozbalit Rozbalit vše Re: Exportovane symboly
Tak jinak. Mam modul: mymodule.c:
void funkce(void)
{
    return;
}
static int __init my_init_module(void)
{
   printk(KERN_INFO "Hello world.\n");
   return 0;
}
static void __exit my_cleanup_module(void)
{
        printk(KERN_INFO "Goodbye world.\n");
}
module_init(my_init_module);
module_exit(my_cleanup_module);

Funkce funkce() je exportovana do jadra. Jak ji lze pouzit v jinem modulu?
Dik.
Josef Kufner avatar 8.11.2007 22:27 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Exportovane symboly
Překladač ti jen říká, že ji nezná. Načtenímodulu do jádra je prakticky totéž jako přilinkování, takže si napiš hlavičkový soubor s prototypem téhle funkce a includni ho do toho druhého modulu.
Hello world ! Segmentation fault (core dumped)
8.11.2007 22:36 jindol | skóre: 2
Rozbalit Rozbalit vše Re: Exportovane symboly
No ja bych rad, ale ono to prave nejde:/. Pokud napisu hlavicku:
mymodule.h:
...
void funkce(void);

a tento soubor pak inkludnu do druheho modulu, tak mi pise prekladac tu stejnou chybu.

#include "mymodule.h"

int init_module(void)
{
   printk(KERN_ALERT "Hello mymodul2.\n");
   funkce();
   return 0;
}

void cleanup_module(void)
{
        printk(KERN_ALERT "Goodbye world 2.\n");
}


8.11.2007 23:33 petris
Rozbalit Rozbalit vše Re: Exportovane symboly
To neni chyba ale varovani ;-) ono to totiz zna jenom funkce, ktere exportuje jadro "samo od sebe", takze byste si musel zjistit, kde si je to pri prekladu bere a doplnit tam tu Vasi.

Ja byl linej to resit, tak to proste ignoruju - jak rikam, je to jen varovani :-)
Josef Kufner avatar 9.11.2007 16:26 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Exportovane symboly
Tak mě tak napadá, nebude to mít něco společného se závislotmi modulů?
Hello world ! Segmentation fault (core dumped)
9.11.2007 17:57 jindol | skóre: 2
Rozbalit Rozbalit vše Re: Exportovane symboly
Jasny - modul2 je zavisly na tom prvnim. Ale pri kompilaci by na tom, myslim, nemelo zalezet. Zjitil jsem, ze je potreba uvest explicitne EXPORT_SYMBOL(funkce) v prvnim modulu. To pak kompilace probehne bez WARNINGu, ale zato kdyz insmodnu prvni, tak pak po insertu 2. nastane Segmentation fault a moduly nejdou odstranit ani s rmmmod -f. Evidentne se spatne prilinkuje, ale netusim proc.
9.11.2007 18:14 petris
Rozbalit Rozbalit vše Re: Exportovane symboly
Pri prekladu na tom nezalezi, funkce musi byt znama az pri nacteni modulu. Pokud Vam to pada, tak doporucuju kouknout se debuggerem kde.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.