Conceptos básicos de compilación cruzada.

1 ¿Qué es la compilación cruzada?

1.1 Compilación local

Antes de explicar qué es la compilación cruzada, primero debemos entender qué es la compilación local.

La compilación local puede entenderse como que, en la plataforma de compilación actual, el programa compilado solo se puede ejecutar en la plataforma actual. Nuestro desarrollo de software común generalmente pertenece a la compilación local.

Por ejemplo, escribimos programas en la plataforma X86 y los compilamos en archivos ejecutables. De esta manera, utilizamos las herramientas de la plataforma X86 para desarrollar programas ejecutables para la propia plataforma X86. Este proceso de compilación se denomina compilación local.

1.2 Compilación cruzada

La compilación cruzada puede entenderse como que, en la plataforma de compilación actual, el programa compilado puede ejecutarse en otra plataforma de destino con una arquitectura diferente, pero la plataforma de compilación en sí no puede ejecutar el programa modificado.

Por ejemplo, escribimos un programa en la plataforma x86 y lo compilamos en un programa que puede ejecutarse en la plataforma ARM. El programa compilado no puede ejecutarse en la plataforma x86 y debe colocarse en la plataforma ARM para ejecutarse.

1.3 ¿Por qué existe la compilación cruzada?

Las principales razones de la compilación cruzada son:

  • Velocidad: la plataforma de destino a menudo funciona mucho más lenta que el host, y muchos hardware integrados dedicados están diseñados para ser de bajo costo y bajo consumo, sin un rendimiento demasiado alto.
  • Capacidad: todo el proceso de compilación consume muchos recursos y los sistemas integrados a menudo no tienen suficiente memoria o espacio en disco.
  • Disponibilidad: incluso si la plataforma de destino tiene recursos suficientes y se puede compilar de forma nativa, el primer compilador nativo que se ejecuta en la plataforma de destino siempre debe obtenerse mediante compilación cruzada.
  • Flexibilidad: un entorno de compilación completo de Linux requiere muchos paquetes de soporte. La compilación cruzada nos ahorra perder tiempo trasladando varios paquetes de soporte a la placa de destino.

1.4 ¿Por qué es difícil la compilación cruzada?

La dificultad de la compilación cruzada radica en dos aspectos:

Diferentes arquitecturas tienen diferentes características de máquina.

  • Tamaño de palabra: ¿Es un sistema de 64 o 32 bits?
  • Endianidad: ¿Es un sistema big-endian o little-endian?
  • Alineación: si el acceso según la alineación de 4 bytes es obligatorio
  • Firma predeterminada: el tipo de datos predeterminado está firmado o sin firmar
  • NOMMU: si es compatible con MMU

El entorno del host es diferente del entorno de destino cuando se realiza la compilación cruzada

  • Problemas de configuración:
  • HOSTCC frente a TARGETCC:
  • Fugas en la cadena de herramientas:
  • Bibliotecas:
  • Pruebas:

2 cadena de compilación cruzada

2.1 ¿Qué es una cadena de compilación cruzada?

Ahora que entendemos qué es la compilación cruzada, echemos un vistazo a qué es una cadena de compilación cruzada.

En primer lugar, el proceso de compilación es un proceso complejo compuesto por diferentes subfunciones en secuencia, como se muestra en la siguiente figura:

Insertar descripción de la imagen aquí

Luego, el proceso de compilación incluye preprocesamiento, compilación, ensamblaje, vinculación y otras funciones. Dado que existen diferentes subfunciones, cada subfunción se implementa mediante una herramienta independiente y juntas forman un conjunto de herramientas completo.

Al mismo tiempo, el proceso de compilación es un proceso secuencial, que necesariamente implica el orden de uso de las herramientas: cada herramienta está conectada en serie de acuerdo con la relación secuencial, formando una estructura de cadena.

Por lo tanto, la cadena de compilación cruzada es un conjunto completo de herramientas compuesto por múltiples subherramientas para compilar código de programa para arquitecturas multiplataforma. Al mismo tiempo, oculta los detalles de preprocesamiento, compilación, ensamblaje, vinculación, etc. Cuando especificamos el archivo fuente (.c), automáticamente llamará a diferentes subherramientas según el proceso de compilación y generará automáticamente el binario final. imagen del programa (.bin).

