[Erledigt] LKM Kompilieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
kryzir
Beiträge: 178
Registriert: 22.09.2007 22:11:33

[Erledigt] LKM Kompilieren

Beitrag von kryzir » 01.02.2009 17:05:39

Hallo zusammen,

ich habe ein Problem beim kompilieren von LKMs, da sich die header files aus dem linux include nicht korrekt einbinden und kompilieren lassen.

Bei dem normalen kompilier versuch über

Code: Alles auswählen

gcc -c test.c
funktioniert es generell nicht, da es wohl nicht automatisch gelinkt wird

Wenn ich es übergebe und so umsetze:

Code: Alles auswählen

gcc -c -I/usr/src/linux-headers-2.6.26-1-686/include test.c
bekomme ich endlos lange Fehler[1] die die sich auf die linux header beziehen und ich weiss nicht woran es liegt..
[1] http://pastebin.com/m6f0634b6


Benutzer include z.B.:
linux/module.h


linux-headers-2.6-686 --> installiert
linux-headers-2.6.26-1-686 --> installiert
linux-source-2.6.26 --> installiert
module-init-tools --> installiert


Es wäre sehr nett wenn jemand eine Lösung wüsste, vielen Dank.
Gruß kryzir
Zuletzt geändert von kryzir am 01.02.2009 20:23:45, insgesamt 1-mal geändert.

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: LKM Kompilieren

Beitrag von Spasswolf » 01.02.2009 17:47:55

Der kanonische Weg zur Kompilierung eines LKMs läuft über das Makefile des Kernels:

Code: Alles auswählen

$ ls
Makefile test.c
$cat Makefile
obj-m +=test.o
modules:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
So kann man dann mit make das Modul für den laufenden Kernel kompilieren.

kryzir
Beiträge: 178
Registriert: 22.09.2007 22:11:33

Re: LKM Kompilieren

Beitrag von kryzir » 01.02.2009 18:00:39

Spasswolf hat geschrieben:Der kanonische Weg zur Kompilierung eines LKMs läuft über das Makefile des Kernels:

Code: Alles auswählen

$ ls
Makefile test.c
$cat Makefile
obj-m +=test.o
modules:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
So kann man dann mit make das Modul für den laufenden Kernel kompilieren.
Jo ich weiss, nur kommt dann:

Code: Alles auswählen

make: Für das Ziel »modules« ist nichts zu tun.
Darüber hinaus müsste es ja auch so gehen, ich habe schon auf vielen Seiten lesen können, dass es so funktionieren müsste, aber ich
verstehe enfach nicht warum der compiler mir solche Fehler bezüglich der linux header wirft.

Aber vielen Dank schon mal für deine Mühen.

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: LKM Kompilieren

Beitrag von Spasswolf » 01.02.2009 18:37:41

Versuch das Makefile Problem zu lösen, wenn du ein Kernelmodul mit dem gcc per Hand kompileren willst wird das eine riesige Sauerei. Als Beispiel

Code: Alles auswählen

$ ls
Makefile ProcessList.c
$ make
make -C /lib/modules/2.6.28.1/build M=/home/bert/Programme/Kernel/process modules
make[1]: Entering directory `/usr/src/linux-2.6.26'
  CC [M]  /home/bert/Programme/Kernel/process/ProcessList.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/bert/Programme/Kernel/process/ProcessList.mod.o
  LD [M]  /home/bert/Programme/Kernel/process/ProcessList.ko
make[1]: Leaving directory `/usr/src/linux-2.6.26'
Beim kompilieren mit make wird die.ProcessList.o.cmd erstellt, die den gcc Aufruf enthält, der beim kompilieren benutzt wurde, und der sieht so aus:

Code: Alles auswählen

gcc -Wp,-MD,/home/bert/Programme/Kernel/process/.ProcessList.o.d  -nostdinc -isystem /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.3/include -D__KERNEL__ -Iinclude  -I/usr/src/linux-2.6.26/arch/x86/include -include include/linux/autoconf.h -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -O2 -m64 -march=core2 -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Iarch/x86/include/asm/mach-default -fno-stack-protector -fomit-frame-pointer -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(ProcessList)"  -D"KBUILD_MODNAME=KBUILD_STR(ProcessList)"  -c -o /home/bert/Programme/Kernel/process/ProcessList.o /home/bert/Programme/Kernel/process/ProcessList.c

kryzir
Beiträge: 178
Registriert: 22.09.2007 22:11:33

Re: LKM Kompilieren

Beitrag von kryzir » 01.02.2009 18:45:43

Spasswolf hat geschrieben:Versuch das Makefile Problem zu lösen, wenn du ein Kernelmodul mit dem gcc per Hand kompileren willst wird das eine riesige Sauerei. Als Beispiel

Code: Alles auswählen

$ ls
Makefile ProcessList.c
$ make
make -C /lib/modules/2.6.28.1/build M=/home/bert/Programme/Kernel/process modules
make[1]: Entering directory `/usr/src/linux-2.6.26'
  CC [M]  /home/bert/Programme/Kernel/process/ProcessList.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/bert/Programme/Kernel/process/ProcessList.mod.o
  LD [M]  /home/bert/Programme/Kernel/process/ProcessList.ko
make[1]: Leaving directory `/usr/src/linux-2.6.26'
Beim kompilieren mit make wird die.ProcessList.o.cmd erstellt, die den gcc Aufruf enthält, der beim kompilieren benutzt wurde, und der sieht so aus:

Code: Alles auswählen

gcc -Wp,-MD,/home/bert/Programme/Kernel/process/.ProcessList.o.d  -nostdinc -isystem /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.3/include -D__KERNEL__ -Iinclude  -I/usr/src/linux-2.6.26/arch/x86/include -include include/linux/autoconf.h -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -O2 -m64 -march=core2 -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Iarch/x86/include/asm/mach-default -fno-stack-protector -fomit-frame-pointer -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(ProcessList)"  -D"KBUILD_MODNAME=KBUILD_STR(ProcessList)"  -c -o /home/bert/Programme/Kernel/process/ProcessList.o /home/bert/Programme/Kernel/process/ProcessList.c
Ja das ist einleuchtend :D
Ich danke dir, ich werde dann mal versuchen das über die Makefile hinzubekommen, besten Dank.

kryzir
Beiträge: 178
Registriert: 22.09.2007 22:11:33

Re: LKM Kompilieren

Beitrag von kryzir » 01.02.2009 20:13:06

Hmm das funktioniert so dennoch hinten und vorne nicht, mir muss irgendein Paket fehlen oder so ich weiss es nicht, ich dachte
eigentlich alles zu haben was ich brauche...


EDIT: nach dem install von kernel-package funktioniert alles :)

Antworten