Какие доступны расширения GNU C, которые нетривиально реализовать в C99? - PullRequest
7 голосов
/ 21 апреля 2010

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

Ответы [ 5 ]

10 голосов
/ 21 апреля 2010

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

8 голосов
/ 21 апреля 2010

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

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

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

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

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

2 голосов
/ 21 апреля 2010

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

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

1 голос
/ 21 апреля 2010

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

0 голосов
/ 21 апреля 2010

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

...