2014-05-17 9 views
8

Ich bin es gewohnt, -std=c99 zu verwenden, um c99 Features beim Kompilieren von Anwendungscode zu aktivieren.Warum muss ich gnu99 anstelle von c99 verwenden, um ein Kernelmodul zu kompilieren?

Vor kurzem habe ich folgenden einige grundlegende Kernel-Modul Beispiele gewesen, und ccflags-y := -std=c99 zum Make-Datei hinzugefügt. Dies führte jedoch zu 17K-Fehlerzeilen, wenn ich versuchte zu machen. gnu99 funktioniert perfekt.

Was ist der Unterschied zwischen gnu99 und c99, die Kernel-Code stützt sich auf?

+1

+1. Und du bist nicht der Erste, der es bemerkt. Siehe http://llvm.linuxfoundation.org/ – 0xC0000022L

+0

Grundsätzlich verwendet der Kernel GCC-Erweiterungen und kompiliert nicht, wenn sie ausgeschaltet sind. –

+0

'Was ist der Unterschied zwischen gnu99 und c99, auf den sich der Kernel-Code stützt?'. Ich denke, Sie können diese Unterschiede selbst finden. Dies ist von gcc doc: 'GNU C bietet mehrere Sprachfunktionen, die nicht in ISO-Standard C gefunden wurden. (Die Option -pedantic weist GCC an, eine Warnmeldung zu drucken, wenn eines dieser Features verwendet wird.)'. Also, baue den Kernel mit 'gnu99', füge aber' ccflags-y: = -pedantic' hinzu. Und dann analysiere Warnungen. Dies ist von doc gcc: https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/C-Extensions.html#C-Extensions –

Antwort

1

Der Linux-Kernel verwendet viele GCC-Erweiterungen, d. H. Die im Kernel verwendete C-Sprache ist nicht standardkonform, es ist eine Obermenge, die die GCC-Erweiterung enthält. Daher ist GNU99 die Compiler-Option, die übergeben werden muss.

+1

Eigentlich sich der Linux-Kernel ist gnu89 gebaut mit, nicht gnu99, wegen der semantischen Unterschiede (wie der hier besprochene: [http://www.kernelhub.org/?p=2&msg=606456](http://www.kernelhub.org/?p=2&msg=606456)). Daher sollte gnu89 wahrscheinlich auch als Standard bei der Erstellung von Kernel-Modulen bevorzugt werden, da die enthaltenen Kernel-Mode-Header wahrscheinlich auf diesem Standard basieren. –