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