2010-04-20 4 views
6

Почему ядро ​​Linux может компилироваться только с GCC? Какие расширения GNU C действительно необходимы для некоторых проектов и почему?Какие расширения GNU C доступны, которые нетривиальны для реализации на C99?

+0

Если вы соскучились, вы можете найти вопрос со ссылками на другие компиляторы, которые успешно создали linux. 'tcc' может сделать это для некоторых версий ядра, по крайней мере. – dmckee

+1

Название и вопрос не очень хорошо совпадают. –

+0

dmckee: Ядро Linux должно быть исправлено немного, чтобы его можно было построить с помощью tcc. – Yktula

ответ

8

В этой статье объясняются используемые расширения: GCC hacks in the Linux kernel. Некоторые из них тривиальны, некоторые из них (в основном, оптимизационные трюки).

1

GCC поддерживает Nested Functions, которые не являются частью стандарта C99. Тем не менее, необходим некоторый анализ, чтобы увидеть, насколько распространены они на самом деле в ядре linux.

0

Я думаю, что это не они действительно это необходимо. Просто есть много полезных, а переносимость кросс-компиляторов - это не проблема для ядра Linux, чтобы отказаться от тонкостей. Не говоря уже о том, сколько работы потребуется, чтобы избавиться от использования расширений.

2

Ядро Linux было записано для компиляции GCC, поэтому стандартное соответствие никогда не было целью для разработчиков ядра.

И если GCC предлагает несколько полезных расширений, которые упрощают или скомпилировали ядро ​​с меньшим или более быстрым преобразованием, было бы естественным выбором использовать эти расширения.

7

Вот несколько расширений GCC ядро ​​Linux использует:

  • рядный сборки
  • GCC, встроенные команды, такие как __builtin_expect, __ builtin_constant, __ builtin_return_address
  • функция атрибутов указать, например, (например, __attribute __ ((regparm (0)), __ атрибут __ ((упакованный, выровненный (PAGE_SIZE)))))
  • конкретный код в зависимости от предопределенных макросов gcc (например, обходные пути для некоторых ошибок gcc в некоторых версиях)
  • диапазоны в случае переключателя (случай 8 ... 15 :)

Вот еще несколько: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/

Большая часть этих особенностей GCC очень зависит от архитектуры, или стало возможным из-за того, как GCC является реализован и, вероятно, не имеет смысла указываться стандартом C. Другие - просто удобные расширения для C. Поскольку ядро ​​Linux построено на основе этих расширений, другие компиляторы должны предоставить те же расширения, что и gcc, чтобы иметь возможность строить ядро.

Это не то, что Linux имел, чтобы полагаться на эти особенности gcc, например. ядро NetBSD очень мало связано с конкретными материалами gcc.