2012-02-29 9 views
8

Ho due moduli del kernel (ad esempio modA e modB). modA esporta un simbolo con EXPORT_SYMBOL(symA) e modB lo utilizza. Ho l'intestazione modA.h per modA:Avviso creazione di un modulo del kernel che utilizza i simboli esportati

... 
extern void symA(int param); 
... 

e in modB.c:

#include "modA.h" 
... 
static int __init modB_init(void) 
{ 
    symA(10); 
} 
... 

Se i insmod MODB tutto funziona bene, il mio MODB sia correttamente collegato nel kernel e la funzione symA si chiama correttamente. Tuttavia quando costruisco modB il compilatore solleva un avviso: symA is undefined. Un LKM è un relocabile ELF, quindi perché il compilatore solleva questo avviso? Come può essere rimosso?

risposta

12

Questo problema (e come compilare correttamente in questo caso) è spiegato in http://www.kernel.org/doc/Documentation/kbuild/modules.txt

volte, un modulo esterno utilizza esportato simboli da un altro modulo esterno . kbuild deve avere una conoscenza completa di tutti i simboli per evitare di sputare avvertimenti su simboli non definiti. Esistono tre soluzioni per questa situazione.

NOTA: il metodo con un file di livello superiore di kbuild è consigliato ma potrebbe non essere possibile eseguire in determinate situazioni.

Utilizzare un file kbuild di livello superiore Se si dispone di due moduli, foo.ko e bar.ko, dove foo.ko ha bisogno di simboli da bar.ko, è possibile utilizzare un file kbuild comune di livello superiore, in modo sia i moduli sono compilati nello stesso build . Si consideri il seguente layout di directory:

./foo/ <= contains foo.ko  ./bar/ <= contains bar.ko 

    The top-level kbuild file would then look like: 

    #./Kbuild (or ./Makefile):   obj-y := foo/ bar/ 

    And executing 

     $ make -C $KDIR M=$PWD 

    will then do the expected and compile both modules with   full 

conoscenza dei simboli da entrambi i moduli.

utilizzare un file Module.symvers extra quando un modulo esterno è costruito, un file Module.symvers viene generato contenente tutti i simboli esportati non definiti nel kernel. Per accedere ai simboli da bar.ko, copiare il file Module.symvers dalla compilation di bar.ko nella directory in cui è stato creato foo.ko. Durante la creazione del modulo, kbuild leggerà il file Module.symvers nella directory del modulo esterno e al termine della compilazione, viene creato un nuovo file Module.symvers contenente la somma di tutti i simboli definiti e non inclusi del kernel.

Usa "fare" KBUILD_EXTRA_SYMBOLS variabili Se non è pratico di Module.symvers copia da un altro modulo, è possibile assegnare uno spazio elenco separato dei file da KBUILD_EXTRA_SYMBOLS nel file build. Questi file verranno caricati da modpost durante l'inizializzazione di le sue tabelle dei simboli.

+0

Grande! Ho perso questo. Grazie Gossamer! – MirkoBanchi

Problemi correlati