# Kernel-Module wollen nicht mit EXTRAVERSION [SOLVED]

## doberman

Hallo zusammen,

also irgendwie verstehe ich das ganze nicht:

Hab mir gerade die aktuellen development-sources gezogen, sprich Version 2.6.6, da ich immer noch die ck-sources-2.6.4 am laufen habe, und somit noch ein paar Sicherheitslücken vorhanden sind. 

Bisher habe ich im Makefile EXTRAVERSION um einen Zusatz ergänzt, damit ich von einer Version auch mehrere Ausgaben zu Testzwecken installieren kann und damit jedesmal die Module in ein eigenes Verzeichnis installiert werden. So weit so gut. Das wollte ich bei dem 2.6.6er natürlich auch machen und haben im Makefile aus

```
EXTRAVERSION = 
```

```
EXTRAVERSION = -1
```

gemacht. Doch nun wollen die Module sich nicht mehr so wirklich installieren und brechen mit folgender Fehlermeldung ab:

```
  Building modules, stage 2.

  MODPOST

  CC      drivers/net/dummy.mod.o

  LD [M]  drivers/net/dummy.ko

  CC      fs/fat/fat.mod.o

  LD [M]  fs/fat/fat.ko

  CC      drivers/i2c/i2c-core.mod.o

  LD [M]  drivers/i2c/i2c-core.ko

  CC      drivers/i2c/i2c-dev.mod.o

  LD [M]  drivers/i2c/i2c-dev.ko

  CC      drivers/i2c/busses/i2c-isa.mod.o

  LD [M]  drivers/i2c/busses/i2c-isa.ko

  CC      drivers/i2c/busses/i2c-piix4.mod.o

  LD [M]  drivers/i2c/busses/i2c-piix4.ko

  CC      drivers/i2c/i2c-sensor.mod.o

  LD [M]  drivers/i2c/i2c-sensor.ko

  CC      drivers/media/common/ir-common.mod.o

  LD [M]  drivers/media/common/ir-common.ko

  CC      fs/isofs/isofs.mod.o

  LD [M]  fs/isofs/isofs.ko

  CC      fs/msdos/msdos.mod.o

  LD [M]  fs/msdos/msdos.ko

  CC      fs/ntfs/ntfs.mod.o

  LD [M]  fs/ntfs/ntfs.ko

  CC      drivers/media/video/saa7134/saa6752hs.mod.o

  LD [M]  drivers/media/video/saa7134/saa6752hs.ko

  CC      drivers/media/video/saa7134/saa7134.mod.o

  LD [M]  drivers/media/video/saa7134/saa7134.ko

  CC      sound/pci/ac97/snd-ac97-codec.mod.o

  LD [M]  sound/pci/ac97/snd-ac97-codec.ko

  CC      sound/pci/emu10k1/snd-emu10k1-synth.mod.o

  LD [M]  sound/pci/emu10k1/snd-emu10k1-synth.ko

  CC      sound/pci/emu10k1/snd-emu10k1.mod.o

  LD [M]  sound/pci/emu10k1/snd-emu10k1.ko

  CC      sound/synth/emux/snd-emux-synth.mod.o

  LD [M]  sound/synth/emux/snd-emux-synth.ko

  CC      sound/core/snd-hwdep.mod.o

  LD [M]  sound/core/snd-hwdep.ko

  CC      sound/core/oss/snd-mixer-oss.mod.o

  LD [M]  sound/core/oss/snd-mixer-oss.ko

  CC      sound/core/snd-page-alloc.mod.o

  LD [M]  sound/core/snd-page-alloc.ko

  CC      sound/core/oss/snd-pcm-oss.mod.o

  LD [M]  sound/core/oss/snd-pcm-oss.ko

  CC      sound/core/snd-pcm.mod.o

  LD [M]  sound/core/snd-pcm.ko

  CC      sound/core/snd-rawmidi.mod.o

  LD [M]  sound/core/snd-rawmidi.ko

  CC      sound/core/snd-rtctimer.mod.o

  LD [M]  sound/core/snd-rtctimer.ko

  CC      sound/core/seq/snd-seq-device.mod.o

  LD [M]  sound/core/seq/snd-seq-device.ko

  CC      sound/core/seq/snd-seq-midi-emul.mod.o

  LD [M]  sound/core/seq/snd-seq-midi-emul.ko

  CC      sound/core/seq/snd-seq-midi-event.mod.o

  LD [M]  sound/core/seq/snd-seq-midi-event.ko

  CC      sound/core/seq/snd-seq-midi.mod.o

  LD [M]  sound/core/seq/snd-seq-midi.ko

  CC      sound/core/seq/oss/snd-seq-oss.mod.o

  LD [M]  sound/core/seq/oss/snd-seq-oss.ko

  CC      sound/core/seq/snd-seq-virmidi.mod.o

  LD [M]  sound/core/seq/snd-seq-virmidi.ko

  CC      sound/core/seq/snd-seq.mod.o

  LD [M]  sound/core/seq/snd-seq.ko

  CC      sound/core/snd-timer.mod.o

  LD [M]  sound/core/snd-timer.ko

  CC      sound/synth/snd-util-mem.mod.o

  LD [M]  sound/synth/snd-util-mem.ko

  CC      sound/core/snd.mod.o

  LD [M]  sound/core/snd.ko

  CC      sound/soundcore.mod.o

  LD [M]  sound/soundcore.ko

  CC      drivers/media/video/tda9887.mod.o

  LD [M]  drivers/media/video/tda9887.ko

  CC      drivers/media/video/tuner.mod.o

  LD [M]  drivers/media/video/tuner.ko

  CC      fs/udf/udf.mod.o

  LD [M]  fs/udf/udf.ko

  CC      fs/vfat/vfat.mod.o

  LD [M]  fs/vfat/vfat.ko

  CC      drivers/media/video/video-buf.mod.o

  LD [M]  drivers/media/video/video-buf.ko

  CC      drivers/i2c/chips/w83781d.mod.o

  LD [M]  drivers/i2c/chips/w83781d.ko

  CC      lib/zlib_inflate/zlib_inflate.mod.o

  LD [M]  lib/zlib_inflate/zlib_inflate.ko

ln: Beim Erzeugen mehrerer Verkn?pfungen muss das letzte Argument ein Verzeichnis sein

make: *** [_modinst_] Fehler 1

```

