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
...
gcclibc
opartym na bibliotekach systemu operacyjnego, ale jest wersjonowane jako część GCC, a nie system operacyjny.<stdint.h>
lub<limits.h>
rzeczywiście są dostarczane przez GCC. Inne nagłówki, takie jak<stdlib.h>
wzięte z biblioteki C i „naprawione” podczas kompilacji GCC.Krótka odpowiedź jest taka, że gdyby te dwie były „połączone” razem, glibc byłby licencjonowany na licencji GPL *, a zatem byłby całkowicie nieodpowiedni dla projektów zastrzeżonych. Podczas gdy projekt FSF i GNU nie przepada za oprogramowaniem prawnie zastrzeżonym, glibc uzyskał licencję LGPL jako strategiczny wybór, aby przyspieszyć przyjęcie GCC i ekosystemu wolnego oprogramowania. GCC jest faktycznie licencjonowane na licencji GPL z konkretnym wyjątkiem powiązania środowiska wykonawczego, ponieważ sytuacja jest nieco mętna. glibc jest licencjonowany zgodnie z licencją LGPL, aby zezwalać na rozsądne sytuacje związane z biblioteką współdzieloną.
https://www.gnu.org/licenses/gcc-exception-faq.html
Dodatkowo, glibc ma wszystkie rodzaje podkładek i inne komponenty, które dostosowują go do różnych systemów operacyjnych, a dystrybucja tego pakietu jako tego samego co gcc również sprawi, że będzie bałagan.
* Alternatywnie, GCC może być licencjonowane na podstawie innej licencji GPL, chociaż myśli FSF na ten temat byłyby podobne do „ponad moim martwym ciałem”.
źródło