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
...
gcclibc
base as bibliotecas do SO, mas é versionada como parte do GCC e não do SO.<stdint.h>
ou<limits.h>
são realmente fornecidos pelo GCC. Outros cabeçalhos, como<stdlib.h>
um retirado da biblioteca C e "corrigido" durante a criação do GCC.A resposta curta é que, se os dois fossem agrupados, o glibc seria licenciado sob a GPL * e, portanto, seria completamente inadequado para projetos proprietários. Enquanto o projeto FSF e GNU não gosta de software proprietário, a glibc foi licenciada pela LGPL como uma opção estratégica para avançar na adoção do GCC e do ecossistema de software livre. Na verdade, o GCC é licenciado sob a GPL com uma exceção de vinculação de tempo de execução específica, porque a situação é um tanto enlameada. A glibc é licenciada pela LGPL para permitir situações sensíveis da biblioteca compartilhada.
https://www.gnu.org/licenses/gcc-exception-faq.html
Além disso, a glibc possui todos os tipos de calços e outros componentes para adaptá-lo a diferentes sistemas operacionais, e distribui-lo como o mesmo pacote que o gcc também deixaria as coisas confusas.
* Alternativamente, o GCC poderia ser licenciado sob outra GPL, embora os pensamentos da FSF sobre isso estivessem na linha de "sobre meu corpo morto".
fonte