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ć main
funkcję”, również zależą od kompilatora, ale w rzeczywistości te szczegóły są dostarczane przez libc.so
system Linux.
To nie jest dokładnie poprawne. main
Funkcja 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.o
na mój Debian / Sid / x86-64 jest od libgcc-6-dev
pakietu). Przeczytaj także olibgcc
W rzeczywistości istnieje pewna na wpół ukryta relacja między libc
GCC, np. Ponieważ wiele libc
nagłó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ł ... /configure
kompilator 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 -H
zrozumieć dokładniej których prowadzone są rzeczywiste programy (ponieważ gcc
jest kierowca, uruchamiając cc1
compiler ld
i collect2
łączniki z as
asemblera, 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-libc
Lub trochę dietlibc ), pomijając odpowiednie dodatkowe argumenty gcc
...