Nochmal: Kernel compilieren unter SuSE 10.0
Hallo, da beim ersten Mal leider niemand geantwortet hat, probiere ich es noch einmal. Ich muss seit langem mal wieder einen Kernel selbst compilieren (bzw. macht das ein Skript, um einige Module für den PC-Emulator Parallels zu erstellen). Ich habe bei mir die Kernel-Sourcen von der DVD installiert und mit YOU einige Patches eingespielt. Dann habe ich versucht, "make cloneconfig" und "make prepare-all" aufzurufen. Der erste Befehl funktioniert auch noch, aber beim zweiten kommt folgende Fehlermeldung: CHK /usr/src/linux-2.6.13-15.7/include/linux/version.h CC arch/i386/kernel/asm-offsets.s In file included from ./include/asm/system.h:5, from ./include/asm/processor.h:18, from ./include/asm/thread_info.h:17, from ./include/linux/thread_info.h:21, from ./include/linux/spinlock.h:12, from ./include/linux/capability.h:45, from ./include/linux/sched.h:7, from arch/i386/kernel/asm-offsets.c:7: ./include/linux/kernel.h:10:20: error: stdarg.h: Datei oder Verzeichnis nicht gefunden In file included from ./include/asm/system.h:5, from ./include/asm/processor.h:18, from ./include/asm/thread_info.h:17, from ./include/linux/thread_info.h:21, from ./include/linux/spinlock.h:12, from ./include/linux/capability.h:45, from ./include/linux/sched.h:7, from arch/i386/kernel/asm-offsets.c:7: ./include/linux/kernel.h:102: error: syntax error before ‘va_list’ ./include/linux/kernel.h:106: error: syntax error before ‘va_list’ ./include/linux/kernel.h:110: error: syntax error before ‘va_list’ ./include/linux/kernel.h:115: error: syntax error before ‘va_list’ ./include/linux/kernel.h:127: error: syntax error before ‘va_list’ make[1]: *** [arch/i386/kernel/asm-offsets.s] Fehler 1 make: *** [arch/i386/kernel/asm-offsets.s] Fehler 2 Offensichtlich wird die Datei stdarg.h nicht gefunden, die aber im Verzeichnis /usr/lib/gcc/i586-suse-linux/4.0.2/include/ vorhanden ist. Muss ich erst noch irgendwas einstellen, bevor das funktioniert? Vielen Dank für jeden Hinweis, Ralf.
Ralf Schneider wrote:
[...]
Dann habe ich versucht, "make cloneconfig" und "make prepare-all" aufzurufen.
Wenn Du einen Kernel selbst compilieren willst, brauchst Du kein "make prepare-all". Das ist im Prinzip nur noetig, um den Kernel-Source-Tree fuer das Compilieren externer Kernel-Module vorzubereiten...
Der erste Befehl funktioniert auch noch, aber beim zweiten kommt folgende Fehlermeldung:
[...] ./include/linux/kernel.h:10:20: error: stdarg.h: Datei oder Verzeichnis nicht gefunden [...]
Entweder hast Du nicht alle relevanten GCC Pakete installiert, oder Deine GCC Installation ist fehlerhaft, oder es liegt ein sonstiges Problem auf/mit Deinem System vor. Ich habe mit beiden oben genannten make-Befehlen bei Kernel 2.6.13-15.7 auf einer SuSE 10.0 keine Probleme. Wie ueblich in solchen Faellen: schaue in /var/log/messages nach Auffaelligem, ueberpruefe das Filesystem, ueberpruefe den Speicher (memtest), ueberpruefe die GCC Installation, ueberpruefe den Kernel-Source-Tree, usw. usw. CU, Th.
Am Donnerstag, 5. Januar 2006 23:40 schrieb Thomas Hertweck:
Dann habe ich versucht, "make cloneconfig" und "make prepare-all" aufzurufen.
Wenn Du einen Kernel selbst compilieren willst, brauchst Du kein "make prepare-all". Das ist im Prinzip nur noetig, um den Kernel-Source-Tree fuer das Compilieren externer Kernel-Module vorzubereiten...
Genau das will ich ja machen.
./include/linux/kernel.h:10:20: error: stdarg.h: Datei oder Verzeichnis nicht gefunden [...]
Wie ueblich in solchen Faellen: schaue in /var/log/messages nach Auffaelligem, ueberpruefe das Filesystem, ueberpruefe den Speicher (memtest), ueberpruefe die GCC Installation, ueberpruefe den Kernel-Source-Tree, usw. usw.
Also, ich finde da nichts auffälliges. Den Kernel-Source-Tree habe ich extra neu installiert. Übrigens, andere Software zu compilieren funktioniert. Nur beim Kernel scheints Probleme zu geben. Ist schon komisch. Die Include-Files sind ja auch da, nur scheinen Sie nicht gefunden zu werden. Kann ich dem Kernel-Makefile nicht irgendwie sagen, wo die Include-Files liegen? Wäre nett, wenn mir jemand einen Tip geben könnte. Vielen Dank, Ralf.
Ralf Schneider schrieb:
Am Donnerstag, 5. Januar 2006 23:40 schrieb Thomas Hertweck:
Dann habe ich versucht, "make cloneconfig" und "make prepare-all" aufzurufen.
Wenn Du einen Kernel selbst compilieren willst, brauchst Du kein "make prepare-all". Das ist im Prinzip nur noetig, um den Kernel-Source-Tree fuer das Compilieren externer Kernel-Module vorzubereiten...
Genau das will ich ja machen.
./include/linux/kernel.h:10:20: error: stdarg.h: Datei oder Verzeichnis nicht gefunden [...]
Wie ueblich in solchen Faellen: schaue in /var/log/messages nach Auffaelligem, ueberpruefe das Filesystem, ueberpruefe den Speicher (memtest), ueberpruefe die GCC Installation, ueberpruefe den Kernel-Source-Tree, usw. usw.
Also, ich finde da nichts auffälliges. Den Kernel-Source-Tree habe ich extra neu installiert.
Übrigens, andere Software zu compilieren funktioniert. Nur beim Kernel scheints Probleme zu geben. Ist schon komisch. Die Include-Files sind ja auch da, nur scheinen Sie nicht gefunden zu werden. Kann ich dem Kernel-Makefile nicht irgendwie sagen, wo die Include-Files liegen?
Wäre nett, wenn mir jemand einen Tip geben könnte.
Vielen Dank, Ralf.
Also, ich glaube, Du musst Dich erst einmal entscheiden, ob Du Recht behalten willst, oder ob Du Hilfe finden willst. Wenn Dir Thomas Hertweck schon schreibt . . . . . . , was besseres kannst Du doch wirklich nicht haben !!! Siehe auch: http://www.thomashertweck.de/kernel.html Wenn Du dann das Kompilieren eines Kernels gelernt hast, dann wirst Du auch noch lernen können, wie man externe Kernel-Module kompiliert/installiert. Dafür enthalten dann die Software-Pakete entsprechende Hilfen. An Deinen künftigen Fragen wird man erkennen können, wieviel Du schon dazugelernt hast. Wäre nett, wenns richtig bei Dir ankäme. Meine es wirklich nett. Gruß Arno
Am Freitag, 6. Januar 2006 20:25 schrieb Arno Jung:
Also, ich glaube, Du musst Dich erst einmal entscheiden, ob Du Recht behalten willst, oder ob Du Hilfe finden willst.
Also ums Recht behalten geht's mir wirklich nicht. Was sollte ich davon haben :-)
Wenn Dir Thomas Hertweck schon schreibt . . . . . . , was besseres kannst Du doch wirklich nicht haben !!!
Siehe auch: http://www.thomashertweck.de/kernel.html
Wenn Du dann das Kompilieren eines Kernels gelernt hast, dann wirst Du auch noch lernen können, wie man externe Kernel-Module kompiliert/installiert. Dafür enthalten dann die Software-Pakete entsprechende Hilfen.
Also, ich glaube am Kernel compilieren grundsätzlich liegts nicht. Ich habe meinen ersten Kernel compiliert, da hieß die Version 0.99pl<irgendwas> und war wesentlich komplizierter als heute. Nur, der letzte Kernel-Compile ist schon eine Weile her, das muss ich zugeben ...
An Deinen künftigen Fragen wird man erkennen können, wieviel Du schon dazugelernt hast.
Naja, man kann immer was dazu lernen... Übrigens, die Seite, die Du oben zitierst kannte ich natürlich schon, aber da habe ich auch keinen Hinweis gefunden, der mit bei meinem Problem helfen konnte (oder sollte ich was übersehen haben?). Normalerweise sollte ja nach einer Installation ein "make cloneconfig" und ein anschließendes "make" funktionieren, oder? Tut es bei mir aber leider nicht. Und ich habe keine Idee, warum nicht. Sollte der GCC nicht seine eigenen Includes finden? Oder kann es an irgendwelchen Environment-Variablen liegen? Aber an welchen? Danke für jeden Hinweis, Ralf.
Am Freitag, 6. Januar 2006 19:24 schrieb Ralf Schneider:
Übrigens, andere Software zu compilieren funktioniert. Nur beim Kernel scheints Probleme zu geben. Ist schon komisch. Die Include-Files sind ja auch da, nur scheinen Sie nicht gefunden zu werden. Kann ich dem Kernel-Makefile nicht irgendwie sagen, wo die Include-Files liegen?
Ich habe jetzt mal ein kleines Test-Programm geschrieben, des ebenfalls die
stdarg.h einbindet, und das funktioniert. Das sieht so aus:
#include
Hallo, Am Fri, 06 Jan 2006, Ralf Schneider schrieb:
Am Freitag, 6. Januar 2006 19:24 schrieb Ralf Schneider:
Übrigens, andere Software zu compilieren funktioniert. Nur beim Kernel scheints Probleme zu geben. Ist schon komisch. Die Include-Files sind ja auch da, nur scheinen Sie nicht gefunden zu werden. Kann ich dem Kernel-Makefile nicht irgendwie sagen, wo die Include-Files liegen?
Ich habe jetzt mal ein kleines Test-Programm geschrieben, des ebenfalls die stdarg.h einbindet, und das funktioniert. Das sieht so aus:
Du hast uebersehen, dass der Kernel mit '-nostdinc' kompiliert wird. Da sollte stdarg.h aber schon gefunden werden, denn das gehoert ja zum gcc. Verwende mal: make V=1 HOSTCC="gcc -v" CC="gcc -v" TARGET 2>&1 | tee __make.log statt 'make'. Und dann zeig die Ausgabe des Befehls, der zum Fehler fuehrt. -dnh --
"have the name field as dozens of drop boxes, each of which contain A-Za-z" I am so impressed with your originality, Niklas, that I have dispatched an assassin to quiet you before some Website Duhveloper hears your wonderful idea. -- >N. Karlsson and dpm
David Haller wrote:
[...] Du hast uebersehen, dass der Kernel mit '-nostdinc' kompiliert wird. Da sollte stdarg.h aber schon gefunden werden, denn das gehoert ja zum gcc.
Eben, das Verhalten ist definitiv nicht normal und sollte nichts mit "-nostdinc" zu tun haben. Ich habe mit der gleichen Kommandosequenz auf SuSE 10 auch keine Probleme...
Verwende mal:
make V=1 HOSTCC="gcc -v" CC="gcc -v" TARGET 2>&1 | tee __make.log
statt 'make'. Und dann zeig die Ausgabe des Befehls, der zum Fehler fuehrt.
Aah, da war jemand schneller als ich... ;-) TARGET war uebrigens im Falle von Ralf ein schlichtes "prepare-all". Cheers, Th.
Am Freitag, 6. Januar 2006 22:57 schrieb Ralf Schneider:
Es scheint also an den Kernel-Sourcen zu liegen. Wo könnte ich dort weitersuchen, um das Problem langsam einzugrenzen?
Ich habe eine Lösung gefunden. Naja, vielleicht eher ein Workaround :-) Wenn ich vor dem Aufruf von "make" die Environment-Variable GCC_EXEC_PREFIX setze: export GCC_EXEC_PREFIX=/usr/lib/gcc/i586-suse-linux/4.0.2/ dann funktioniert das Compilieren des Kernels und auch die Kernel-Module von Parallels werden anstandslos übersetzt. Es ist mir allerdings ein Rätsel, warum ich explizit diese Variable setzen muss. Hat da jemand eine Idee? Wie gesagt, man kann immer was dazu lernen :-) Viele Grüße, Ralf.
Ralf Schneider wrote:
Am Donnerstag, 5. Januar 2006 23:40 schrieb Thomas Hertweck:
[...] Wenn Du einen Kernel selbst compilieren willst, brauchst Du kein "make prepare-all". Das ist im Prinzip nur noetig, um den Kernel-Source-Tree fuer das Compilieren externer Kernel-Module vorzubereiten...
Genau das will ich ja machen.
Dein Subject sagte "Kernel compilieren unter SuSE 10.0", also ging ich davon aus, dass Du einen (kompletten) Kernel compilieren willst und nicht ein einziges Kernel-Modul. Sorry fuer das Missverstaendnis.
[...] Übrigens, andere Software zu compilieren funktioniert. Nur beim Kernel scheints Probleme zu geben. Ist schon komisch. Die Include-Files sind ja auch da, nur scheinen Sie nicht gefunden zu werden. Kann ich dem Kernel-Makefile nicht irgendwie sagen, wo die Include-Files liegen?
Nein, diese include-Files im angegebenen Verzeichnis sollte der Compiler definitiv selbst finden. Versuche mal ein "make V=1 prepare-all" und sieh' Dir das Kommando an, was wirklich ausgefuehrt wird. Wenn es nicht geht, lass "make" aussen vor und fuehre das gleiche Kommando selbst im Terminal aus. Falls es dann gehen sollte, verbiegt Dein Kernel-Makefile etwas... Wie schon geschrieben: ich habe mit dem gleichen Kernel auf SuSE 10.0 keine Probleme, es liegt also irgendwie an Deinem System. Cheers, Th.
Am Samstag, 7. Januar 2006 12:57 schrieb Thomas Hertweck:
Nein, diese include-Files im angegebenen Verzeichnis sollte der Compiler definitiv selbst finden. Versuche mal ein "make V=1 prepare-all" und sieh' Dir das Kommando an, was wirklich ausgefuehrt wird. Wenn es nicht geht, lass "make" aussen vor und fuehre das gleiche Kommando selbst im Terminal aus. Falls es dann gehen sollte, verbiegt Dein Kernel-Makefile etwas... Wie schon geschrieben: ich habe mit dem gleichen Kernel auf SuSE 10.0 keine Probleme, es liegt also irgendwie an Deinem System.
Also, bei "make V=1 prepare-all" wird folgender Compiler-Aufruf ausgeführt: gcc -m32 -Wp,-MD,arch/i386/kernel/.asm-offsets.s.d -nostdinc -isystem ./include -D__KERNEL__ -Iinclude -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -Werror-implicit-function-declaration -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -pipe -msoft-float -mpreferred-stack-boundary=2 -fno-unit-at-a-time -march=i586 -mregparm=3 -mtune=i686 -Iinclude/asm-i386/mach-generic -Iinclude/asm-i386/mach-default -Wdeclaration-after-statement -Wno-pointer-sign -DKBUILD_BASENAME=asm_offsets -DKBUILD_MODNAME=asm_offsets -S -o arch/i386/kernel/asm-offsets.s arch/i386/kernel/asm-offsets.c Ist da irgendetwas auffällig an diesem Kommando? Viele Grüße, Ralf.
Ralf Schneider wrote:
[...]
Also, bei "make V=1 prepare-all" wird folgender Compiler-Aufruf ausgeführt:
gcc -m32 -Wp,-MD,arch/i386/kernel/.asm-offsets.s.d -nostdinc -isystem ./include -D__KERNEL__ -Iinclude -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -Werror-implicit-function-declaration -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -pipe -msoft-float -mpreferred-stack-boundary=2 -fno-unit-at-a-time -march=i586 -mregparm=3 -mtune=i686 -Iinclude/asm-i386/mach-generic -Iinclude/asm-i386/mach-default -Wdeclaration-after-statement -Wno-pointer-sign -DKBUILD_BASENAME=asm_offsets -DKBUILD_MODNAME=asm_offsets -S -o arch/i386/kernel/asm-offsets.s arch/i386/kernel/asm-offsets.c
Ist da irgendetwas auffällig an diesem Kommando?
Sorry fuer die spaete Antwort, ich bin gesundheitlich etwas angeschlagen. Was mit spontan auffaellt: bei mir sieht das Kommando auf einer SuSE 10.0 bei gleichem Kernel anderst aus! Insbesondere der Pfad bei der Option "-isystem" ist bei mir verschieden, er enthaelt naemlich bei mir genau den Pfad zum GCC-Verzeichnis, in dem die benoetigten Header-Files liegen, die bei Dir nicht gefunden werden... Der Pfad bei der Variablen "-isystem" wird im Makefile ueber "$(shell $(CC) -print-file-name=include)" gesetzt. Die Frage ist also, warum das Kommando bei Dir ein falsches Include Verzeichnis ergibt. Ueberpruefe mal, wie die entsprechende Stelle im Makefile bei Dir aussieht ("grep isystem Makefile" im Kernel-Source Tree sollte Dir eine entsprechende Ausgabe liefern). Was ergibt denn ein "gcc -print-file-name=include" an der Kommandozeile? Cheers, Th. PS: Wegen verspaeteter Antwort ausnahmesweise mit CC an den OP.
Am Samstag, 21. Januar 2006 20:09 schrieb Thomas Hertweck:
Sorry fuer die spaete Antwort, ich bin gesundheitlich etwas angeschlagen.
Na, dann wünsche ich Dir erst mal gute Besserung.
Was mit spontan auffaellt: bei mir sieht das Kommando auf einer SuSE 10.0 bei gleichem Kernel anderst aus! Insbesondere der Pfad bei der Option "-isystem" ist bei mir verschieden, er enthaelt naemlich bei mir genau den Pfad zum GCC-Verzeichnis, in dem die benoetigten Header-Files liegen, die bei Dir nicht gefunden werden... Der Pfad bei der Variablen "-isystem" wird im Makefile ueber "$(shell $(CC) -print-file-name=include)" gesetzt. Die Frage ist also, warum das Kommando bei Dir ein falsches Include Verzeichnis ergibt. Ueberpruefe mal, wie die entsprechende Stelle im Makefile bei Dir aussieht ("grep isystem Makefile" im Kernel-Source Tree sollte Dir eine entsprechende
Also, grep liefert mir folgende Zeile: NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) Sieht eigentlich so aus wie bei Dir, oder?
Ausgabe liefern). Was ergibt denn ein "gcc -print-file-name=include" an der Kommandozeile?
Dieses Kommando liefert bei mir: ./include Wenn ich mich als root einlogge, liefert das gleiche Kommando allerdings den kompletten Pfad zu den gcc-Inlcudes. Wodurch könnte das "verstellt" werden? Vielleicht kann mir jemand einen Tip geben wonach ich wo suchen soll. Viele Grüße, Ralf.
Ralf Schneider wrote:
[...] Also, grep liefert mir folgende Zeile:
NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
Sieht eigentlich so aus wie bei Dir, oder?
Ja.
[ gcc -print-file-name=include ]
Dieses Kommando liefert bei mir: ./include
Wenn ich mich als root einlogge, liefert das gleiche Kommando allerdings den kompletten Pfad zu den gcc-Inlcudes. Wodurch könnte das "verstellt" werden?
Kann ich Dir leider nicht sagen. Bei mir liefert das Kommando sowohl als User als auch als Root das GCC Include Verzeichnis. Schau Dir mal "man gcc" an und dort die Sektion "ENVIRONMENT", ob als User evtl. irgendwelche der dort genannten Variablen (falsch?) gesetzt sind. Vielleicht weiss ja einer der GCC Spezialisten, was hier los ist... Cheers, Th.
participants (4)
-
Arno Jung
-
David Haller
-
Ralf Schneider
-
Thomas Hertweck