What makes a Linux distribution GNU? Is it the tools, with which the kernel was compiled? Is it the tools, with which the distribution is shipped?
Sim e sim. O kernel é um executável autônomo monolítico. Tudo else reside em " userland ". Geralmente, os aplicativos userland utilizam pelo menos uma biblioteca do sistema, a biblioteca C padrão. 1 Além de várias funções utilitárias, é isso que fornece acesso a chamadas do sistema - solicitações para o sistema, ou seja, o kernel, para fazer alguma coisa - o que é necessário para tarefas muito básicas, como trabalhar com arquivos. A implementação da biblioteca C usada com o linux é glibc - a biblioteca GNU C.
O próprio kernel do linux é escrito em C, e também requer uma biblioteca C para funcionar - exceto neste caso as partes necessárias são compiladas, e não externas. O compilador normalmente usado para isso é o GCC - o "GNU Compiler Collection" - e a biblioteca C é glibc.
Como virtualmente todo o userland é compilado contra o glibc, é uma das coisas mais essenciais no sistema após o kernel. Outro componente essencial é o vinculador, que conecta um executável a uma biblioteca externa. Isso é um produto GNU também.
Para ilustrar isso, você pode usar ldd
em vários executáveis, incluindo bibliotecas (que são executáveis, mas não por conta própria). Como diz a man page, "o ldd imprime as bibliotecas compartilhadas requeridas por cada programa ou biblioteca compartilhada especificada na linha de comando." Por exemplo:
> ldd /bin/bash
linux-vdso.so.1 => (0x00007fff7348e000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fdbdae7f000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fdbdac7b000)
libc.so.6 => /lib64/libc.so.6 (0x00007fdbda8c3000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdbdb0c8000)
Observe que "libc.so.6" - isso é glibc (não confunda com o glib, outro produto GNU fundamental para o Linux, mas não tão fundamental quanto o glibc). Se você olhar todas as outras coisas mencionadas (exceto a primeira, explicada abaixo), você notará que todas elas se ligam à libc. Vamos ver o próprio libc.so.6:
> ldd /lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2 (0x00007f9cefa04000)
linux-vdso.so.1 => (0x00007fffb21ff000)
"ld-linux-x86-64.so.2" é o linkador mencionado acima (geralmente, ld
, e tem uma página man). Você não pode executar o ldd nele, mas file
diz que ele está dinamicamente vinculado, eu presumo que a libc (isso pode soar circular, mas não é) e linux-vdso. Este último é interessante porque você notará apenas um endereço após o =>
. Isso é porque na verdade é parte do kernel.
A biblioteca C, AFAIK, é o objeto compartilhado somente no sistema que não está vinculado à biblioteca C - está no centro de toda a confusão . Até mesmo a biblioteca base de outras linguagens compiladas usa libc, por exemplo:
> ldd libstdc++.so.6.0.17
linux-gate.so.1 => (0xf77b8000)
libm.so.6 => /lib/libm.so.6 (0xf7684000)
libc.so.6 => /lib/libc.so.6 (0xf74d2000)
/lib/ld-linux.so.2 (0xf77b9000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf74b5000)
Observe que as bibliotecas e o vinculador têm vários pseudônimos implementados com links simbólicos (por exemplo, /lib64/ld-linux-x86-64.so.2 é, na verdade, /lib64/ld-2.15.so).
Observe também que gcc
, o compilador "nativo" (já que compila o kernel e a biblioteca C) não precisa estar presente no sistema, mas libc e ld do or else nada pode funcionar.
Esse não é o único conjunto de coisas que o GNU fornece. Eles também são responsáveis pelo bash
shell e outras ferramentas e utilitários essenciais que tornam o sistema * nix similar e (principalmente) compatível com POSIX. E o GNOME, um dos primeiros DEs do Linux e um dos mais utilizados. E o slib mencionado acima, que fornece muitas funções de alto nível para suportar coisas como um GNOME e outros DEs. O GNOME é baseado no GTK, que foi originalmente desenvolvido para o GIMP. O GTK também é fundamental para vários outros DEs; O GTK e o GIMP também são produtos GNU. Eles fizeram um monte de coisas.
1 Existe uma aplicação userland que não se liga a nenhuma biblioteca; estes são chamados de executáveis estáticos e isso essencialmente significa que eles tiveram partes dessa biblioteca compiladas neles (assim como o kernel faz).