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