Uma das razões é que GCC pode ser construído e usado em (por exemplo, sistemas Unix proprietários, como alguns FreeBSD MacOSX, Solaris, HPUX ou) sistemas que tenham o seu próprio C biblioteca padrão .
Mesmo no Linux, você pode ter uma biblioteca padrão C que não seja o GNU Glibc . Em particular, você pode criar o GCC (ou usá-lo) em sistemas Linux com musl-libc ou Bionic (sistemas Android) ou dietlibc , etc. E um sistema Linux pode ter o GNU Glibc e usar outro compilador C (como Clang ou TinyCC).
Além disso, a biblioteca C depende muito do kernel do Linux. Algumas versões antigas do kernel podem exigir algum tipo específico (ou versão) delibc
E o GCC é compilável como um compilador cruzado .
E detalhes como "como chamar uma main
função" também dependem do compilador, mas, na verdade, esses detalhes são fornecidos porlibc.so
em um sistema Linux.
Isso não está exatamente correto. A main
função é chamada (em um ambiente hospedado) pelo material crt0 , parte do qual é fornecida pelo GCC (por exemplo, /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o
no meu Debian / Sid / x86-64 é do libgcc-6-dev
pacote). Leia também sobrelibgcc
Na verdade, há alguma relação semi-oculta entre libc
e o GCC, por exemplo, porque muitos libc
cabeçalhos estão (opcionalmente) usando alguns atributos internos ou de função do gcc .
(portanto, os desenvolvedores do GCC e os desenvolvedores da GNU libc precisam interagir)
.... se eu mudar o compilador para trabalhar com outra ABI ...
Você precisará ... /configure
o compilador GCC e reconstruí-lo, e talvez seja necessário corrigir o compilador GCC (para descrever suas ABI e convenções de chamada ). o ABI x32 é um bom exemplo.
Por fim, alguns colaboradores ou mantenedores do GCC (inclusive eu) assinaram uma atribuição de direitos autorais que cobre o GCC, mas não o GNUglibc
.
(sobre a licença GCC, leia atentamente a exceção da biblioteca de tempo de execução GCC )
Observe que alguns cabeçalhos padrão, como <limits.h>
ou <stdint.h>
são fornecidos pelo GCC; outros, como <stdlib.h>
"corrigidos" durante a compilação do GCC: o procedimento de compilação do compilador os retira da implementação do Libc e os corrige. Ainda, outros cabeçalhos padrão (provavelmente <stdio.h>
e os cabeçalhos internos que ele está incluindo) são retirados do libc
. Leia mais sobre GCC FIXINCLUDES e arquivos de cabeçalho fixo .
(a correção inclui algo que eu (Basile) ainda não entendo bem)
Você pode compilar gcc -v -H
para entender com mais precisão quais programas reais são executados (já que gcc
é um driver, executando o cc1
compilador, os ld
& collect2
linkers, o as
assembler, etc ...) e quais cabeçalhos estão incluídos, quais bibliotecas e arquivos de objetos estão vinculados (até implicitamente, incluindo a biblioteca padrão C e o crt0 ). Leia mais sobre as opções do GCC .
BTW, você pode usar uma biblioteca padrão C diferente da que o seu GCC espera ou foi criada para (por exemplo, musl-libc
ou alguma dieta ), ignorando argumentos extras apropriados para gcc
...