Pergunta

Meu GCC nativo diz que seu trigêmeo é o seguinte.

> gcc -dumpmachine
x86_64-suse-linux

Onde CPU-vendor-OS são correspondentemente x86_64, SUSE, Linux. O último significa que os glibs estão em uso (?). Quando estou fazendo um sistema baseado em Busybux, o Compiler Triplet é algo como AVR32-Linux-UCLIBC, onde OS é 'Linux-UCLIBC', o que significa que o UCLIBC é usado.

A diferença entre 'Linux-Glibc' e 'Linux-UCLIBC' é (AFAIU) no comportamento de colecion2 e no conteúdo da libgcc.a. Glibc ou Uclibs estão silenciosamente ligados ao binário alvo.

As perguntas são que como o kernel Linux foi compilado pelos mesmos compiladores? Assim que o kernel corre no bare-metal, não deve ser vinculado a nenhum tipo de LIBC do espaço do usuário e deve usar o libgcc.a apropriado

Foi útil?

Solução

O GCC tem todos os tipos de opções para controlar como funciona. Aqui estão alguns relevantes:

  • -nostdlib Para omitir a ligação às bibliotecas padrão e código de inicialização
  • -nostdinc omitir a pesquisa de arquivos de cabeçalho nos locais padrão.
  • -ffreestanding Para compilar um ambiente independente (como um kernel)

Você também não precisa usar o GCC para vincular. Você pode invocar o vinculador diretamente, fornecê -lo com seu próprio mapa do vinculador, código do objeto de inicialização e qualquer outra coisa que você precisar.

A construção do kernel Linux parece, por razões arbitrárias para não usar -ffreestanding , ele controla o estágio de vinculação e garante que o kernel seja vinculado sem puxar nenhum código do espaço do usuário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top