Почему glibc поддерживается отдельно от GCC?

13

GCC - это компилятор C. Glibc - это библиотека C Однако не является ли это абсолютной необходимостью для компилятора и стандартной библиотеки, связанных вместе как реализация C?

Например, библиотека C содержит ABI и специфичные для компилятора вещи, такие как <limits.h>, <stdint.h>и т. Д., Которые отличаются между компиляторами и API. И такие детали, как «как вызвать основную функцию», также зависят от компилятора, но на самом деле эти детали предоставляются libc.soв системе Linux. Например, если я изменю компилятор для работы с другим ABI, например, с использованием int8 байтов, библиотека C больше не будет работать, потому что содержимое в нем <limits.h>станет неправильным.

Майкл Цанг
источник

Ответы:

20

Одной из причин является то, что GCC может быть построена и использоваться (например , проприетарные Unix систем , таких как MacOSX, Solaris, HP - UX или некоторых FreeBSD) систем , имеющих свою собственную C стандартную библиотеку .

Даже в Linux вы можете иметь стандартную библиотеку C, которая не является GNU Glibc . В частности, вы можете собрать GCC (или использовать его) в системах Linux с musl-libc или с Bionic (системы Android) или с dietlibc и т. Д. А система Linux может иметь GNU Glibc и использовать какой-либо другой компилятор C (например, Clang). или TinyCC).

Кроме того, библиотека C сильно зависит от ядра Linux. Некоторым старым версиям ядра может потребоваться определенный вид (или версия)libc

И GCC может быть собран как кросс-компилятор .

И такие детали, как «как вызвать mainфункцию», также зависят от компилятора, но на самом деле эти детали предоставляются libc.soв системе Linux.

Это не совсем правильно. mainФункция вызывается (в среде хоста) в crt0 вещи, некоторые из которых обеспечивается GCC (например , /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.oна моем Debian / Sid / x86-64 это из libgcc-6-devпакета). Читайте также оlibgcc

На самом деле, существует некоторая наполовину скрытая связь между libcGCC, например, потому что многие libcзаголовки (необязательно) используют некоторые встроенные функции gcc или атрибуты функций .

(следовательно, разработчики GCC и разработчики GNU libc должны взаимодействовать)

.... если я изменю компилятор для работы с другим ABI ...

Вам нужно ... /configureССАГПЗ компилятор и восстановить его, и вы , возможно , даже нужно пропатчить на GCC компилятора (описать ваше ABI и соглашение о вызовах ). X32 ABI является хорошим примером.

Наконец, некоторые участники или сопровождающие GCC (включая меня) подписали уступку авторского права, которая охватывает GCC, но не GNU glibc.

(относительно лицензии GCC, внимательно прочитайте исключение библиотеки времени выполнения GCC )

Обратите внимание, что некоторые стандартные заголовки, такие как <limits.h>или <stdint.h>предоставляются GCC; другие, например <stdlib.h>, «исправлены» во время сборки GCC: процедура сборки компилятора берет их из реализации Libc и исправляет их. Тем не менее, другие стандартные заголовки (возможно, <stdio.h>и внутренние заголовки, которые он включает) взяты из libc. Узнайте больше о GCC FIXINCLUDES и Fixed Header Files .

(эта вещь включает в себя то, что я (Базилик) все еще плохо понимаю)

Вы можете скомпилировать, gcc -v -Hчтобы более точно понять, какие именно программы запускаются (поскольку gccэто драйвер, запускающий cc1компилятор, ld& collect2linkers, asассемблер и т. Д.) И какие заголовки включены, какие библиотеки и объектные файлы связаны (даже неявно, включая стандартную библиотеку C и crt0 ). Узнайте больше о вариантах GCC .

Кстати, вы можете использовать стандартную библиотеку C, отличную от той, которую ожидает ваш GCC или для которой она была создана (например, musl-libcили некоторая dietlibc ), минуя соответствующие дополнительные аргументы gcc...

Василий Старынкевич
источник
1
Правильный ответ, даже если не правильный дизайн. Вот почему MSVC ++ может компилировать код C ++ 11 / C ++ 14 для операционных систем до 2011/2014, но GCC обычно не может.
MSalters
Что вы подразумеваете под «неправильным дизайном»? И я не уверен, что GCC не может скомпилировать код C ++ 14 для старых ОС (однако вам может понадобиться скомпилировать недавний GCC на этой более старой ОС).
Старынкевич
Согласно ISO C, Стандартная библиотека C является частью компилятора. То же самое относится и к библиотеке C ++. Теперь проблема в том, что приложения, созданные с использованием новой версии GCC, будут зависеть от glibc ОС, в которой они созданы, что может быть новее, чем glibc в целевой системе. Лучшее решение, вероятно, основывалось бы на том, gcclibcчто основано на библиотеках ОС, но имеет версию как часть GCC, а не ОС.
MSalters
Вы уверены, что в стандартах C11 или C ++ 14 упоминается слово «компилятор»? AFAIU говорят о «внедрении» (которое может даже не быть программным обеспечением)
Старынкевич
1
Некоторые заголовки, как <stdint.h>или <limits.h>действительно предоставляются GCC. Другие заголовки, такие <stdlib.h>как взятые из библиотеки C и «исправленные» во время сборки GCC.
Старынкевич,
-5

Короткий ответ заключается в том, что если бы они были «объединены» вместе, glibc был бы лицензирован по лицензии GPL *, и поэтому он был бы совершенно непригоден для проприетарных проектов. В то время как проект FSF и GNU не любит проприетарного программного обеспечения, glibc получил лицензию LGPL в качестве стратегического выбора для продвижения внедрения GCC и экосистемы свободного программного обеспечения. GCC фактически лицензируется по GPL с определенным исключением связывания во время выполнения, потому что ситуация несколько мутная. glibc лицензируется в соответствии с LGPL для разрешения разумных ситуаций с общей библиотекой.

https://www.gnu.org/licenses/gcc-exception-faq.html

Кроме того, в glibc есть все виды прокладок и других компонентов для его адаптации к различным операционным системам, и его распространение в том же пакете, что и в gcc, также приведет к путанице.

* В качестве альтернативы, GCC может быть лицензирован по какой-либо другой лицензии GPL, хотя мысли FSF об этом будут соответствовать принципу «над моим мертвым телом».

как зовут
источник
3
Извините, но этот ответ ИМХО неверен. «Объединение» не означает, что glibc является «производной работой» от GCC в смысле, описанном в GPL. Например, тонны программных пакетов, использующих разные лицензии с открытым исходным кодом, «объединяются» в каждом дистрибутиве Linux, тем не менее, эти пакеты не нарушают GPL.
Док Браун
Почему объединение gcc и glibc заставляет glibc находиться под GPL? Насколько я понимаю, комплекты не являются «комбинированной работой», поэтому GPL не пересекает границы. Редактировать: что сказал Док Браун :-)
Филипп Кендалл