Одной из причин является то, что 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
...