Защо glibc се поддържа отделно от GCC?

GCC е C компилаторът. Glibc е C библиотеката. Въпреки това, не е абсолютно необходимо компилаторът и стандартната библиотека да бъдат включени като C реализация?

поддържа

Например библиотеката C съдържа ABI и специфични за компилатора неща като

  • , и т.н., което е между компилаторите и API. И подробности като „как да извикам основна функция“ също зависят от компилатора, но всъщност тези подробности се предоставят от libc.so на Linux система. Например, ако променя компилатора да работи с различен ABI, като int с 8 байта, библиотеката C ще спре да работи, защото данните
  • грешат.

    Една от причините е, че GCC може да бъде изградена и използвана в системи със собствена C стандартна библиотека (напр. Патентовани Unix системи като MacOSX, Solaris, HPUX или някои FreeBSD системи) .

    Дори в Linux можете да имате стандартна библиотека C, която не е GNU Glibc. По-специално, можете да създадете (или да използвате) GCC на Linux системи с musl-libc или с Bionic (Android системи) или с dietlibc и т.н. Linux система може да има GNU Glibc и да използва различен C компилатор (като Clang или TinyCC).

    В допълнение, библиотеката C е силно зависима от ядрото на Linux. Някои стари версии на ядрото може да изискват определен тип (или версия) на libc

    И подробности като „как да извикам основна функция“ също зависят от компилатора, но всъщност тези подробности се предоставят от libc.so на Linux система .

    Това не е точно така. Основната функция се извиква (в хоствана среда) от 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 и може дори да се наложи да поправите GCC компилатора (за да опишете ABI и конвенциите за извикване). X32 ABI е добър пример.

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

    (За лиценза на GCC, прочетете внимателно изключението на библиотеката за изпълнение на GCC.)

    Имайте предвид, че някои стандартни заглавки, като или предоставени от GCC. други, като например, са „фиксирани“ по време на компилацията на GCC: процедурата за компилация на компилатора ги взема от изпълнението на libc и ги коригира. Други стандартни заглавки (вероятно и вътрешните заглавки, които съдържат) идват от libc. Прочетете повече за GCC FIXINCLUDES и фиксирани заглавни файлове .

    (Нещото в корекцията включва нещо, което (Basile) все още не разбирам много добре.)

    Можете да компилирате с gcc -v -H, за да разберете по-добре какви са действителните програми (тъй като gcc е драйвер, който изпълнява cc1 компилатора, ld & collect2 линкери, като асемблер и т.н.) и кои заглавки са включени, кои библиотеки и обектни файлове са свързани (понастоящем) имплицитно, включително стандартната библиотека C и crt0). Повече информация за опциите на GCC .

    Между другото, можете да използвате стандартна C библиотека, която е различна от това, което вашият GCC очаква или е създадена (например musl-libc или диетична библиотека), като същевременно заобикаляте подходящите допълнителни аргументи, за да направите gcc .