Colección de citas famosas - Slogan de motivación - La diferencia entre arm-linux-gcc y arm-elf-gcc

La diferencia entre arm-linux-gcc y arm-elf-gcc

En el desarrollo de sistemas integrados basados ​​en ARM, existen dos tipos de cadenas de herramientas GCC compiladas cruzadas:

arm-linux-* y arm-elf-*, ambas La principal diferencia radica en el uso de diferentes archivos de biblioteca C. arm-linux-* usa Glibc de GNU, mientras que arm-elf-* generalmente usa uClibc/uC-libc o la biblioteca C de REDHAT desarrollada específicamente para sistemas integrados

newlib.Glibc. uClibc/uC-libc y newlib son todos archivos de biblioteca en lenguaje C, pero se utilizan en diferentes campos. Glibc está desarrollado para PC y uClibc/uC-libc es una versión pequeña compatible con la API de Glibc

C. Biblioteca de idiomas, realizando algunas funciones de Glibc.

Para obtener instrucciones sobre uClibc/uC-libc, consulte lo siguiente:

Hay dos bibliotecas libc comúnmente utilizadas con uC-libc y

uClibc. Son bastante diferentes a pesar de sus nombres similares. Aquí hay una descripción general rápida de en qué se diferencian.

uC-libc es la biblioteca original de uClinux.

de la biblioteca Linux-8086 C que formó parte del proyecto ELKs con m68000

soporte agregado por Jeff Dionne y Kenneth Albanowski. Es un software bastante completo

implementación de libc, sin embargo, algunas de las API son un poco no estándar

y bastantes rutinas de libc comunes no están presentes. Actualmente tiene soporte estable para m68000, ColdFire y ARM (no MMU). Su objetivo principal de diseño era ser pequeño y liviano. Intenta ajustarse a cualquier estándar, aunque su API intenta ser compatible con la mayoría de las libcs. /p>

No siempre es exactamente igual.

La distribución uClinux proporciona un entorno que puede compilar usando

uC-libc o uClibc según sus necesidades. m68000 y Coldfire

generalmente es mejor elegir uC-libc ya que admite bibliotecas

compartidas y también es la libc más utilizada para estas CPU

<. p>funciona bastante bien con casi todas las plataformas soportadas por la distribución.

La libc que elijas usar será decidida según tus requisitos

uClinux tiene dos

Dos bibliotecas libc de uso común: uC-libc y uClibc. Aunque los nombres de los dos son muy similares, en realidad existen diferencias. Aquí hay una breve introducción a las diferencias entre los dos. uC-libc es la primera biblioteca desarrollada para uClinux. Fue portada por Jeff Dionne y Kenneth Albanowski al código fuente de la biblioteca Linux-8086 C para admitir m68000 en el proyecto EKL. uC-libc es una implementación completa de libc, pero algunas de sus API no son estándar y algunos estándares de libc no están implementados. uC-libc tiene soporte estable para m68000, ColdFire y ARM sin MMU. Sus principales objetivos de diseño son "pequeño" y "ligero", y trata de ser consistente con el estándar. Aunque su API es compatible con muchas libcs, no parece ser consistente con todos los estándares.

uClibc fue desarrollado a partir de uC-libc para resolver este problema. Todas sus API son estándar (tipos de retorno

correctos, parámetros, etc.), lo que compensa el estándar libc que no está implementado en uC-libc y ahora ha sido portado a

En múltiples arquitecturas. En términos generales, es lo más compatible posible con glibc para facilitar la reescritura de aplicaciones utilizando uClibc.

uClibc se puede utilizar en VM Linux estándar y uClinux. Para simplificar la aplicación, incluso se puede compilar en una biblioteca compartida en muchas plataformas que admitan MMU. Erik Anderson ha trabajado mucho detrás de uClibc

. uClibc admite muchas series de procesadores: m68000, Coldfire, ARM, MIPS, v850, x86, i960, Sparc, SuperH, Alpha, PowerPC e Hitachi 8. El creciente soporte de plataformas demuestra que uClibc

puede adaptarse fácilmente a nuevas arquitecturas. La distribución uClinux proporciona un entorno que le permite elegir compilar utilizando uC-libc o uClibc. Para las plataformas m68000 y Coldfire, es un poco mejor elegir uC-libc, porque admite bibliotecas compartidas y las bibliotecas compartidas son libc. Estas CPU suelen utilizar uClibc. Funciona bien con todas las plataformas. La libc que elija dependerá de sus necesidades.

newlib es una biblioteca en lenguaje C de código abierto para sistemas integrados. Se compone de dos bibliotecas: libc y libm.

