Perché glibc è gestito separatamente da GCC?


13

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

Ad esempio, la libreria C contiene ABI e compilatore specifico cose del genere <limits.h>, <stdint.h>ecc, che differisce tra compilatori e API. E dettagli come "come chiamare una funzione principale" dipendono anche dal compilatore, ma in realtà tali dettagli sono forniti da libc.soun sistema Linux. Ad esempio, se cambio il compilatore in modo che funzioni con un altro ABI, come l'utilizzo intcon 8 byte, la libreria C non funzionerà più perché le cose dentro <limits.h>andranno male.

Risposte:


20

Uno dei motivi è che GCC può essere costruito e utilizzato su (ad es. Sistemi Unix proprietari come MacOSX, Solaris, HPUX o alcuni sistemi FreeBSD) con la propria libreria C standard .

Anche su Linux, puoi avere una libreria C standard 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 fortemente dal kernel Linux. Alcune vecchie versioni del kernel potrebbero richiedere un particolare tipo (o versione) dilibc

E GCC è costruibile come cross-compilatore .

E dettagli come "come chiamare una mainfunzione" dipendono anche dal compilatore, ma in realtà tali dettagli sono forniti da libc.soun sistema Linux.

Questo non è esattamente corretto. La mainfunzione è chiamata (in un ambiente ospitato) dal roba crt0 , alcuni dei quali sono forniti da GCC (ad esempio /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.osul mio Debian / Sid / x86-64 è dal libgcc-6-devpacchetto). Leggi anche sulibgcc

In realtà, esiste una relazione parzialmente nascosta tra libce GCC, ad esempio perché molte libcintestazioni utilizzano (opzionalmente) alcuni builtin di gcc o attributi di funzione .

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

.... se cambio il compilatore per lavorare con un altro ABI ...

Dovrai ... /configurecompilare il GCC e ricostruirlo, e potresti anche dover patchare il compilatore GCC (per descrivere il tuo ABI e le convenzioni di chiamata ). L' ABI x32 è un buon esempio.

Alla fine, alcuni collaboratori o manutentori di GCC (incluso me) hanno firmato un incarico sul copyright che copre GCC ma non GNU glibc.

(per quanto riguarda la licenza GCC, leggi attentamente l'eccezione della libreria di runtime GCC )

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

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

Puoi compilare gcc -v -Hper capire con maggiore precisione quali programmi reali vengono eseguiti (poiché gccè un driver, eseguendo il cc1compilatore, i ld& collect2linker, l' asassemblatore, ecc ...) e quali intestazioni sono incluse, quali librerie e file oggetto sono collegati (anche implicitamente, tra cui la libreria standard C e crt0 ). Ulteriori informazioni sulle opzioni GCC .

A proposito, puoi usare una libreria standard C diversa da quella che il tuo GCC si aspetta o è stata costruita per (ad esempio musl-libco un po 'di dietlibc ), ignorando gli argomenti aggiuntivi appropriati per gcc...


1
Risposta corretta, anche se non un design corretto. Questo è il motivo per cui MSVC ++ può compilare il codice C ++ 11 / C ++ 14 per i sistemi operativi pre-2011/2014, ma GCC di solito non lo è.
MSalters

Cosa intendi con "non un design corretto"? E non sono sicuro che GCC non possa compilare il codice C ++ 14 per i vecchi sistemi operativi (tuttavia, potrebbe essere necessario compilare un GCC recente su quel sistema operativo precedente).
Basile Starynkevitch

Secondo ISO C, la libreria standard C fa parte del compilatore. Lo stesso vale per la libreria C ++. Ora il problema è che le applicazioni costruite con una nuova versione di GCC avranno una dipendenza dal glibc del sistema operativo in cui sono costruite, che potrebbe essere più recente del glibc sul sistema di destinazione. Una soluzione migliore avrebbe probabilmente fatto affidamento su una gcclibcche si basa sulle librerie del sistema operativo, ma è versione come parte di GCC e non del sistema operativo.
MSalters

Sei sicuro che gli standard C11 o C ++ 14 menzionano la parola "compilatore"? AFAIU parlano di "implementazione" (che potrebbe anche non essere un software)
Basile Starynkevitch

1
Alcune intestazioni, come <stdint.h>o <limits.h>sono effettivamente fornite da GCC. Altre intestazioni, come <stdlib.h>una presa dalla libreria C e "riparata" durante la compilazione di GCC.
Basile Starynkevitch,

-5

La risposta breve è che se i due fossero "raggruppati" insieme, glibc verrebbe concesso in licenza ai sensi della GPL * e sarebbe quindi del tutto inadatto per i progetti proprietari. Mentre il progetto FSF e GNU non ama il software proprietario, glibc ha ottenuto la licenza LGPL come scelta strategica per far avanzare l'adozione di GCC e dell'ecosistema del software libero. GCC è effettivamente concesso in licenza in base alla GPL con un'eccezione specifica per il runtime, poiché la situazione è piuttosto fangosa. glibc è concesso in licenza dalla LGPL per consentire situazioni di librerie condivise sensibili.

https://www.gnu.org/licenses/gcc-exception-faq.html

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

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


3
Siamo spiacenti, ma questa risposta non è corretta. "Raggruppare insieme" non implica che essere un "lavoro derivato" da GCC nel senso descritto nella GPL. Ad esempio, tonnellate di pacchetti software che utilizzano diverse licenze open source sono "raggruppati" in ogni distribuzione Linux, tuttavia questi pacchetti non violano la GPL.
Doc Brown,

Perché raggruppare gcc e glibc insieme costringerebbe glibc ad essere sotto GPL? La mia comprensione era che i fasci non sono un "lavoro combinato", quindi la GPL non oltrepassa i confini. Modifica: cosa ha detto Doc Brown :-)
Philip Kendall
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.