Introdução a sistemas embarcados – Toolchains

Toolchains
Toolchains

Toolchains

são conjuntos de ferramentas de programação para construir aplicativos, composta por compiladores, pré-processadores, ‘linkador’, depurador, utilitários de sistema, etc. Existem alguns tipos diferentes de toolchains como:

Nativa

para compilar programas para a mesma plataforma em que se está executando a tarefa de desenvolvimento

Cruzada

Para compilar para uma plataforma diferente daquela em que se está trabalhando. Normalmente quando se desenvolve para embarcado, a preferência é utilizar uma plataforma de hardware mais parruda como a x86, referenciando o compilador para gerar binários para a plataforma pretendida. Cross-compiling, ou compilação cruzada é justamente a ação de compilar binário para a plataforma X desde a plataforma Y, e é o que utilizaremos.

Hibrido

Como uma toolchain nativa, porém rodando em uma máquina virtual. Essa pode ser a mais agradável maneira de gerar binários para uma plataforma diferente do hardware utilizado para o desenvolvimento, pois tudo é transparente dentro da máquina virtual.

Canadian

Frescura não-usual de gerar na maquina 1 binários para a máquina 2, para cross-compilar para máquina 3.

As toolchains mais comuns são Buildroot, CodeSourcery, Crosstool-NG, ScratchBox e rootstock, mas existem outras populares também.

O BuildRoot é a toolchain que utilizarei para o desenvolvimento de exemplo, sendo a base que estou utilizando para a migração do Phantom de glibc para a uClibc, reduzindo assim um tanto mais o tamanho do sistema. Uma grande vantagem para mim foi a facilidade de cross-compilar o Qt para gerar binários para uClibc, me permitindo recompilar a interface facilmente. Porém nem todas as cross-compilações são tão simples e nem as mais básicas são tão simples quanto um ./configure, make, make install.

A toolchain CodeSourcery oferece versões livres e licenciadas.

Toolchain hibrido

Se você der sorte, pode instalar um delicioso ambiente de desenvolvimento assim:

Depois pode-se fazer um chroot nessa base:

Para quem não sabe, o comando chroot é utilizado para mudar a raiz do sistema, ou seja, para aquele usuário que estiver executando o chroot, sua raiz passará a ser o alvo indicado; no caso, eabi-chroot.
Com um simples ls será vista toda a estrutura raiz do sistema, como se estivesse em / do sistema nativo, mesmo não sendo o sistema nativo. Tudo o que for feito ai dentro não afetará o sistema real; a grosso modo, se assemelha a uma máquina virtual.

As vezes o ambiente pode não ser exatamente para outra arquitetura de hardware, mas se for, com uname -m é possível certificar-se de que não está operando no sistema real – e com esse ambiente agora se pode fazer compilação nativa. Delícia!
No buildroot também é possível utilizar-se desse recurso, que será visto em outro post.

Por fim, tem as questões de lib do sistema; a glibc ou a uclibc. E a ‘linkagem’ que pode ser estática ou dinâmica.

Alguns comandos também auxiliam na identificação dos tipos e de dependências, como veremos ao por a mão na massa (ainda em outro post).

Aproveito para agradecer à LightComm pela oportunidade de desenvolver para ARM, o que tem me rendido muitos novos conhecimentos na construção de sistemas Linux. Por fim, quando a LightComm lançar um produto final com Linux embarcado, farei um post para mostrar o resultado desse material que estarei disponibilizando (com excessão das informações de desenvolvimento interno do produto, claro).

Para o próximo post pretendo deixar mais claro a composição mínima para fazer um boot, então vamos gerar um boot básico com initrd e kernel.

O post seguinte deve ser sobre remasterização – o ato de recompilar uma distro pronta a partir de uma iso.

Assim, vamos manipular ao máximo um sistema para ter mais intimidade ao fazer uma compilação baseada no buildroot.

Com paciência chegaremos lá!

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

2 comentários em “Introdução a sistemas embarcados – Toolchains

Deixe uma resposta