Por que o glibc é mantido separadamente do GCC?

13

GCC é o compilador C. Glibc é a biblioteca C. No entanto, não é uma necessidade absoluta para um compilador e a biblioteca padrão agrupados como uma implementação C?

Por exemplo, a biblioteca contém C ABI e específico compilador coisas do tipo <limits.h>, <stdint.h>etc., que difere entre os compiladores e APIs. E detalhes como "como chamar uma função principal" também dependem do compilador, mas, na verdade, esses detalhes são fornecidos libc.soem um sistema Linux. Por exemplo, se eu mudar o compilador para trabalhar com outra ABI, como usar intcom 8 bytes, a biblioteca C não funcionará mais porque o material <limits.h>ficará errado.

Michael Tsang
fonte

Respostas:

20

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 mainfunçã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 mainfunçã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.ono meu Debian / Sid / x86-64 é do libgcc-6-devpacote). Leia também sobrelibgcc

Na verdade, há alguma relação semi-oculta entre libce o GCC, por exemplo, porque muitos libccabeç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á ... /configureo 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 -Hpara entender com mais precisão quais programas reais são executados (já que gccé um driver, executando o cc1compilador, os ld& collect2linkers, o asassembler, 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-libcou alguma dieta ), ignorando argumentos extras apropriados para gcc...

Basile Starynkevitch
fonte
1
Resposta correta, mesmo que não seja um design correto. É por isso que o MSVC ++ pode compilar o código C ++ 11 / C ++ 14 para sistemas operacionais anteriores a 2011/2014, mas o GCC geralmente não pode.
MSalters
O que você quer dizer com "não é um design correto"? E não tenho certeza de que o GCC não consiga compilar o código C ++ 14 para sistemas operacionais antigos (no entanto, talvez você precise compilar um GCC recente nesse sistema operacional mais antigo).
Basile Starynkevitch
De acordo com a ISO C, a Biblioteca Padrão C faz parte do compilador. O mesmo vale para a biblioteca C ++. Agora, o problema é que os aplicativos criados com uma nova versão do GCC dependem da glibc do sistema operacional em que são criados, o que pode ser mais recente que a glibc no sistema de destino. Uma solução melhor provavelmente teria como gcclibcbase as bibliotecas do SO, mas é versionada como parte do GCC e não do SO.
MSalters
Você tem certeza de que os padrões C11 ou C ++ 14 mencionam a palavra "compilador"? AFAIU falam de "implementação" (que pode até não ser um software)
Basile Starynkevitch
1
Alguns cabeçalhos, como <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.
Basile Starynkevitch
-5

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

whatsisname
fonte
3
Desculpe, mas esta resposta está errada. "Agrupar" não significa que glibc seja um "trabalho derivado" do GCC no sentido descrito na GPL. Por exemplo, toneladas de pacotes de software que utilizam diferentes licenças de código aberto são "agrupados" em cada distribuição do Linux; no entanto, esses pacotes não violam a GPL.
Doc Brown
Por que agrupar gcc e glibc juntos forçaria o glibc a estar sob a GPL? Meu entendimento era que os pacotes não são um "trabalho combinado", portanto a GPL não cruza a fronteira. Edit: o que Doc Brown disse :-)
Philip Kendall