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