ubuntuusers.de

Module kompilieren

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

tretboot

Anmeldungsdatum:
29. Januar 2006

Beiträge: Zähle...

ch wollte nur mal testen, ein modul zu kompilieren, wie es in meinem buch abgetippt ist:

#include <linux/module.h>

#if defined(CONFIG_SMP)
#define __SMP__
#endif

#if defined(CONFIG_MODVERSIONS)
#define MODVERSIONS
#include <linux/modversions.h>
#endif

#include <linux/kernel.h>

int init_module(void)
{
printk(KERN_DEBUG "Hallo Kernel!\n");
return 0;
}

void cleanup_module(void)
{
printk(KERN_DEBUG "Kernel ade!\n");
}

kompiliert mit dem befehl:
gcc -D__KERNEL__ -I/usr/src/linux/include -DMODULE -Wall -O2 -c main.c -o main.o kommen folgende fehlermeldungen:

flo@buenaventura:~/schule/apr/cpp/module/halloworld$ gcc -D__KERNEL__ -I/usr/src/linux/include -DMODULE -Wall -O2 -c main.c -o main.o
main.c:1:1: Warnung: »MODULE« redefiniert
<Kommandozeile>:1:1: Warnung: dies ist die Stelle der vorherigen Definition
In Datei, eingefügt von /usr/include/linux/sched.h:16,
von /usr/include/linux/module.h:9,
von main.c:4:
/usr/include/linux/signal.h:2:2: Warnung: #warning "You should include <signal.h>. This time I will do it for you."
In file included from /usr/include/linux/resource.h:4,
from /usr/include/linux/sched.h:79,
from /usr/include/linux/module.h:9,
from main.c:4:
/usr/include/linux/time.h:9: Fehler: Redefinition von »struct timespec«
/usr/include/linux/time.h:15: Fehler: Redefinition von »struct timeval«
/usr/include/linux/time.h:20: Fehler: Redefinition von »struct timezone«
/usr/include/linux/time.h:47: Fehler: Redefinition von »struct itimerval«
In file included from main.c:4:
/usr/include/linux/module.h:41: Fehler: Feld »attr« hat unvollständigen Typen
/usr/include/linux/module.h:49: Fehler: Feld »kobj« hat unvollständigen Typen
main.c: In Funktion »init_module«:
main.c:8: Warnung: implizite Deklaration der Funktion »printk«
main.c: Auf höchster Ebene:
main.c:13: Warnung: Rückgabetyp ist auf »int« voreingestellt
main.c:13: Warnung: in Konflikt stehende Typen für »cleanup_module«
/usr/include/linux/module.h:55: Warnung: vorherige Deklaration von »cleanup_module« war hier
flo@buenaventura:~/schule/apr/cpp/module/halloworld$

ich versteh nicht, wie der code im buch (Linux Programmierung) richtig sein kann, und bei mir nur fehlerhaft kompiliert werden kann.

bitte um hilfe

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

a) Behandelt Dein Buch den 2.6-Kernel, oder vielleicht einen 2.4er?
b) Hast Du ein Verzeichnis /usr/src/linux/include?

tretboot

(Themenstarter)

Anmeldungsdatum:
29. Januar 2006

Beiträge: 3

danke Dir erstmal.

das buch meint, sämtliche kernelversionen zu behandeln.

aber das verzeichnis fehlt mir tatsächlich, welche bibliotheken fehlen mir?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Und von wann ist das Buch?

Vielleicht hast Du schon ein ähnliches Verzeichnis /usr/src/linux*?
Ansonsten heißt das Paket glaube ich linux-kernel-headers.

tretboot

(Themenstarter)

Anmeldungsdatum:
29. Januar 2006

Beiträge: 3

mein buch ist von der neuesten auflage, die 2005 erschienen ist.
am buch wirds aber eher nicht liegen, da ich beispiele aus dem internet ( http://www.oreilly.de/german/freebooks/linuxdrive2ger/building.html ) probiert habe.

ich hab den befehl

gcc -D__KERNEL__ -I/usr/src/linux/include -DMODULE -Wall -O2 -c main.c -o main.o

auf
gcc -D__KERNEL__ -I/usr/include/linux -DMODULE -Wall -O2 -c main.c -o main.o

geändert, fehler kommen dann andere:

In file included from /usr/include/sys/types.h:133,
from /usr/include/linux/types.h:4,
from /usr/include/linux/capability.h:16,
from /usr/include/linux/sched.h:6,
from /usr/include/linux/module.h:9,
from main.c:1:
/usr/include/linux/time.h:10: Fehler: syntax error before »time_t«
/usr/include/linux/time.h:12: Fehler: syntax error before »}« token
/usr/include/linux/time.h:16: Fehler: syntax error before »time_t«
/usr/include/linux/time.h:43: Fehler: Feld »it_interval« hat unvollständigen Typen
/usr/include/linux/time.h:44: Fehler: Feld »it_value« hat unvollständigen Typen
/usr/include/linux/time.h:48: Fehler: Feld »it_interval« hat unvollständigen Typen
/usr/include/linux/time.h:49: Fehler: Feld »it_value« hat unvollständigen Typen
In file included from /usr/include/sys/select.h:46,
from /usr/include/sys/types.h:216,
from /usr/include/linux/types.h:4,
from /usr/include/linux/capability.h:16,
from /usr/include/linux/sched.h:6,
from /usr/include/linux/module.h:9,
from main.c:1:
/usr/include/bits/time.h:70: Fehler: Verschachtelte Redefinition von »struct timeval«
In file included from /usr/include/sys/types.h:266,
from /usr/include/linux/types.h:4,
from /usr/include/linux/capability.h:16,
from /usr/include/linux/sched.h:6,
from /usr/include/linux/module.h:9,
from main.c:1:
/usr/include/bits/pthreadtypes.h:50: Fehler: syntax error before »size_t«
/usr/include/bits/pthreadtypes.h:53: Fehler: syntax error before »__stacksize«
In Datei, eingefügt von /usr/include/linux/sched.h:16,
von /usr/include/linux/module.h:9,
von main.c:1:
/usr/include/linux/signal.h:2:2: Warnung: #warning "You should include <signal.h>. This time I will do it for you."
In Datei, eingefügt von /usr/include/linux/signal.h:4,
von /usr/include/linux/sched.h:16,
von /usr/include/linux/module.h:9,
von main.c:1:

