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