Ядро Linux, библиотека GNU C ("glibc") и коллекция компиляторов GNU (gcc) - это три отдельных проекта разработки.Они часто используются все вместе, но это не обязательно.Те, у кого "GNU" в названии, официально являются частью проекта GNU;Linux нет.
Стандарт C не проводит различий между «компилятором» и «библиотекой»;это все одна «реализация» для комитета.Во многом историческая случайность, что GCC - это отдельный проект разработки от glibc, но мотивированный: когда-то каждый коммерческий вариант Unix поставлялся со своей собственной библиотекой C и компилятором, и они были ужасны ,90% ошибок по объему было типичным.GNU начал свою работу с предоставления менее ужасной замены компилятору (и утилитам оболочки, которые также были ужасны).
Замена компилятора в традиционном коммерческом Unix намного проще, чем замена библиотеки C, потому чтоБиблиотека C - это не только функции, определенные в разделе 7 стандарта C;как вы заметили, он также обеспечивает интерфейс ядра самого низкого уровня, и часто это не очень хорошо документировано.Когда-то glibc хотя бы поддерживал кучу этих Unix-ов, но в настоящее время его можно использовать только с Linux и экспериментальным ядром под названием Hurd.В отличие от этого, GCC поддерживает десятки разных процессоров и ядер, а Linux поддерживает десятки разных процессоров.
Если вы пишете свою собственную библиотеку C и / или ядро, то написать «бэкэнд» относительно легко, поэтомучто GCC может генерировать для них код в виде кросс-компилятора, и несколько сложнее перенести GCC на run в этой среде.Вам также может понадобиться написать серверную часть для ассемблера и компоновщика, которые являются еще четвертым проектом («GNU Binutils»).Перенос glibc на новый процессор под управлением Linux - большая, но простая задача;портирование glibc на новую операционную систему hard , особенно если эта ОС не является Unix-ишем.(Windows определенно не является Unix-ишем, настолько, что когда Microsoft захотела упростить запуск программ, написанных для Unix под Windows, путь наименьшего сопротивления был для внутреннего использования.клон ядра Linux на сторону ядра NT . Я не придумываю это.)
Если вы напишите свой собственный C-компилятор, вы должны будете заставить его соответствовать ожиданиямбиблиотека и ядро, для которого он генерирует код.Многое из этого описано в спецификации «ABI» для среды, в которой вы работаете, но не все, к сожалению.
Если это не проясняет, пожалуйста, дайте нам знать, что все еще неясно.