xToolChain
Software
Una toolchain o cadena de herramientas son un conjunto de software que es usado para generar otro software y suelen usarse una detrás de otra, es decir, encadenadas. Los elementos mínimos necesarios para generar un sistema operativo o cualquier software que manipule directamente el hardware y la memoria son:
- Un cargador (Linker)
- Un Ensamblador.
- Compilador de C
- Bibliotecas de C.
Si bien estas toolchain se pueden escalar para contener mas elementos, como por ejemplo compiladores de C++, fortran, herramientas para listar los símbolos (resueltos o no) de un archivo ejecutable o incluso depuradores. Hay que hacer una pequeña nota sobre las bibliotecas de C, dentro del mundo de los dispositivos embebidos hay muchas limitantes, entre ellas la memoria y el consumo de energía, hablando de la memoria la biblioteca de C mas celebre GLIBC ocupa mucha memoria (>80mb) y no suele ser una buena elección, tenemos otras opciones mas amigables con respecto a la memoria como uClibc, newlibc y eglibc. La opción mas madura es uClibc y espero que eglibc despegue después de su adopción por parte de Debian GNU/LINUX. Sin embargo, la elección es al gusto del desarrollador.
El proyecto GNU provee de todos los elementos necesarios para generar las toolchains (Nativas o Cruzadas) con gcc, binutils y glibc, aunque como mencionamos la ultima es reemplazable. También la mayoría de las distribuciones de GNU/Linux cuentan con toolchains pre-compiladas para las arquitecturas mas usadas (x86, x86_64, ARM). Ya existen muchas herramientas que permiten generar toolchains especialmente para sistemas embebidos como crosstool, crosstool-ng, openEmbedded, buildroot, aunque se pueden usar para generar toolchain nativos. Claro también es posible hacerlo a mano con el método que explico aquí en el blog.
Yo trabajo con procesadores IBM PowerPC 405 sin FPU. Estos están dentro de una tarjeta de desarrollo XUPV2P. Elegí la crosstool-ng como herramienta para generar varias toolchains, la encuentro mas moderna crosstool y mas escalable (en cuanto al toolchain) que buildroot. OpenEmbedded depende mucho de los targets, esto no vale para la FPGA pues es una target "Mutable".
Particulamente la version 1.6.1 de crosstool-ng maneja versiones probadas de binutils, gcc y uClibc.
$version=crosstool-ng-1.6.1
$wget http://ymorin.is-a-geek.org/download/crosstool-ng/$version.tar.bz2
$tar xjvf $version.tar.bz2
$cd $version/
$./configure --local
$make
$chmod 555 ct-ng
La configuración se realiza asi:
$./ct-ng menuconfig #ó en caso de tener un archivo de configuración antiguo
$./ct-ng oldconfig
$./ct-ng build
Suele ser necesario limpiar algunas variables de ambiente
$unset LD_LIBRARY_PATH LIBRARY_PATH CPATH
$export LD_LIBRARY_PATH LIBRARY_PATH CPATH
Mi configuración particular esta disponible aquí http://github.com/Vendaval/XUPV2P-LINUX-Dual-PPC405/blob/master/dotConfigs/crosstool-ng-dot-config-1.6.1. Ademas, mi toolchain de desarrollo esta disponible para su descarga en la siguiente URL.
El tiempo total ocupado depende de las características del toolchain entre la cantidad de procesadores empleados en la tarea, esta ultima es configurable en "Paths and misc options → Number of parallel jobs" y mejorar (siempre que este permitido) con un valor bajo de nice(1).
Empresas dedicadas al desarrollo de sistemas embebidos como DENX ponen a disposición del publico sus herramientas que incluyen una completa toolchain basada en glibc, binutils y gcc, esto tiene la ventaja de ahorrar tiempo de compilación y eliminar tiempo de depuración con el detalle de ser un poco antigua (2008), las imagenes de las herramientas se encuentran en http://www.denx.de/wiki/view/DULG/ELDKAvailability y su instalación es muy sencilla (la elección del ISO varia según la arquitectura):
$wget http://ftp.denx.de/pub/eldk/4.2/ppc-linux-x86/iso/ppc-2008-04-01_amcc.iso # ~662MB
$sudo mount -t iso9660 ./ppc-2008-04-01_amcc.iso /mnt
$cd /mnt
$./install -d /ruta/de/instalación
Para usar la toolchain se le suele pasar las variables ARCH y CROSS_COMPILE al script de configuración que genera el Makefile adecuado. Sin embargo estas variables pueden agregarse al ambiente (environment), también es necesario agregar la direccion absoluta de la toolchain al PATH. La manera sencilla de arreglar es creando un archivo donde se exporten las variables y llamarlo usando el comando source o sh, la diferencia consiste en que primero hereda las variables a los subprocesos creados por la shell usada (y por que no otras shells), sh en cambio solo para la shell actual.
export ARCH=powerpc
export CROSS_COMPILE=cadena-prefija- #es algo como ppc-4xx o powerpc-405-linux-uclibc-
export PATH=/ruta/absoluta/toolchain/bin:$PATH
Pero...No todo es miel sobre hojuelas, es muy importante saber que las toolchains son software muy delicado, cualquier error o incluso una configuración pobre pueden acarrear problemas de terminación inesperada, rendimiento pobre o poco soporte para características especificas. Reparar un error puede involucrar muchas horas de compilación (toolchain y programas para el objetivo), ademas el error puedo solo afectar ciertos tipos particulares de aplicación. Una manera de probar si nuestra toolchain es estable es usando los test de regresión con herramientas como DejaGNU.
DejaGNU es un framework para probar otras aplicaciones, entre ellas las toolchains, nos permite verificar el estado de nuestras aplicaciones, tanto de manera local como remota. Se encuentra en los repositorios de Debian y Fedora, para ArchLinux esta disponible en AUR. DejaGNU es diseñado en conformidad del estandar POSIX 1003.3.
Permalink: http://www.mononeurona.org/entries/view/vendaval/2362
Commentblogs:algun dia entendere esto, espero..., gracias por documentar =), saludos.
2010-09-08 02:54:40-05