Hab dann nochmals mir Hilfe von 

```
 make mrproper 
```

und 

```
make clean
```

 das ganze wiederholt, aber es erscheint genau an der selben Stelle der gleiche Fehler.   :Mad: 

Hab also mal nen bisschen durchs Forum gesucht, aber nichts gefunden was mir irgendwie weiter geholfen hat. Also hab ich meinen Zusatz aus EXTRAVERSION wieder rausgenommen und es wieder in den Urzustand versetzt. Mit einmal läuft alles ohne Probleme durch   :Question:   ......

Kann mir vielleicht einer weiterhelfen und mir verraten, warum es mit dem Zusatz miteinmal nicht mehr funktioniert!? ...oder muss ich woanders auch noch was ändern? .....wäre mir zwar neu, aber man kann ja nie wissen.....

Danke für eure Hilfe,

dobermanLast edited by doberman on Wed Jun 02, 2004 9:44 pm; edited 1 time in total

----------

## moocha

Hab's nicht versucht, aber vielleicht funktioniert es: Nimm das Minuszeichen vor deiner Extraversion weg (also 1 statt -1) - oder, besser noch, setze irgendeinen Buchstaben davor, damit es nicht numerisch ist.

----------

## doberman

Hallo moocha,

hab sofort beide Varianten ausprobiert. Hat aber nix gebracht, der Fehler erscheint trotzdem wieder    :Sad: 

Hat sonst noch jemand eine Idee?

Gruss,

doberman

----------

## yeoman

```
make EXTRAVERSION=XYZ && make EXTRAVERSION=XYZ modules_install
```

installiert die Module in /usr/lib/modules/2.6.6XYZ (bei kernel 2.6.6 natürlich). Vielleicht mußt du im Makefile Anführungszechen benutzen?

----------

## doberman

Hey yeoman,

danke, dein Tip hat funktioniert....das mit den Anführungszeichen muss ich mal probieren...fände ich aber seltsam, da es bisher auch nicht nötig war.....

gruss,

doberman

----------

## firefly

hmm wenn ich die fehlermeldung 

```
ln: Beim Erzeugen mehrerer Verkn?pfungen muss das letzte Argument ein Verzeichnis sein
```

richtig verstehe findet er das Verzeichnis nicht.

Soweit ich weiss bildet das makfile/ der compiler aus "linux-" plus den 4 Variablen VERSION,PATCHLEVEL,SUBLEVEL und EXTRAVERSION das Verzeichnis vom kernel.

Dadurch musst du das Kernelverzeichnis von 

```
linux-2.6.6
```

in 

```
linux-2.6.6-1
```

 ändern (wenn EXTRAVERSION=-1).

