связь компилятора c и стандартной библиотеки c - PullRequest
0 голосов
/ 22 мая 2018

В последнее время я много читал о том, как функции glibc переносят системные вызовы в linux.Однако мне интересно узнать об отношениях между glibc и компилятором GNU C.
Допустим, например, что я хотел написать свою собственную реализацию стандарта C и написать новую библиотеку под названием "newglibc", и я немного изменил вещи.Как например я беру больше проверок и действий до и после системных вызовов.Должен ли я написать новый компилятор?Или я смогу использовать тот же компилятор GNU GCC?

Если компилятор полностью отделен от библиотеки, то кто-то ТЕОРЕТИЧЕСКИ сможет использовать gcc в системе Windows, если сможет превратить его в .exe и предоставить стандартную библиотеку C, которую предоставляет Windows?
Спасибо

1 Ответ

0 голосов
/ 22 мая 2018

Ядро 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» для среды, в которой вы работаете, но не все, к сожалению.

Если это не проясняет, пожалуйста, дайте нам знать, что все еще неясно.

...