Hallo, ich versuche mach folgender Anleitung einen Linux-Treiber für einen Raspberry-Pi zu compilieren. http://sandsoftwaresound.net/raspberry-pi/raspberry-pi-gen-1/build-a-kernel-module/ Das ging mit der richtigen Raspbian-Version (die 2013-02-09-wheezy-raspbian.img, die den Kernel 3.6.11+ benutzt) soweit dass der Treiber compiliert, jedoch kann ich ihn nicht einhängen. Fehlermeldung "Invaliv module format". Nach dem allwissenden Internet deutet das auf eins diese Dinge hin: 1. Falsche Version der Kernel-Header: Sollte aber passen, ich hab die richtige Version eingepielt. 2. Kernel-Konfiguration passt nicht: .config hab ich laut der o.g. Anleitung extrahiert und ins richtige Verzeichnis geschoben. 3. Die Datei "Module.symvers" nicht vorhanden oder falsch: Die hab ich aber auch nach o.g. Anleitung ins Verzeichnis der Kernel Header geschoben. 4. Falsche gcc Version: Wie finde ich raus mit welcher Version der Kernel kompiliert wurde? Es gibt beim Treiber-Kompilieren auf jeden Fall keine Warnings o.ä. Kurz gefasst: Wie finde ich raus durch was der Fehler verursacht wird? Die Dateien mod1.c und Makefile sind die gleichen wie in diesem Post: Beitrag "Problem bei Linux-Treiber für den Raspberry-Pi compilieren" Vielen Dank für eure Tipps im letzten Thread und für diesem im voraus... Hier die Fehlermeldung im Detail: pi@raspberrypi ~/treiber $ make make -C /lib/modules/3.6.11+/build SUBDIRS=/home/pi/treiber modules make[1]: Entering directory `/usr/src/linux-headers-3.6.11+' CC [M] /home/pi/treiber/mod1.o Building modules, stage 2. MODPOST 1 modules CC /home/pi/treiber/mod1.mod.o LD [M] /home/pi/treiber/mod1.ko make[1]: Leaving directory `/usr/src/linux-headers-3.6.11+' pi@raspberrypi ~/treiber $ sudo insmod mod1.ko Error: could not insert module mod1.ko: Invalid module format pi@raspberrypi ~/treiber $ dmesg|tail [ 3722.725942] mod1: disagrees about version of symbol module_layout [ 3999.253158] mod1: disagrees about version of symbol module_layout [ 6641.803538] mod1: disagrees about version of symbol module_layout [ 6882.463902] mod1: disagrees about version of symbol module_layout [ 6901.782517] mod1: disagrees about version of symbol module_layout [ 7072.662047] mod1: disagrees about version of symbol module_layout [ 7619.281816] mod1: disagrees about version of symbol module_layout [ 7736.073315] mod1: disagrees about version of symbol module_layout [ 7794.062709] mod1: disagrees about version of symbol module_layout [ 8284.535584] mod1: disagrees about version of symbol module_layout pi@raspberrypi ~/treiber $ uname -a Linux raspberrypi 3.6.11+ #371 PREEMPT Thu Feb 7 16:31:35 GMT 2013 armv6l GNU/Linux pi@raspberrypi ~/treiber $ -- Betreffzeile auf Wunsch des Threadstarters angepasst -rufus
:
Verschoben durch Moderator
Wozu ist jetzt der neue Thread da?
Weil sich das Problem verschoben hat. Jetzt kompiliert es, jedoch kann ich den Treiber nicht einhängen. Die Fehlermeldung "Invalid module format" deutet darauf hin dass der Treiber gegen die falsche Version des Kernels kompiliert wurde, aber ich kann mir nicht erklären was genau (Header, Einsprungspunkte?) in der falschen Version vorliegen soll. Im Internet hab ich diese oder jene Tipps gesehen an was das liegen könnte. Da hab ich Sachen ausprobiert (v.a. mit der Kernel-Konfiguration oder der "Module.symvers", andere gcc-Version) jedoch keine Änderung. Das ist alles ein wenig gestochere im Nebel, weil man nicht weiß was genau es ist was hier nicht passt. Deswegen jetzt meine Frage wie man der Fehlermeldung und dem Problem dahinter systematisch auf den Grund gehen könnte.
Dann stimmt die Betreffzeile aber nicht mehr.
Das stimmt natürlich. Kannst du das bitte ändern in: insmod: "Invalid module format" - Wie raus finden woran es liegt?
Hallo, - poste bitte einmal die Ausgabe des Kommandos uname -a Gruesse Th.
tom schrieb: > poste bitte einmal die Ausgabe des Kommandos Hat er schon. modinfo module.ko wär' interessanter.
Falsche .config oder falsche Version der Kernelheader Auf ein paar Kernelstrukturen hat ein Treiber Zugriff, ohne dass diese in einem normalem Symbol referenziert werden. Das Symbol "module_layout" soll diesem abhelfen, indem darin alle solche Strukturen referenziert werden, leider auch solche die der Treiber nicht braucht. Manche Optionen in der .config haben einen Einfluss auf diese Strukturen z.B. ext2/ext3, d.h. wenn diese falsch gesetzt sind, lädt der Treiber nicht, auch wenn er eigentlich keine Abhängigkeit von ext2/ext3 hat. Die Symbolversion wird über einen 32 bit Hashwert über alle referenzierten Strukturen (Afaik Source!) bestimmt, das wird dann die Hexzahl in module.symvers
Hallo, "modinfo" und "uname -a" siehe unten. Die srcversion und vermagic sind schon mal gute Stichpunkt an denen ich weiterforschen kann. Hab aber erst morgen Abend Zeit dafür. Vielen Dank für die Tipps. pi@raspberrypi ~/treiber $ modinfo mod1.ko filename: /home/pi/treiber/mod1.ko description: Just a Modul-Template, without specific functionality. license: GPL author: Jürgen Quade srcversion: 98161517707BC10FB967C32 depends: vermagic: 3.6.11 preempt mod_unload modversions ARMv6 pi@raspberrypi ~/treiber $ uname -a Linux raspberrypi 3.6.11+ #371 PREEMPT Thu Feb 7 16:31:35 GMT 2013 armv6l GNU/Linux pi@raspberrypi ~/treiber $
Ich schau mir die "modinfo" von einem andern Treiber an der auf der SD-Karte des Raspberry Pi ist. Ok, die vermagic ist anders. In der Datei config, die ich aus /proc/config.gz auslese steht aber auch die Versionsnummer ohne das "+", und das ist doch wohl zwangsläufig die Konfiguration vom Kernel der tatsächlich läuft? pi@raspberrypi /lib/modules/3.6.11+/kernel/drivers/media/radio $ ls dsbr100.ko radio-keene.ko radio-mr800.ko radio-shark.ko radio-si4713.ko radio-tea5764.ko saa7706h.ko shark2.ko si4713-i2c.ko tef6862.ko pi@raspberrypi /lib/modules/3.6.11+/kernel/drivers/media/radio $ modinfo dsbr100.ko filename: /lib/modules/3.6.11+/kernel/drivers/media/radio/dsbr100.ko version: 1.1.0 license: GPL description: D-Link DSB-R100 USB FM radio driver author: Markus Demleitner <msdemlei@tucana.harvard.edu> srcversion: 01A4B17DA7471B3F865F3DD alias: usb:v04B4p1002d*dc*dsc*dp*ic*isc*ip*in* depends: videodev intree: Y vermagic: 3.6.11+ preempt mod_unload modversions ARMv6 parm: radio_nr:int pi@raspberrypi /lib/modules/3.6.11+/kernel/drivers/media/radio $ modinfo radio-mr800.ko filename: /lib/modules/3.6.11+/kernel/drivers/media/radio/radio-mr800.ko version: 0.1.2 license: GPL description: AverMedia MR 800 USB FM radio driver author: Alexey Klimov <klimov.linux@gmail.com> srcversion: 59E78A358533AD93652D4D1 alias: usb:v07CApB800d*dc*dsc*dp*ic03isc00ip00in* depends: videodev intree: Y vermagic: 3.6.11+ preempt mod_unload modversions ARMv6 parm: radio_nr:Radio Nr (int) ... pi@raspberrypi /mnt/synintern/pi/151213_treiber_mit_2013_wheezy $ cat /proc/config.gz > config.gz Die Datei config: siehe Anhang sie beginnt mit den Zeilen: # # Automatically generated file; DO NOT EDIT. # Linux/arm 3.6.11 Kernel Configuration # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_GENERIC_GPIO=y CONFIG_HAVE_PROC_CPU=y CONFIG_STACKTRACE_SUPPORT=y ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.