Каким образом ядро Linux может скомпилировать только с GCC? Что GNU C расширения действительно необходимы для некоторых проектов и почему?
Думаю, это не они на самом деле то, что нужно. Просто есть много полезных, и переносимость кросс-компилятора - не такая уж большая проблема для ядра Linux, чтобы отказаться от тонкостей. Не говоря уже об огромном объеме работы, который потребуется, чтобы избавиться от расширений.
Вот пара расширений gcc, которые использует ядро Linux:
Вот еще несколько: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/
Большая часть этих особенностей gcc сильно зависят от архитектуры или становятся возможными из-за того, как реализован gcc, и, вероятно, не имеют смысла указывать в стандарте C. Другие - просто удобные расширения C. Поскольку ядро Linux построено на основе этих расширений, другие компиляторы должны предоставлять те же расширения, что и gcc, чтобы иметь возможность собирать ядро.
Дело не в том, что Linux должен был полагаться на эти функции gcc, например ядро NetBSD очень мало полагается на специфические вещи gcc.
Ядро Linux было написано для компиляции GCC, поэтому стандартное соответствие никогда не было целью разработчиков ядра.
И если GCC предлагает несколько полезных расширений, которые упрощают кодирование, или скомпилированное ядро меньше или быстрее, использование этих расширений было естественным выбором.
GCC поддерживает вложенных функций , которые не являются частью стандарта C99. Тем не менее, требуется некоторый анализ, чтобы увидеть, насколько они распространены в ядре Linux.