2014-05-17 11 views
8

Jestem przyzwyczajony do używania -std=c99 do włączania funkcji c99 podczas kompilowania kodu aplikacji.Dlaczego muszę używać gnu99 zamiast c99, aby skompilować moduł jądra?

Ostatnio śledziłem kilka podstawowych przykładów modułów jądra i dodałem ccflags-y := -std=c99 do pliku Makefile. Jednak to spowodowało 17K wierszy błędów, kiedy próbowałem zrobić. gnu99 działa idealnie.

Jaka jest różnica między gnu99 i c99, na których opiera się kod jądra?

+1

+1. I nie jesteś pierwszy, który zauważy. Zobacz http://llvm.linuxfoundation.org/ – 0xC0000022L

+0

Zasadniczo, jądro używa rozszerzeń GCC i nie kompiluje się, gdy są wyłączone. –

+0

'Jaka jest różnica między gnu99 i c99, na których opiera się kod jądra?'. Myślę, że sam możesz znaleźć te różnice. Jest to z dokumentu gcc doc: 'GNU C udostępnia kilka funkcji językowych, których nie można znaleźć w normie ISO C. (Opcja -pedantic kieruje GCC, aby wydrukować komunikat ostrzegawczy, jeśli którakolwiek z tych funkcji jest używana.)'. Więc zbuduj jądro za pomocą 'gnu99', ale dodaj' ccflags-y: = -pedantic'. A następnie przeanalizuj ostrzeżenia. Jest to z dokumentu gcc: https://gc.gnu.org/onlinedocs/gcc-4.7.2/gcc/C-Extensions.html#C-Extensions –

Odpowiedz

1

Jądro Linux używa wielu rozszerzeń GCC, tj. Język C używany w jądrze nie jest zgodny ze standardami, jest to nadzbiór, który zawiera rozszerzenie GCC. Stąd GNU99 jest opcją kompilatora, którą należy przekazać.

+1

Właściwie to samo jądro Linuxa zostało zbudowane przy użyciu gnu89, a nie gnu99, ze względu na różnice semantyczne (takie jak omawiane tutaj: [http://www.kernelhub.org/?p=2&msg=606456](http://www.kernelhub.org/?p=2&msg=606456)). W związku z tym gnu89 powinien prawdopodobnie być również preferowany jako standard podczas tworzenia modułów jądra, ponieważ nagłówki trybu jądra będą prawdopodobnie opierały się na tym standardzie. –

Powiązane problemy