Manual

do

Maker

.

com

Introdução a sistemas embarcados – Toolchains

Introdução a sistemas embarcados – 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:

apt-get install qemu-arm-static
buidl-arm-chroot VERSAO_DEBIAN eabi-chroot

Depois pode-se fazer um chroot nessa base:

chroot eabi-chroot

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

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á!

Se você ainda não viu a parte 1, recomendo esse link.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.