Perché glibc è gestito separatamente da GCC?

9

GCC è il compilatore C. Glibc è la libreria C. Tuttavia, non è una necessità assoluta per un compilatore e la libreria standard raggruppata insieme come implementazione C?

Ad esempio, la libreria C contiene ABI e elementi specifici del compilatore come <limits.h> , <stdint.h> , ecc., che differiscono tra compilatori e API. E dettagli come "come chiamare una funzione principale" dipende anche dal compilatore, ma in realtà quei dettagli sono forniti da libc.so su un sistema Linux. Ad esempio, se cambio il compilatore per funzionare con un altro ABI, come l'utilizzo di int con 8 byte, la libreria C non funzionerà più perché la roba in <limits.h> diventerà errata.

    
posta Michael Tsang 09.05.2017 - 06:15
fonte

2 risposte

16

Una delle ragioni è che GCC può essere compilato e utilizzato su (ad es. sistemi proprietari Unix come MacOSX, Solaris, HPUX o alcuni FreeBSD) con la propria libreria standard C .

Anche su Linux, puoi avere una libreria standard C che non è GNU Glibc . In particolare, puoi costruire GCC (o usarlo) su sistemi Linux con musl-libc o con Bionic (sistemi Android) o con dietlibc , ecc. E un sistema Linux potrebbe avere GNU Glibc e usare qualche altro compilatore C (come Clang o TinyCC).

Inoltre, la libreria C dipende molto dal kernel di Linux. Alcune vecchie versioni del kernel potrebbero richiedere qualche tipo particolare (o versione) di libc

E GCC è compilabile come cross-compiler .

And details like "how to call a main function" also depends on the compiler, but in fact, those details are supplied by libc.so on a Linux system.

Non è esattamente corretto. La funzione main è chiamata (in un ambiente ospitato) dalla crt0 roba, alcuni dei quali forniti da GCC ( per esempio /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o sul mio Debian / Sid / x86-64 è dal pacchetto libgcc-6-dev ). Leggi anche libgcc

In realtà, c'è una relazione semi-nascosta tra libc e GCC, ad es. perché molte intestazioni libc sono (facoltativamente) utilizzando alcuni gcc builtins o attributi della funzione .

(quindi gli sviluppatori GCC e gli sviluppatori GNU libc devono interagire)

.... if I change the compiler to work with another ABI...

Dovrai ... /configure del compilatore GCC e ricostruirlo, e potresti anche aver bisogno di patch del compilatore GCC (per descrivere il tuo ABI e chiamata convenzioni ). L' ABI x32 è un buon esempio.

Infine, alcuni contributori o manutentori di GCC (incluso me) hanno firmato un incarico di copyright che copre GCC ma non GNU glibc .

(per quanto riguarda la licenza GCC, leggi attentamente Eccezione libreria di runtime GCC )

Si noti che alcune intestazioni standard, come <limits.h> o <stdint.h> , sono fornite da GCC; altri, come <stdlib.h> sono "corretti" durante la compilazione di GCC: la procedura di compilazione del compilatore li prende dall'implementazione di Libc e li aggiusta. Tuttavia, altre intestazioni standard (probabilmente <stdio.h> e intestazioni interne che include) sono prese da libc . Maggiori informazioni su GCC FIXINCLUDES e File di intestazione corretti .

(la cosa fixincludes è qualcosa che io (Basile) ancora non capisco bene)

Potresti compilare con gcc -v -H per capire con più precisione quali programmi reali vengono eseguiti (poiché gcc è un driver, esegue il cc1 compilatore, il ld & collect2 linkers, as assembler, ecc ...) e quali intestazioni sono incluse, quali librerie e file oggetto sono collegati (anche implicitamente, inclusa la libreria standard C e crt0 ). Ulteriori informazioni su GCC opzioni .

BTW, puoi utilizzare una libreria standard C diversa da quella che il tuo GCC si aspetta o è stata creata (ad esempio musl-libc o alcuni dietlibc ), ignorando gli argomenti extra appropriati su gcc ...

    
risposta data 09.05.2017 - 09:27
fonte
-5

La risposta breve è che se i due fossero "raggruppati" insieme, glibc sarebbe concesso sotto licenza GPL *, e sarebbe quindi completamente inadatto per progetti proprietari. Mentre il progetto FSF e GNU non amano il software proprietario, a glibc è stata concessa la licenza LGPL come scelta strategica per far progredire l'adozione di GCC e dell'ecosistema del software libero. GCC è attualmente rilasciato sotto licenza GPL con una specifica eccezione di collegamento al runtime, perché la situazione è alquanto confusa. glibc è concesso in licenza per la LGPL per consentire sensate situazioni di libreria condivisa.

link

Inoltre, glibc ha tutti i tipi di shim e altri componenti per adattarlo a vari sistemi operativi, e distribuendolo come lo stesso pacchetto di gcc potrebbe anche rendere le cose disordinate.

* In alternativa, GCC potrebbe essere concesso in licenza con qualcosa di altro GPL, anche se i pensieri della FSF su questo sarebbero sulla falsariga di "over my dead body".

    
risposta data 09.05.2017 - 07:33
fonte

Leggi altre domande sui tag