Одной из причин является то, что 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
На самом деле, существует некоторая наполовину скрытая связь между libc
GCC, например, потому что многие 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
& collect2
linkers, as
ассемблер и т. Д.) И какие заголовки включены, какие библиотеки и объектные файлы связаны (даже неявно, включая стандартную библиотеку C и crt0 ). Узнайте больше о вариантах GCC .
Кстати, вы можете использовать стандартную библиотеку C, отличную от той, которую ожидает ваш GCC или для которой она была создана (например, musl-libc
или некоторая dietlibc ), минуя соответствующие дополнительные аргументы gcc
...
gcclibc
что основано на библиотеках ОС, но имеет версию как часть GCC, а не ОС.<stdint.h>
или<limits.h>
действительно предоставляются GCC. Другие заголовки, такие<stdlib.h>
как взятые из библиотеки C и «исправленные» во время сборки GCC.Короткий ответ заключается в том, что если бы они были «объединены» вместе, 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 об этом будут соответствовать принципу «над моим мертвым телом».
источник