Forum: PC Hard- und Software Problem bei Linux-Treiber für Raspberry-Pi: insmod: "Invalid module format"


von asd (Gast)


Lesenswert?

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
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wozu ist jetzt der neue Thread da?

von asd (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dann stimmt die Betreffzeile aber nicht mehr.

von asd (Gast)


Lesenswert?

Das stimmt natürlich. Kannst du das bitte ändern in:
insmod: "Invalid module format" - Wie raus finden woran es liegt?

von tom (Gast)


Lesenswert?

Hallo, -

poste bitte einmal die Ausgabe des Kommandos

uname -a

Gruesse

Th.

von Markus F. (mfro)


Lesenswert?

tom schrieb:
> poste bitte einmal die Ausgabe des Kommandos

Hat er schon.

modinfo module.ko

wär' interessanter.

von Lattice User (Gast)


Lesenswert?

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

von asd (Gast)


Lesenswert?

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 $

von asd (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.