gruß

firefly

----------

## doberman

Hallo firefly,

das ist mir auch gerade aufgefallen, als der nvidia-Treiber sich ins falsche Moduleverzeichniss installiert hat. Was ich aber wiederrum nicht verstehen, warum es mit einmal nicht mehr wie bei Kernel-2.6.4 funktioniert. Da war der Kernel z.b. unter /usr/src/linux-2.6.4 installiert und es spielte keine Rolle was für EXTRAVERSION im Makefile steht. Da hat der nvidia-Treiber keine Probleme gemacht und sich in richtige Moduleverzeichnis eingetragen. Das war eine simple und gute Lösung, zumindest aus meiner Sicht. Jetzt muss plötzlich auch das Sourceverzeichnis den kompletten Namen incl. EXTRAVERSION tragen....umständlicher gehts nun wirklich nicht....falls aber jemand weiss, wie es auch wieder auf die alte Art und Weise geht soll mir einfach mal Bescheid sagen.......

Gruss,

doberman

----------

## doberman

....ich bin's nochmal.....  :Wink: 

...so, hab einen Weg gefunden, auch wenn ich mir nicht so ganz im klaren bin warum es so jetzt funtkioniert. Also:

Bisher habe ich mir die Kernel der 2.6er Serie immer mit 

```
make

make modules_install
```

übersetzt und danach alles nach /boot kopiert.  Das hab ich bei dem oben erwähnten 2.6.6er auch gemacht......heraus kam dabei die obige Fehlermeldung......  :Confused: 

Nachdem alle hier genannten Vorschläge nicht wirklich halfen - trotzdem danke an alle - bin ich nochmal mit Google durchs Netz spazieren gegangen.....dabei stiess ich auf eine Seite die nochmal step by step die Installation eines neuen Kernel erklärte.....allerdings, mit den Befehlen die man von der 2.4er Serie u.a. kennt 

```
make bzImage

make modules

make modules_install
```

 Da dabei von dem 2.6.6er Kernel die Rede war, wollte ich es nochmal so probieren (zum x-ten Mal   :Rolling Eyes:  )...ich erwartet zwar das selbe Ergebniss wie bisher.....  :Idea:   ...aber nein, er installierte die Module vollkommen klaglos, und stolperte nicht über meinen EXTRAVERSION-Zusatz im Makefile ...sogar das Moduleverzeichnis hatte den richtigen Anhang *freu*. 

Dann blieb da nur noch der Nvidia-Treiber (siehe meine Posting oben). Doch auch der installierte sich ins richtige Verzeichnis....auch wenn er dabei meckerte, das die Verzeichnisnamen meiner Kernelsourcen nicht korrekt sind

```
Calculating dependencies ...done!

>>> emerge (1 of 1) media-video/nvidia-kernel-1.0.5336-r3 to /

>>> md5 src_uri ;-) NVIDIA-Linux-x86-1.0-5336-pkg1.run

 * The new 2.6.6 Series kernels include an option for 4K Stack sizes,

 * this option must NOT be selected. This driver will only work with

 * the OLD 8K Stack size, please ensure you leave 8K stack sizes for now.

>>> Unpacking source...

 * /usr/src/linux is a symbolic link

 * Determining the real directory of the Linux kernel source code

 *

 * The kernel Makefile says that this is a 2.6.6-1 kernel

 * but the source is in a directory for a 2.6.6 kernel.

 *

 * This goes against the recommended Gentoo naming convention.

 * Please rename your source directory to 'linux-2.6.6-1'

 *

 * Building for Linux 2.6.6-1 found in /usr/src/linux

 * which outputs to /usr/src/linux

 * By not using the kernel's ability to output to an alternative

 * directory, some external module builds may fail.

 * See <insert link to user doc here>

Creating directory NVIDIA-Linux-x86-1.0-5336-pkg1

Verifying archive integrity... OK

```

Für wirklich sinnvoll halte ich den Vorschlag nicht, denn

1. Muss ich dann den Verzeichnisnamen der Sourcen bei jedem neuen Kernel der selben Version umbenennen (wie unpraktisch)

2. gibts dann Problem wenn ich die Sourcen deinstallieren will, denn dann muss ich wieder zurück zum ursprünglichen Verzeichnisnamen

Fazit: 

Der einfache Weg über 

```
make

make modules_install
```

geht nicht, wenn man EXTRAVERSION benutzen will. Dann muss man wieder die alten Befehle benutzen.

Danke für eure Hilfe,

