Pergunta

Tudo o que li já parece implicar que a construção de um cross-compilador é significativamente mais difícil do que construir um compilador que as metas a plataforma onde pode correr. Isso é verdade? Se sim, porquê? Parece que a geração de montagem de chamadas em código e sistema para uma plataforma arbitrária não deve ser mais difícil do que gerar tais chamadas de código e de sistema para a plataforma o compilador é executado, mas talvez eu só estou sendo ingênuo.

Foi útil?

Solução

"construção de um cross-compilador é significativamente mais difícil do que construir um compilador que as metas a plataforma onde pode correr."

O problema existe devido à forma como as bibliotecas são construídas e acessado.

Na situação normal, todas as bibliotecas estão localizadas em um local específico, e são usados ??por todos os aplicativos no sistema. Todos os mecanismos de construção e software assume a localização das bibliotecas. os arquivos make, compiladores, etc dependem da idéia de que eles podem ir para um ponto específico e encontrar o que precisam.

No caso compilação cruzada, no entanto, o compilador cruzado, arquivos make, etc não pode fazer essas suposições -. Se eles fazem eles vão ligar as bibliotecas erradas

Então, ele realmente se resume ao fato de que os desenvolvedores fizeram certos pressupostos no início, e nós estamos presos com isso.

Fica mais difícil quando você está construindo sistemas de arquivos raiz, desde unix só sabe sobre um sistema de arquivos raiz. Quando você construir um outro sistema de arquivos raiz que você tem que criar um ambiente especial que permite que você manipulá-lo sem afetar o sistema de arquivos raiz real.

-Adam

Outras dicas

Isto não tem que ser difícil, mas pode ser dependendo da arquitetura do compilador.

Um compilador é não só traduzir o código fonte em chamadas asm e do sistema. É também integrar código auxiliar pré-existente para os arquivos gerados. Este é o código inclui código de arranque, as funções de preâmbulo, parte da API de C que pode ser embutido, etc.

Em um C1 compilador normal para plataforma Um construído sobre a plataforma A, o C0 compilador original pode construir C1 e um código auxiliar (para A, desde C0 metas A) diretamente.

Em um C2 compilador cruzado para a plataforma B construído sobre a plataforma A, o C0 compilador original deve primeiro criar uma versão especial do C2, que não precisa do código auxiliar (porque o helper código é para B, enquanto C0 metas a), então ele deve executar C2 para gerar o código auxiliar . Dependendo do compilador, que pode, então, tem que gerar uma segunda versão do C2 que inclui o código auxiliar .

O ato de construir a versão limitada de C2, sem código auxiliar é o bootstrapping.

Muitos compiladores cruzadas ter vários destinos. Eu acho que, em geral, um compilador multi-alvo é muito mais difícil do que um único compilador alvo, e todos os compiladores multi-alvo são por compiladores cruzadas definição. Portanto, muitos compiladores cruzadas são muito mais complexos do que os compiladores não cruzadas.

Escrevendo um compilador na plataforma A esse código compila somente para plataforma B não deve, em princípio, ser mais difícil do que escrever um compilador na plataforma A, que compila somente para plataforma A.

Construindo um cross-compilador é difícil apenas se isso nunca ocorre a você que você pode querer cross-compilação. O mesmo é verdade, curiosamente, de montadores, ligadores e depuradores. Tudo que você precisa fazer é lembrar-se de criar uma abstração explícita de representar o que você sabe sobre a máquina de destino.

Para um exemplo de um muito bem desenhado, bem documentado cross-compiler, veja lcc . Para ler sobre o projeto de um cross-depurador, há uma href="http://www.cs.tufts.edu/~nr/pubs/retargetable-abstract.html" rel="nofollow noreferrer"> conferência e uma doutorado dissertação . O código pode ser transferível; Eu não tenho certeza.

Aqui estão algumas das questões que eu vim transversalmente trabalhar com GCC cross-compilação:

  • Você tem que ter alguns dos arquivos de sistema do sistema de alvo presente no sistema host (ou seja, um sysroot), a fim de ligação contra.

  • Alguns idiomas requerem coisas a serem avaliadas em tempo de compilação em vez de em tempo de execução; Além disso, algumas otimizações resultar em avaliar as coisas em tempo de compilação que (no caso unoptimized) ser avaliada em tempo de execução. Quando o alvo tem tipos numéricos que não estão presentes no sistema host, pode ser complicado para obter a mesma resposta nos casos em tempo de compilação e tempo de execução.

  • O teste pode ser um pouquinho mais irritante. Você tem que ter dois sistemas, e uma maneira de transferir o programa de um para o outro.

Na verdade, porém, que é sobre ele para problemas gerais que eu correr em.

É possível que você está olhando para um caso específico como 'construção GCC como compilador cruzado', onde 'construção' significa 'compilar' em vez de 'escrita'?

Isso pode ser mais difícil por causa de questões que envolvem bibliotecas - para o cross-compilador que você precisa bibliotecas para a plataforma de destino. Para o compilador 'nativo' (ou seja, não-cruz), você claramente já tem bibliotecas de destino.

Eu estou com você sobre os 'Criando um gerador de código' aspectos sendo o mesmo -. Ou pelo menos sendo mais afetado pela arquitetura do processador alvo do que por onde executa a compilação

E há situações claras onde um compilador cruzado é muito mais fácil do que um não-cross. Eu acho que um compilador 8051 hospedado C ++ seria duramente trabalho, qualquer plataforma que alvejado.

Este respostas para a seguinte pergunta pode ajudá-lo a entender por que isso seria difícil.

Por que não podemos criar programas cruzada plataformas nos dias de hoje?

Eu sinto que tudo se resume a diferentes sistemas operacionais chamando IO nativo de maneiras diferentes. Para construir um compilador plataforma independente que você vai ter que saber exatamente como todas as obras Nitty Gritty e, basicamente, construir um sistema operacional.

[vou atualizar quando eu chegar em casa, eu tenho que trabalhar partem agora]

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