Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: prezek 07. 01. 2013, 11:48:28
-
Zdravím, snažím se vytvořit kernel modul a při jeho načítání skončím na tomto:
my_module: Unknown symbol irq_desc
Ve zdrojovém kódu modulu se to způsobují tyto řádky:
extern struct irq_desc irq_desc[NR_IRQS];
static inline struct irq_desc *irq_to_desc(unsigned int irq)
{
return (irq < nr_irqs) ? irq_desc + irq : NULL;
}
...
struct irq_desc *desc;
desc = irq_to_desc(IRQ_TC0);
Odhadoval bych, že to bude tím, že nemám přesně stejné zdrojové kódy jádra, jako ty, ze kterých je jádro zkompilováno. Dá se nějak zjistit z běžícího linuxu, jaké funkce, konstanty, proměnné atd. jsou dostupné pro kernel moduly?
-
Jestli se to dá získat runtime fakt netuším, ale - jak jsi získal ty kernelové hlavičky, co máš? Většina distribucí by měla mít balíček jako "linux-headers", který obsahuje právě hlavičkové soubory pro buildování modulů a ten musí* souhlasit s tím, co máš v systému puštěné.
* pokud není v distru rozbitý updatovač a/nebo si neděláš jen selektivní update.
-
Jedná se o embedded linux a pokud vím, tak nemá žádné repozitáře, ze kterých by se "linux-headers" dalo získat. Hlavičky jsem získal ze stránek výrobce CPU, ale nejsou shodné s tím, co je v zařízení nahráno. Na některé věci to stačí, ale bohužel ne na vše.
-
Aktualni funkce (tj. symboly) jsou uvedeny v System.map souboru, ale pokud je to embedded, je mozna tento soubor smazan.
Takze pak nastupuje: objdump -t vmlinux (pokud nemas vmlinux, musis ho z kernelu vypreparovat - odstranit loader/sfx kod a rozbalit vlastni jadro rucne). Bud na to pojedes pres bruteforce (odstranis 1 byte ze zacatku a zkusis to rozbalit, kdyz nepujde tak dalsi byte...), nebo si najdes typ komprese a prislusnou hlavicku (treba bzipu) a takto oddelis komprimovane jadro.
-
Díky za odpověď. System.map ani vmlinux nemám k dispozici. Zkoušel jsem zkombinovat soubor firmwaru (linux.rom) se souborem vmlinux z jiné kompilace jádra (stejná verze jádry, stejný procesor, ale jiná konfigurace a možná jiný patch). Linux.rom vypadá, že je ořezaný vmlinux. Z výsledku se ale nedalo nic použitelného vyčíst.
-
Z toho linux.rom je treba vyextrahovat vmlinuz a pak rozbalit na vmlinux :)