anschließend würde er die letzten 5 zeilen unendlich mal wiederholen...

also habe ich versucht, "-I [path]" wegzulassen, sprich:

gcc -D__KERNEL__ -DMODULE -Wall -O2 -c main.c -o main.o

mit wieder anderen fehlern:

In Datei, eingefügt von /usr/include/linux/sched.h:16,
von /usr/include/linux/module.h:9,
von main.c:1:
/usr/include/linux/signal.h:2:2: Warnung: #warning "You should include <signal.h>. This time I will do it for you."
In file included from /usr/include/linux/resource.h:4,
from /usr/include/linux/sched.h:79,
from /usr/include/linux/module.h:9,
from main.c:1:
/usr/include/linux/time.h:9: Fehler: Redefinition von »struct timespec«
/usr/include/linux/time.h:15: Fehler: Redefinition von »struct timeval«
/usr/include/linux/time.h:20: Fehler: Redefinition von »struct timezone«
/usr/include/linux/time.h:47: Fehler: Redefinition von »struct itimerval«
In file included from main.c:1:
/usr/include/linux/module.h:41: Fehler: Feld »attr« hat unvollständigen Typen
/usr/include/linux/module.h:49: Fehler: Feld »kobj« hat unvollständigen Typen
main.c: In Funktion »init_module«:
main.c:16: Warnung: implizite Deklaration der Funktion »printk«
main.c:16: Fehler: »KERN_DEBUG« nicht deklariert (erste Benutzung in dieser Funktion)
main.c:16: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt
main.c:16: Fehler: für jede Funktion in der er auftritt.)
main.c:16: Fehler: syntax error before string constant
main.c: In Funktion »cleanup_module«:
main.c:22: Fehler: »KERN_DEBUG« nicht deklariert (erste Benutzung in dieser Funktion)
main.c:22: Fehler: syntax error before string constant

hoffe, diese meldungen helfen weiter..

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Mit wildem rumprobieren ist man bei gcc an der falschen Adresse.

-I/usr/src/linux anzugeben ist überflüssig, denn die Fehlermeldungen zeigen Dir ja, daß er da ohnehin schon fleißig gesucht hat:

In Datei, eingefügt von /usr/include/linux/sched.h:16,
von /usr/include/linux/module.h:9,
von main.c:4:

Der Link den Du angegeben hast führt hierhin:

Für ungeduldige Leser enthält der folgende Code ein vollständiges “Hallo Welt”-Modul (das nichts Besonderes macht). Dieser Code läßt sich unter den Kernel-Versionen 2.0 bis 2.4 übersetzen

Von 2.4. zu 2.6 hat sich das Moduldesign grundlegend geändert - entweder, Du installierst Dir ein altes Linux, das zu dem Openbook paßt, oder Du verwendest Beispiele, die für den 2.6er Kernel gedacht sind.

fober

Anmeldungsdatum:
1. Februar 2006

Beiträge: Zähle...

hmmm ... ich hatte das selbe Problem, und hab dann Sourcen des 2.4er Kernels genommen ...

gcc -c hello.c -I /usr/src/linux/include/

In Datei, eingefügt von /usr/src/linux/include/linux/module.h:10,
                    von hello.c:2:
/usr/src/linux/include/linux/config.h:4:28: Fehler: linux/autoconf.h: Datei oder Verzeichnis nicht gefunden
In Datei, eingefügt von /usr/src/linux/include/linux/module.h:12,
                    von hello.c:2:
/usr/src/linux/include/linux/spinlock.h:6:24: Fehler: asm/system.h: Datei oder Verzeichnis nicht gefunden
In Datei, eingefügt von hello.c:2:
/usr/src/linux/include/linux/module.h:26:24: Fehler: asm/atomic.h: Datei oder Verzeichnis nicht gefunden
In file included from hello.c:2:
/usr/src/linux/include/linux/module.h:63: Fehler: syntax error before »atomic_t«
/usr/src/linux/include/linux/module.h:63: Warnung: kein Semikolon am Ende von »struct« oder »union«
/usr/src/linux/include/linux/module.h:63: Warnung: kein Semikolon am Ende von »struct« oder »union«
/usr/src/linux/include/linux/module.h:65: Fehler: syntax error before »}« token
/usr/src/linux/include/linux/module.h:65: Warnung: Datendefinition hat keinen Typ oder Speicherklasse
/usr/src/linux/include/linux/module.h:94: Fehler: syntax error before »}« token
/usr/src/linux/include/linux/module.h:299:27: Fehler: linux/version.h: Datei oder Verzeichnis nicht gefunden
/usr/src/linux/include/linux/module.h:301: Fehler: syntax error before »UTS_RELEASE«


... aber das hats nicht wirklich gebracht. es fehlen zum Teil dateien und es kommen noch einige andere Fehler ...

Cu Frank

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Du hast nur die Kernelsourcen besorgt, aber den Kernel selbst nicht gemacht?

Ich glaube das asm-Problem kenne ich - da hilft es, einen symbolischen link von asm-i386 auf asm zu erzeugen.

Antworten |