2012-04-12 25 views
12

Ho scritto un semplice modulo:errore di compilazione: linux/module.h: Nessun file o directory

#define __KERNEL__ 
#define MODULE 
#include <linux/kernel.h> 
#include <linux/module.h> 

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

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

e compilarlo con questo comando:

cc -c hello.c 

ma sono ottenendo questo errore:

linux/module.h: No such file or directory 

qualche suggerimento?

EDIT: ho usato questo commad:

cc -I/usr/src/linux-headers-3.0.0-17-generic/include -c hello.c 

e va un passo avanti, ora ottengo questo errore:

In file included from /usr/src/linux-headers-3.0.0-17-generic/include/linux/kernel.h:13:0, 
       from hello.c:3: 
/usr/src/linux-headers-3.0.0-17-generic/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory 
compilation terminated. 
+0

intestazione kernel yes..I've installato –

risposta

8

Per prima cosa è necessario il kernel sources. Molti confondono le intestazioni dello spazio utente e le intestazioni dello spazio del kernel perché molte di esse hanno la stessa struttura di cartelle. La maggior parte delle distro ha solo le intestazioni dello spazio utente e non quelle dello spazio del kernel.

E generalmentemake viene utilizzato per costruire un modulo del kernel e non una nuda cc. Seguire il semplice passo dopo spiegato il modulo del kernel Hello World dato here

+0

grazie mille ... Ho creato il file make e ha funzionato. Grazie ancora –

+0

Il benvenuto :) –

+0

@PavanManjunath Ho creato un makefile proprio come mostrato nel tutorial, ma sto ottenendo questo messaggio: niente da fare per "tutto". Sto usando Ubuntu e ho installato linux-header. – user606669

3

È necessario gli header del kernel; di solito sono in /usr/include/ se installato.

A meno che non si stia utilizzando una distribuzione basata su sorgente o non si siano sviluppate proprie probabilità del kernel, non sono installate di default; utilizzare il gestore pacchetti della distro per installarli. Il pacchetto viene spesso chiamato linux-headers.

+0

No, ha bisogno dei kernel header interni, non quelli esportati in spazio utente. –

+0

ho bisogno di installare le intestazioni del kernel? Ho avuto la directory/usr/include/module.h non è presente in esso –

+1

Sì, devi. – ThiefMaster

2

La maggior parte delle distribuzioni Linux non installa le intestazioni del kernel come default. Cerca un header del kernel del pacchetto o qualcosa di simile.

3

È necessario l'ambiente di compilazione del kernel (selezione di script, intestazione e Makefile) in genere questo è raggiungibile tramite/lib/modules/versione/build (un collegamento simbolico ad esso) se un kernel è già stato installato. Altrimenti, la directory è la directory di build (quella in cui si trova System.map). Le fonti complete sono non necessarie (le distro intelligenti lo riconoscono) e nessuno dei due è/usr/include/qualunque.

È inoltre deve utilizzare kbuild; chiamare cc -I non è sufficiente, e non è stato per più di 10 anni. Si inizia con un file Kbuild:

obj-m += mymodule.o 

e un Makefile:

kdir=/lib/modules/$(shell uname -r)/build 
all: 
     make -C ${kdir} M=$$PWD 
modules_install clean: 
     make -C ${kdir} M=$$PWD [email protected] 

e quindi utilizzare make.

#definendo __KERNEL__ e MODULE è anche inutile, perché è già impostato da kbuild se necessario.

+0

grazie mille ... Ho usato il file make nel tutorial indicato da @Pavan Manjunath e ha funzionato –

4

Il nome del file di origine è di base.c

#include <linux/init.h> 
#include <linux/module.h> 
/*MODULE_LICENSE("Dual BSD/GPL");*/ 
static int hello_init(void) 
{ 
    printk(KERN_ALERT "Hello, world\n"); 
    return 0; 
} 
static void hello_exit(void) 
{ 
    printk(KERN_ALERT "Goodbye, cruel world\n"); 
} 
module_init(hello_init); 
module_exit(hello_exit); 

=====================================

ora rendere il file per Ubuntu

al primo tipo sul terminale ur che $ (uname -r) poi u otterrà la versione .. che utilizza il sistema ur

obj-m +=basic.o 

KDIR =//usr/src/linux-headers-3.13.0-44-generic 

all: 
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 
clean: 
rm -rf *.o *.ko *.mod.* *.symvers *.order 

======= =========================================

per eseguire il codice

$sudo insmod basic.ko 
$dmesg 
u will get the output 
$sudo rmmod basic.ko 
$dmesg 
Problemi correlati