Однією з причин є те, що 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).
Також бібліотека С сильно залежить від ядра 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 та файли з фіксованими заголовками .
(виправленнявключає в себе те, що я (Базиль) все ще не добре розумію)
Ви можете компілювати, gcc -v -Hщоб більш точно зрозуміти, які саме програми виконуються (оскільки gccце драйвер, запускає cc1компілятор, ld& & collect2лінкери, asасемблер тощо) і які заголовки включені, які бібліотеки та файли об'єктів пов'язані (навіть неявно, включаючи стандартну бібліотеку C і crt0 ). Детальніше про варіанти GCC .
До речі, ви можете використовувати стандартну бібліотеку C, відмінну від тієї, яку очікує GCC або була створена для неї (наприклад, musl-libcабо якийсь дієтліб ), минаючи відповідні додаткові аргументи, щоб gcc...