• 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!

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ß
 
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
 
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?
 
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?
 
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.
 
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!
 
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