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