Se caracteriza por ser liviana y rápida, y se puede portar. a muchas estructuras de CPU. newlib implementa muchas funciones complejas

incluyendo soporte de cadenas, operaciones de punto flotante, asignación de memoria (como malloc) y funciones de flujo de E/S (printf, fprinf()

, etc.). Entre ellos, libc proporciona la implementación de la biblioteca en lenguaje c y libm proporciona soporte para operaciones de punto flotante.

Al realizar una compilación cruzada del compilador gcc para ARM, al especificar diferentes opciones de configuración para gcc, la biblioteca de lenguaje C utilizada es diferente.

El compilador gcc usa Glibc de forma predeterminada, o usted. Puede usar uClibc/uC-libc (básicamente compatible con la API de Glibc). Cuando se usa

--with-newlib, el compilador gcc no usa Glibc. Cuando Glibc no tiene compilación cruzada, puede usar

--with-newlib para deshabilitar la conexión a Glibc y compilar el compilador bootstrap gcc.

Se puede ver en t-linux y t-arm-elf en

config/arm en el directorio fuente de gcc que diferentes --target también afectan la conexión de gcc con el lenguaje C

Biblioteca , t-linux (--target=arm-linux) usa Glibc por defecto, -arm-elf (--target=arm-elf) usa

- Dinhibit_libc prohíbe conectarse a Glibc, entonces podemos usar newlib y otras bibliotecas en lenguaje C para compilar la cadena de herramientas GCC

.

Aunque la cadena de herramientas GCC está configurada con diferentes bibliotecas de lenguaje C, dado que estas bibliotecas de lenguaje C se pueden usar para admitir GCC,

no tienen ninguna diferencia en el procesamiento de datos centrales. Gran acceso. Por lo tanto, la diferencia entre arm-linux-* y arm-elf-* se refleja principalmente en la implementación de la biblioteca de lenguaje C, como diferentes llamadas al sistema, diferentes implementaciones de conjuntos de funciones, diferentes códigos ABI\startup y

p>

Ligeras diferencias, como diferentes características del sistema.

No existe un estándar absoluto para el uso de arm-linux-* y arm-elf-*. Excluyendo las diferencias en las diferentes implementaciones de bibliotecas, gcc puede

compilar cualquier sistema. Tanto arm-linux-* como arm-elf-* se pueden usar para compilar programas y sistemas operativos básicos, pero los programas del sistema parecen más coordinados cuando se sigue la siguiente descripción:

arm-linux-* está dirigido en máquinas ARM que ejecutan Linux Depende de la biblioteca de lenguaje C especificada, Glibc. Debido a que Linux también usa Glibc, arm-linux-* se compila en máquinas ARM que ejecutan Linux.

arm-elf-* es un sistema de compilación independiente que no depende de la biblioteca de lenguaje C especificada Glibc. Puede usar otras bibliotecas de lenguaje C como newlib

y no requiere. un sistema operativo admite, cuando se utilizan algunas bibliotecas livianas en lenguaje C diseñadas para sistemas integrados, compilar programas bare metal (programas sin sistemas operativos grandes como Linux), como programas de monitoreo, cargadores de arranque, etc.

Puede hacer que los programas del sistema sean más pequeños y más rápidos.

La cadena de herramientas prediseñada de Linaro admite punto flotante duro y suave

Puedes obtenerla en /linaro-toolchain-binaries/hito/2012.08 prueba: ./arm-linux-gnueabihf. -gcc -print-multi-lib

La configuración predeterminada es --with-arch=armv7-a --with-tune=cortex-a9

--with-fpu= vfpv3-d16 --with-float=hard --with-mode=thumb

Para usar la flotación suave, necesita opciones: -marm -march=armv4t -mfloat-abi=soft.

En su caso, intente cambiar -march=armv5 a "-march=armv4t"

Si desea cambiar para configurar a cortex-a8 y armv5, necesita

<. p>* Cambie cortex-a9 a cortex-a8 en

samples/linaro-arm-linux-gnueabihf/crosstool.config

* Cambie armv4t a armv5 en

contrib/linaro/patches/gcc/linaro-4.7-2012.08/multilib.patch,

Luego sigue las instrucciones para reconstruir la cadena de herramientas

(contrib/linaro/doc/README .txt)

Por cierto: crosstool-ng-linaro no admite multilib para eglibc. Utiliza

el sysroot precompilado de Ubuntu Precise,

. p>

p>

Utilice la última versión de crosstool-ng de http://crosstool-ng.org/.