Compilación cruzada de Linux para arquitectura ARM
embedded x86 (7)
He usado scratchbox mientras experimenté con la creación de aplicaciones para maemo (Nokia N810), que usa un procesador ARM. Supuestamente, scratchbox no está restringido al desarrollo de maemo.
Estoy interesado en la compilación cruzada de un kernel de Linux para un objetivo ARM en un host x86. ¿Hay algunas buenas prácticas que recomiendas? ¿Cuál es la mejor suite de compilación cruzada en tu opinión? ¿Has establecido un entorno personalizado de compilación cruzada? En caso afirmativo, ¿qué consejos tienes? ¿Es una buena idea?
He usado crosstool en varios objetivos. Es genial siempre y cuando quieras construir tu cadena de herramientas desde cero. Por supuesto, también hay varias cadenas de herramientas preconstruidas para el brazo, solo googlee, son demasiadas para mencionarlas aquí.
1) En mi opinión, construir tu propia cadena de herramientas funciona mejor. Terminas teniendo un control estricto sobre todo, además, si eres nuevo en Linux embebido, es una GRAN experiencia de aprendizaje.
2) No vaya con una cadena de herramientas comercial. Incluso si no quiere tomarse el tiempo para construir el suyo, existen alternativas gratuitas.
Si su empresa va a gastar el dinero, pídales que le compren un depurador jtag.
Le ahorrará toneladas de tiempo. y te permite aprender fácilmente y avanzar en el inicio del kernel, etc. Recomiendo usar los productos jtag de Lauterbach ... Trabajan con un montón de objetivos y el software es multiplataforma. Su apoyo es excelente también.
Si no puede obtener un depurador jtag y está trabajando en el kernel, use una VM para hacer eso, usermode linux, vmware..etc ... su código se depurará en x86. Portarlo a su brazo objetivo ser una historia diferente, pero es una forma más barata de solucionar algunos errores.
Si está portando un gestor de arranque, use uboot. Por supuesto, si está utilizando una plataforma de referencia, probablemente sea mejor que utilice lo que proporcionan con el BSP.
Espero que eso ayude.
Si está usando Gentoo, obtener una cadena de herramientas de compilación cruzada es tan fácil como
$ emerge crossdev $ crossdev -t $ARCH-$VENDOR-$OS-$LIBC
donde ARCH
es arm
o armeb
, VENDOR es unknown
o softfloat
, OS
es linux
y LIBC
es gnu
o uclibc
.
Si todo lo que quiere es un compilador (y un enlazador) para el kernel, la parte LIBC
es irrelevante, y puede usar -s1
/ --stage1
para informar a crossdev
que solo necesita binutils
y gcc
.
Esto es lo que Eurotech usa para su distribución Debian ARM. Notarás que no recomiendan usar un compilador cruzado si puedes evitarlo. Compilar el objetivo en sí mismo tiende a ser una forma más confiable de obtener resultados que sabe que se ejecutarán.
Utilizo la herramienta de herramientas emdebian para compilar cosas para mis máquinas ARM que no está contento de ser compilado de forma nativa en los pequeños recursos disponibles (/ me fulmina con la mirada en el kernel). El paquete principal es gcc-4.X-arm-linux-gnueabi
(X = 1,2,3) y proporciona los comandos gcc / cpp / ld / etc con el sufijo apropiado. Agrego esto a mi lista sources.list
:
deb http://www.emdebian.org/debian/ unstable main
Por supuesto, si no usas Debian, probablemente no sea tan útil, pero para chicle me funciona bien.
Buildroot es una herramienta con la que he tenido bastante buena suerte para construir desde cero una herramienta personalizada basada en uClibc. Es muy personalizable, y no excesivamente particular acerca de qué distribución se está ejecutando.
Además, muchos de sus usuarios existentes (es decir, distribuciones de enrutadores incorporados) también se dirigen a ARM.
Hay dos enfoques que he usado para herramientas ARM / Linux. Lo más fácil es descargar directamente una cadena de herramientas preconstruidas.
Pro : Simplemente funciona y puedes continuar con la parte interesante de tu proyecto
Con : Estás atascado con la versión de gcc / binutils / libc que escogieron
Si lo último le importa, consulte crosstool-ng . Este proyecto es una herramienta de configuración similar a la aplicación de configuración del kernel de Linux. Establezca las versiones de gcc, binutils, libc (GNU o uCLibc), threading y kernel de Linux para construir y crosstool-ng hace el resto (es decir, descarga las bolas de alquitrán, configura las herramientas y las construye).
Pro : obtienes exactamente lo que seleccionaste durante la configuración
Con : obtienes exactamente lo que seleccionaste durante la configuración
lo que significa que asumes la total responsabilidad de la elección del compilador / binutil / libc y sus características / fallas / errores asociados. Además, como se menciona en los comentarios, existe cierto "dolor" involucrado en la selección de las versiones de binutils, biblioteca C, etc. ya que no todas las combinaciones necesariamente funcionan juntas o incluso se construyen.
Un enfoque híbrido podría ser comenzar con las herramientas preconstruidas y reemplazarlas más adelante con una solución personalizada mediante crosstool-ng si es necesario.
Actualización : la respuesta originalmente usó las herramientas de CodeSourcery como ejemplo de una cadena de herramientas preconstruidas. Las herramientas de CodeSourcery para ARM se podían descargar gratis de Mentor Graphics , pero ahora se llaman Sourcery CodeBench y se deben comprar en Mentor Graphics. Otras opciones ahora incluyen Linaro y herramientas específicas de distribución de Android, Ubuntu y otros.