Nota: Estrictamente hablando, un compilador cruzado solo se refiere a gcc con compilación cruzada, pero de hecho, por conveniencia, el compilador cruzado al que a menudo nos referimos es una cadena de herramientas cruzadas. Este artículo no distingue entre estos dos conceptos, ambos se refieren a la cadena de compilación.

2.2 Reglas de nomenclatura para cadenas de compilación cruzada

Cuando usamos una cadena de compilación cruzada, a menudo vemos nombres como este:

arm-none-linux-gnueabi-gcc
arm-cortex_a8-linux-gnueabi-gcc
mips-malta-linux-gnu-gcc

Entre ellos, el prefijo correspondiente es:

arm-none-linux-gnueabi-
arm-cortex_a8-linux-gnueabi-
mips-malta-linux-gnu-

Las reglas de nomenclatura de estas cadenas de compilación cruzada parecen ser generales y existen ciertas reglas:

arch-core-kernel-system
  • arch: Qué plataforma de destino utilizar.
  • núcleo: qué núcleo de CPU se utiliza, como Cortex
    A8, pero este grupo de nombres parece ser más flexible. En las cadenas de compilación cruzada proporcionadas por otros fabricantes, algunos llevan el nombre del fabricante y otros el nombre de la placa de desarrollo. , o directamente ninguno o cruzado.
  • Kernel: el sistema operativo que se está ejecutando, los que he visto incluyen Linux, uclinux y bare (sin sistema operativo).
  • sistema: especificaciones de funciones de biblioteca e imágenes de destino seleccionadas por la cadena de compilación cruzada, como gnu, gnueabi, etc. Entre ellos, gnu equivale a glibc+oabi; gnueabi equivale a glibc+eabi.

3 herramientas incluidas

3.1 Binutils

Binutils es una de las herramientas GNU, que incluye enlazadores, ensambladores y otras herramientas para archivos y archivos de objetos. Es una herramienta de procesamiento y mantenimiento de código binario.

Las subrutinas incluidas en la herramienta Binutils son las siguientes:

  • ld Enlazador GNU el enlazador GNU.
  • como ensamblador GNU.
  • addr2line convierte la dirección en un nombre de archivo y el número de línea
  • ar Una utilidad para crear, modificar y extraer archivos.
  • c++filt Filtro para exigir símbolos C++ codificados.
  • dlltool Crea archivos para crear y usar DLL.
  • gold Un nuevo enlazador solo ELF, más rápido, aún en prueba beta.
  • gprof Muestra información de perfiles.
  • nlmconv Convierte código objeto en un NLM.
  • nm Enumera símbolos de archivos objeto.
  • objcopy Copia y traduce archivos objeto.
  • objdump Muestra información de archivos objeto.
  • ranlib Genera un índice del contenido de un archivo.
  • readelf Muestra información de cualquier archivo objeto en formato ELF.
  • tamaño Enumera los tamaños de sección de un objeto o archivo comprimido.
  • cadenas Enumera cadenas imprimibles de archivos.
  • tira Descarta símbolos

3.2 El conjunto de compiladores GCC
GNU admite C, C++, Java, Ada, Fortran, Objective-C y muchos otros lenguajes.

3.3 GLibc

La biblioteca de funciones C comúnmente utilizada en Linux es glibc. Glibc es la API de nivel más bajo en el sistema Linux y casi cualquier otra biblioteca en ejecución depende de glibc. Además de encapsular los servicios del sistema proporcionados por el sistema operativo Linux, el propio glibc también proporciona la implementación de muchos otros servicios funcionales necesarios.

Debido a que los recursos del entorno integrado son extremadamente limitados, además de glibc, ahora hay uClibc y eglibc para elegir.

Supongo que te gusta

Origin blog.csdn.net/qq_41483419/article/details/132302741
Recomendado
Clasificación