• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

opensuse 11.3:nur ein modul ändern!

bassman56

Newbie
habe gerade opensuse 11.3 installiert, mit pae-kernel.
Jetzt möchte ich eben nur 1 kleines module patchen und ersetzen. dazu probiere ich erst mal ob ich es ohne Änderungen nachbauen kann.

also: kernel-sourcen installiert, make mrproper, make cloneconfig, make prepare, make module_prepare.

dann das einzelne modul machen:
make drivers/media/video/ir-kbd-i2c.ko

Wenn ich aber versuche, das neue modul (noch ohne patches) zu installieren:
insmod drivers/media/video/ir-kbd-i2c.ko

dann gibts eine fehlermeldung:
insmod: error inserting 'drivers/media/video/ir-kbd-i2c.ko': -1 Invalid module format

und in dmesg:
kernel: [18506.295093] ir_kbd_i2c: no symbol version for module_layout

Was mache ich falsch? :???:

Gruß
 

spoensche

Moderator
Teammitglied
bassman56 schrieb:
also: kernel-sourcen installiert, make mrproper, make cloneconfig, make prepare, make module_prepare.

dann das einzelne modul machen:
make drivers/media/video/ir-kbd-i2c.ko

Mööp error. ;) Das Paket kernel-syms fehlt noch und du hast dich auch nicht an die Buildstruktur gehalten.

bassman56 schrieb:
Wenn ich aber versuche, das neue modul (noch ohne patches) zu installieren:
insmod drivers/media/video/ir-kbd-i2c.ko

dann gibts eine fehlermeldung:
insmod: error inserting 'drivers/media/video/ir-kbd-i2c.ko': -1 Invalid module format

und in dmesg:
kernel: [18506.295093] ir_kbd_i2c: no symbol version for module_layout

Wie oben schon erwähnt, fehlt das Paket kernel-syms etc.

Das make mrproper kannst du weglassen.

Wie folgt solltest du vorgehen:

Code:
cd /usr/src/linux

patch -Np tralala (Wenn du etwas an dem Modul geändert hast, dann wohl mit einer .patch Datei)

make oldconfig
make scripts && make prepare
make -C /lib/modules/$(uname -r)/build M=$(pwd)
cd pfad/zum/modul
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

Siehe /usr/src/linux/README.SUSE
 
OP
B

bassman56

Newbie
kernel-syms war schon da - das kanns nicht sein.

make modules_install möchte ich eigentlich nicht machen, da ich dann das ganze System überbügle.
Ich wollte doch nur ein einziges modul nacharbeiten, das muss doch gehen?

Weitere Forschungen:
make rpm -> macht das ganze kernel-rpm, die zwischenergebnisse stehen dann in /usr/src/packages/BUILD/kernel-2.6.3412pae. dauert auch entsprechend einige zeit

jetzt kommt das was ich nicht verstehe: es kommen zwei unterschiedliche module raus!
-rw-r--r-- 1 root root 164189 Aug 3 01:08 ../packages/BUILD/kernel-2.6.3412pae/drivers/media/video/ir-kbd-i2c.ko --> kann geladen werden!
-rw-r--r-- 1 root root 162061 Aug 3 17:44 ./drivers/media/video/ir-kbd-i2c.ko --> fehler bein insmod!

das heisst:
"make rpm" --> produziert ein etwas anderes Binärmodul als "make drivers/media/video/ir-kbd-i2c.ko", aus dem gleichen source tree.

versteht das einer? wird bei make rpm eine andere target-architektur gemacht?

Rätsel! Wer kann das erklären?
 
OP
B

bassman56

Newbie
Nachtrag: objdump -t ... liefert verschiedene symbole nur an dieser stelle:

< 00000140 l O .modinfo 00000023 __mod_srcversion28
< 00000163 l O .modinfo 00000009 __module_depends
< 00000000 l O __versions 00000000 ____versions
---
> 00000140 l O .modinfo 00000023 __mod_srcversion60
> 00000163 l O .modinfo 0000001a __module_depends
> 00000000 l O __versions 00000800 ____versions

Was bedeutet das?
 

spoensche

Moderator
Teammitglied
bassman56 schrieb:
make modules_install möchte ich eigentlich nicht machen, da ich dann das ganze System überbügle.
Ich wollte doch nur ein einziges modul nacharbeiten, das muss doch gehen?

[/code]

Mit dem make Aufruf den ich dir an die Hand gegeben habe wird nur das eine Modul installiert.

Weitere Forschungen:
make rpm -> macht das ganze kernel-rpm, die zwischenergebnisse stehen dann in /usr/src/packages/BUILD/kernel-2.6.3412pae. dauert auch entsprechend einige zeit

jetzt kommt das was ich nicht verstehe: es kommen zwei unterschiedliche module raus!
-rw-r--r-- 1 root root 164189 Aug 3 01:08 ../packages/BUILD/kernel-2.6.3412pae/drivers/media/video/ir-kbd-i2c.ko --> kann geladen werden!
-rw-r--r-- 1 root root 162061 Aug 3 17:44 ./drivers/media/video/ir-kbd-i2c.ko --> fehler bein insmod!

bassman56 schrieb:
das heisst:
"make rpm" --> produziert ein etwas anderes Binärmodul als
"make drivers/media/video/ir-kbd-i2c.ko", aus dem gleichen source tree.

versteht das einer? wird bei make rpm eine andere target-architektur gemacht?

Rätsel! Wer kann das erklären?

Weil, make drivers/... /.ko die .ko Datei kompilieren soll, was aber zum einen das fertige Modul ist und zum anderen sich nicht an den Buildtree hält, was ich dir schon mitgeteilt habe.
 
OP
B

bassman56

Newbie
OK. habs nochmal nach anleitung probiert.
frage:
bei
make -C /lib/modules/$(uname -r)/build M=$(pwd)
wird das geänderte module (auch nach touch xx.c) nicht kompiliert.

muss ich nicht danach noch den module-namen angeben, den ich spezifisch produzieren will, also?

make -C /lib/modules/$(uname -r)/build M=$(pwd) driver/media/video/ir-kbd-i2c.ko

??
merci vielmals!
 

spoensche

Moderator
Teammitglied
Nein, $(pwd) startet eine Subshell und führt den Befehl pwd aus, der das aktuelle Arbeitsverzeichnis ausgibt. Du musst in das Verzeichnis des Treibers wechseln und dann make ausführen.

PS:
Verwende bitte die Code Tags wenn du Ausgaben postest.
 
Du kannst keine einzelnen Module (drivers/media/video/ir-kbd-i2c.ko) bauen, bevor du nicht eine System.map im Buildverzeichnis hast, da sonst nicht die nötigen Symbolmetadaten ins .ko eingebaut werden (was dann letztendlich zu invalid module format / wrong crc / etc. führt). Und System.map wird erfahrungsgemäß erst dann erstellt werden können, wenn sie Symbole aller Module — in ihrer .o-Form — bekannt sind.
 
Oben