Dlaczego glibc jest obsługiwany oddzielnie od GCC?

13

GCC jest kompilatorem C. Glibc jest biblioteką C. Czy jednak nie jest to absolutnie konieczne dla kompilatora i standardowej biblioteki spakowanej razem jako implementacja języka C?

Na przykład, biblioteki C zawiera kompilator ABI i specyficzny materiał podobny <limits.h>, <stdint.h>itd, które różnią się między kompilatory API. A szczegóły, takie jak „jak wywołać funkcję główną”, również zależą od kompilatora, ale w rzeczywistości są one dostarczane przez libc.sosystem Linux. Na przykład, jeśli zmienię kompilator do pracy z innym ABI, na przykład przy użyciu int8 bajtów, biblioteka C nie będzie już działać, ponieważ wprowadzone elementy <limits.h>staną się niepoprawne.

Michael Tsang
źródło

Odpowiedzi:

20

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...

Basile Starynkevitch
źródło
1
Prawidłowa odpowiedź, nawet jeśli nie jest poprawna. Dlatego MSVC ++ może kompilować kod C ++ 11 / C ++ 14 dla systemów operacyjnych sprzed 2011/2014, ale GCC zwykle nie.
MSalters
Co rozumiesz przez „niewłaściwy projekt”? I nie jestem pewien, czy GCC nie może skompilować kodu C ++ 14 dla starych systemów operacyjnych (jednak może być konieczne skompilowanie najnowszego GCC na tym starszym systemie).
Basile Starynkevitch,
Zgodnie z ISO C biblioteka standardowa C jest częścią kompilatora. To samo dotyczy biblioteki C ++. Problem polega na tym, że aplikacje zbudowane przy użyciu nowej wersji GCC będą zależne od glibc systemu operacyjnego, w którym zostały zbudowane, co może być nowsze niż glibc w systemie docelowym. Lepsze rozwiązanie prawdopodobnie opierałoby się na oprogramowaniu gcclibcopartym na bibliotekach systemu operacyjnego, ale jest wersjonowane jako część GCC, a nie system operacyjny.
MSalters
Czy jesteś pewien, że standardy C11 lub C ++ 14 wspominają o słowie „kompilator”? AFAIU mówią o „wdrożeniu” (które może nawet nie być oprogramowaniem)
Basile Starynkevitch
1
Niektóre nagłówki, takie jak <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.
Basile Starynkevitch
-5

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”.

Jaka jest nazwa?
źródło
3
Przepraszamy, ale ta odpowiedź jest błędna IMHO. „Pakowanie razem” nie oznacza, że ​​glibc jest „dziełem pochodnym” z GCC w sensie opisanym w GPL. Na przykład, tony pakietów oprogramowania korzystających z różnych licencji open source są „pakowane razem” w każdej dystrybucji Linuksa, jednak pakiety te nie naruszają GPL.
Doc Brown,
Dlaczego łączenie gcc i glibc razem zmusza glibc do uzyskania licencji GPL? Zrozumiałem, że pakiety nie są „połączoną pracą”, więc GPL nie przekracza granicy. Edytuj: co powiedział Doktor Brown :-)
Philip Kendall