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 main
funzione" dipendono anche dal compilatore, ma in realtà tali dettagli sono forniti da libc.so
un sistema Linux.
Questo non è esattamente corretto. La main
funzione è 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.o
sul mio Debian / Sid / x86-64 è dal libgcc-6-dev
pacchetto). Leggi anche sulibgcc
In realtà, esiste una relazione parzialmente nascosta tra libc
e GCC, ad esempio perché molte libc
intestazioni 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 ... /configure
compilare 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 -H
per capire con maggiore precisione quali programmi reali vengono eseguiti (poiché gcc
è un driver, eseguendo il cc1
compilatore, i ld
& collect2
linker, l' as
assemblatore, 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-libc
o un po 'di dietlibc ), ignorando gli argomenti aggiuntivi appropriati per gcc
...