doberman

----------

## firefly

das mit der EXTRAVERSION und mit 

```
make

make modules_install
```

funktioniert doch ganz gut mit allen sourcen die man per emerge sich installieren kann.

(z.B. die gentoo-sources gentoo-dev-sources die haben die Endung -gentoo als EXTRAVERSION im Makefile.)

Und bei denen gibt es keine probleme mit dem nvidia-kernel modul mit dem installieren.

Es nun mal so von den Kernelentwicklern so erdacht worden mit dem erstellen des Verzeichnissnamen aus den Variablen im Makefile + "linux-" um zu unterscheiden zu können welche version vom kernel verwendet wird(ist im übersetzten kernel enthalten)

Durch die Variable EXTRAVERSION wird es den Kernelentwicklern ermöglicht ihre Änderungen am kernel durch einspielen von Patches zu kennzeichnen.

Ich persönlich finde dies sehr gut denn dadurch kann man sich den selben Grundkernel(z.b. 2.6.6) mehrmals, welche sich nur durch eingespielte Patchsets unterscheiden, installieren.

Desweiteren kann man am Verzeichniss erkennen um welchen Patchset bzw Revision vom Patchset es sich handelt.

 *Quote:*   

> 1. Muss ich dann den Verzeichnisnamen der Sourcen bei jedem neuen Kernel der selben Version umbenennen (wie unpraktisch)

 

ja das musst du. Um den momentan verwendeten kernel für externe Kernel-module zu kennzeichnen kann man sich einfach einen symlink mit dem namen linux auf das entsprechende Kernlverzeichniss machen.

Dadurch finden die externen Kernel-modul-pakete immer den momentan laufenden kernel, wenn sie  das verzeichniss nicht per "uname -r" erkenne.

Da ich öfters verschiedene Kernel teste habe ich mir ein Script geschrieben welches mir beim booten den Symlink "/usr/src/linux" immer auf das verzeichniss anlegt in dem sich der gestartete kernel befindet.

```
#!/bin/bash

      

KERNELVERSION=`uname -r`

rm /usr/src/linux

cd /usr/src

ln -s -f linux-$KERNELVERSION linux
```

```
2. gibts dann Problem wenn ich die Sourcen deinstallieren will, denn dann muss ich wieder zurück zum ursprünglichen Verzeichnisnamen
```

nein musst du nicht. Beim deinstallieren vom Kernel  langt es wenn du das Source-Verzeichniss in /usr/src/  und das Modul-Verzeichniss in /lib/modules/ löscht plus den kernel in /boot  :Smile: .

Und natürlich den Symlink /usr/src/linux nicht vergessen auf das neue verzeichniss zu ändern  :Smile: 

Ich hoffe ich konnte jetzt verständlich erklären(soweit ich das verstanden habe) was sich die Kernelentwickler dabei gedacht haben.

Gruß

firefly

----------

## doberman

Hallo firefly,

 *Quote:*   

> das mit der EXTRAVERSION und mit
> 
> Code:
> 
> make
> ...

 

...eben, hat es bei mir ja auch. Deswegen war ich ja so verwundert, das es mit dem 2.6.6er nicht mehr funktionierte. Bei Kernelversionen <=2.6.4 hatte ich damit kein Problem. Da musste das eigentliche Kernelverzeichnis nicht mit der EXTRAVERSION übereinstimmen. Bei den ck-sources z.B. steht ja, wie du selber eben gut erklärt hast, steht mit EXTRAVERSION = ck2 der Patchname, um die ck-sources von dem vanilla-kernel zu unterscheiden. Dementsprechen war das Kernelverzeichnis 

```
/usr/src/linux-2.6.4-ck2
```

 und dazu hatte ich den Symlink 

```
/usr/src/linux
```

 auf das Verzeichnis. Um unterschiedliche Einstellungen auszuprobieren - sprich mehrere Kernel der selben Version parallel zu installieren - habe ich dann an die schon vorhandene EXTRAVERSION u.a. so mit forlaufenden Nummern versehen

```
EXTRAVERSION=ck2-1
```

D.h. auch hier stimmte also der Verzeichnisname nicht mehr dem Kernelnamen überein, und trotzdem funktionerte es bis dahin, wie selbst bemerkst, wunderbar.  Aber eben das funktioniert so nicht mehr. Sondern nur so, wie oben erwähnt. Aber was solls, es ist ja trotzdem eine saubere Lösung. Aber danke nochmal für deine ausführliche Erklärung.

Gruss,

doberman

----------

