Kernel neu compiliert -> Module viel größer

Hi,

ich hab eine Frage zum Bauen von Kernel (-Modulen). Ich wollte ein paar Optionen vom SuSE Kernel ändern (10.3, 2.6.22.19-0.2-bigsmp) und den Kernel neu bauen. Dabei ist mir aufgefallen, dass /lib/modules/<version>/kernel auf einmal wesentlich größer geworden ist. Zunächst hatte ich meine Änderungen der .config in Verdacht. Um dies auszuschließen, habe ich die orginal .config genommen, den Kernel nochmals gebaut und nochmal verglichen. Wieder waren die Module um ca. Faktor 7 größer. Folgendes habe ich gemacht:

<orginal Kernel läuft>
/lib/modules/2.6.22.19-0.2-bigsmp/kernel # du -sh .
82M .

rm -rf /lib/modules/2.6.22.19-0.2-bigsmp/

cd /usr/src/linux-2.6.22.19-0.2

zcat /proc/config.gz > .config

make oldconfig
make -j5
make modules_install
make install

Ergebnis:
/lib/modules/2.6.22.19-0.2-bigsmp/kernel # du -sh .
558M .

Warum? Welche Optionen wurden für den orginal Kernel beim Compilieren verwendet, dass die Module so schön klein sind?

Gruß, Paul

Die zwei Befehle mit zcat und “make oldconfig” kannst Du durch “make cloneconfig” abkürzen.

Bist Du sicher, dass die Module wirklich größer sind? Kann es nicht sein, dass einfach mehr Module gebaut wurden?

Die Optionen kannst Du im Source-RPM des Kernels nachschauen. Ich hab auf der 11.3 nachgesehen und da ist eigentlich nichts derartiges gesetzt. Es ist anscheinend auch keine derartige Option verfügbar. Eventuell war bei der 10.3 da noch etwas anders…

Merci, wusste ich bisher nicht.

Ja, ich habe die Anzahl der Dateien überprüft bzw. auch die Dateinamen. Es waren keine unterschiede, außer dass die Module wirklich größer sind. So war z.B. rd.ko vohrer 26 KB und ist jetzt 150 KB.

Dafür muss es doch einen Grund geben. Ich weiß ja, dass nie exakt der gleiche Code generiert wird, aber so krasse Unterschiede. Als Compiler habe ich den von SuSE durch Pattern “Kernel-Development” installierten verwendet.

Ich hab das gleiche “Problem” unter 11.3

Kann es sein, dass da noch Debug-Information mit rein kompiliert werden?

Äh ja, Debuginformationen sind eigentlich “normal”. Ich forsch mal noch. Hab schon ewig keinen Kernel mehr gebaut.

OK, so wie es aussieht, wird der Befehl “strip” wirklich für jedes Modul einzeln im spec-File ausgeführt. Ich hatte dauernd nach einer Option o.ä. gesucht. Deswegen meiner Verwirrung zuvor.

Beispiel:
strip /usr/src/linux/drivers/net/qlge/qlge.ko

Ähm, Vorsicht, sonst gibt es möglicherweise Ärger

file /lib/modules/2.6.31.14-0.1-desktop/updates/drivers/net/wireless/iwlwifi/iwlagn.ko 
/lib/modules/2.6.31.14-0.1-desktop/updates/drivers/net/wireless/iwlwifi/iwlagn.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), **not stripped**

und ein einfaches “strip” könnte Probleme machen, falls da alle Symbole herunter"gerupft" werden.

=> man strip

       --strip-debug
           Remove debugging symbols only.

       --strip-unneeded
           Remove all symbols that are not needed for relocation processing.

//Edit:

Aber Hallo:

# strip /lib/modules/2.6.31.14-0.1-desktop/updates/drivers/net/wireless/iwlwifi/iwlagn.ko 
# modprobe -v iwlagn
insmod /lib/modules/2.6.31.14-0.1-desktop/kernel/net/rfkill/rfkill.ko 
insmod /lib/modules/2.6.31.14-0.1-desktop/updates/net/wireless/cfg80211.ko ieee80211_regdom=DE
insmod /lib/modules/2.6.31.14-0.1-desktop/updates/compat/compat_firmware_class.ko 
insmod /lib/modules/2.6.31.14-0.1-desktop/kernel/drivers/pcmcia/pcmcia_core.ko 
insmod /lib/modules/2.6.31.14-0.1-desktop/updates/compat/compat.ko 
insmod /lib/modules/2.6.31.14-0.1-desktop/updates/net/mac80211/mac80211.ko 
insmod /lib/modules/2.6.31.14-0.1-desktop/updates/drivers/net/wireless/iwlwifi/iwlcore.ko 
insmod /lib/modules/2.6.31.14-0.1-desktop/updates/drivers/net/wireless/iwlwifi/iwlagn.ko 
FATAL: Error inserting iwlagn (/lib/modules/2.6.31.14-0.1-desktop/updates/drivers/net/wireless/iwlwifi/iwlagn.ko): Invalid module format

Soviel dazu, das geht ins Auge.

# depmod 
WARNING: Couldn't find symtab and strtab in module /lib/modules/2.6.31.14-0.1-desktop/updates/drivers/net/wireless/iwlwifi/iwlagn.ko

Das ist deutlich.

OK, ich hab nur schnell ins Spec-File geschaut. --strip-debug sollte wohl verwendet werden.

Ich glaube, nur:


strip -d <file.ko>

Ich hab das strip ohne -d bei einem Modul probiert, dass in der Initrd ist,
und mkinitrd meckert beim neu erstellen der RamDisk in dem Fall:
WARNING: Couldn’t find symtab and strtab in module <…>

Ist -d nicht das gleiche? Hab gerade nur eine Debian man-page hier, aber da steht:

   -s
   --strip-all
       Remove all symbols.

   -g
   -S
   -d
   --strip-debug
       Remove debugging symbols only.

   --strip-unneeded
       Remove all symbols that are not needed for relocation processing.

Wie auch immer: Vielen Dank für den Tip, --strip-debug hat den gewünschten Erfolg gebracht (563 MB → 83 MB) und die Kiste bootet noch. mkinitrd hat auch problemlos funktioniert :slight_smile: