2014-05-17 7 views
8

Sono abituato a utilizzare -std=c99 per abilitare le funzioni c99 durante la compilazione del codice dell'applicazione.Perché devo usare gnu99 invece di c99 per compilare un modulo del kernel?

Recentemente ho seguito alcuni esempi di moduli del kernel di base e ho aggiunto ccflags-y := -std=c99 al makefile. Tuttavia questo ha comportato errori di 17K righe quando ho provato a fare. gnu99 funziona perfettamente.

Qual è la differenza tra gnu99 e c99 su cui si basa il codice del kernel?

+1

+1. E tu non sei il primo a notare. Vedi http://llvm.linuxfoundation.org/ – 0xC0000022L

+0

Fondamentalmente, il kernel usa le estensioni GCC e non si compila quando sono disattivate. –

+0

'Qual è la differenza tra gnu99 e c99 su cui si basa il codice del kernel?'. Penso che tu possa trovare queste differenze da solo. Questo è da gcc doc: 'GNU C fornisce diverse funzionalità linguistiche non presenti nello standard ISO C. (L'opzione -pedantic indica a GCC di stampare un messaggio di avviso se viene utilizzata una di queste funzionalità.)'. Quindi, compilare il kernel con 'gnu99' ma aggiungere' ccflags-y: = -pedantic'. E poi analizzare gli avvertimenti. Questo è dal doc di gcc: https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/C-Extensions.html#C-Extensions –

risposta

1

Il kernel linux utilizza molte estensioni GCC, ad esempio, il linguaggio C utilizzato nel kernel non è conforme agli standard, è un superset che include l'estensione GCC. Quindi GNU99 è l'opzione del compilatore che deve essere passata.

+1

In realtà, il kernel Linux stesso è costruito usando gnu89, non gnu99, a causa di differenze semantiche (come quella discussa qui: [http://www.kernelhub.org/?p=2&msg=606456](http://www.kernelhub.org/?p=2&msg=606456)). Quindi, probabilmente gnu89 dovrebbe anche essere preferito come standard quando si creano i moduli del kernel, dal momento che le intestazioni kernel-mode probabilmente si baseranno su questo standard. –

Problemi correlati