Jednym z powodów jest to, że GCC mogą być budowane i używane na (np zastrzeżonych systemów Unix jak MacOSX, Solaris, HPUX lub niektórych FreeBSD) posiadających własne C biblioteki standardowej .
Nawet w systemie Linux możesz mieć standardową bibliotekę C, która nie jest GNU Glibc . W szczególności możesz zbudować GCC (lub użyć go) na systemach Linux z musl-libc lub Bionic (systemy Android) lub dietlibc itp. A system Linux może mieć GNU Glibc i użyć innego kompilatora C (takiego jak Clang lub TinyCC).
Ponadto biblioteka C w dużym stopniu zależy od jądra Linux. Niektóre stare wersje jądra mogą wymagać określonego rodzaju (lub wersji)libc
A GCC można zbudować jako kompilator krzyżowy .
A szczegóły, takie jak „jak wywołać mainfunkcję”, również zależą od kompilatora, ale w rzeczywistości te szczegóły są dostarczane przez libc.sosystem Linux.
To nie jest dokładnie poprawne. mainFunkcja nazywa się (w środowisku hostowane) przez crt0 rzeczy, z których część jest dostarczana przez GCC (np /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.ona mój Debian / Sid / x86-64 jest od libgcc-6-devpakietu). Przeczytaj także olibgcc
W rzeczywistości istnieje pewna na wpół ukryta relacja między libcGCC, np. Ponieważ wiele libcnagłówków (opcjonalnie) używa wbudowanych gcc lub atrybutów funkcji .
(stąd programiści GCC i programiści GNU libc muszą ze sobą współdziałać)
.... jeśli zmienię kompilator do pracy z innym ABI ...
Będziesz musiał ... /configurekompilator GCC i go odbudować, a może nawet będziesz musiał załatać kompilator GCC (aby opisać swoje ABI i konwencje wywoływania ). X32 ABI jest dobrym przykładem.
W końcu niektórzy współpracownicy lub opiekunowie GCC (w tym ja) podpisali przydział praw autorskich, który obejmuje GCC, ale nie GNU glibc.
(odnośnie licencji GCC, przeczytaj uważnie wyjątek biblioteki wykonawczej GCC )
Zauważ, że niektóre standardowe nagłówki, takie jak <limits.h>lub <stdint.h>dostarczane przez GCC; inne, na przykład, <stdlib.h>są „naprawione” podczas kompilacji GCC: procedura kompilacji pobiera je z implementacji Libc i łata je. Jednak inne standardowe nagłówki (prawdopodobnie <stdio.h>i nagłówki wewnętrzne, które zawiera) są pobierane z libc. Dowiedz się więcej o GCC FIXINCLUDES i poprawionych plikach nagłówka .
(fixinc zawiera rzecz, której ja (Basile) nadal nie rozumiem dobrze)
Można skompilować gcc -v -Hzrozumieć dokładniej których prowadzone są rzeczywiste programy (ponieważ gccjest kierowca, uruchamiając cc1compiler ldi collect2łączniki z asasemblera, etc ...), które są zawarte nagłówki, które biblioteki i pliki wynikowe są połączone (nawet niejawnie, w tym standardową bibliotekę C i crt0 ). Przeczytaj więcej o opcjach GCC .
BTW, możesz użyć standardowej biblioteki C innej niż ta, której spodziewa się GCC lub dla której została zbudowana (np. musl-libcLub trochę dietlibc ), pomijając odpowiednie dodatkowe argumenty gcc...