Linux From Scratch para Cubietruck – C2: entorno hospedado de introducción

1. Canalización de procesamiento de GCC

GCC es una suite de software que trabajan juntos para traducir el código fuente en ejecutable. Este post contiene información detallada sobre los componentes del CCG.

Http://blog.lxgcc.net/wp-content/uploads/2011/03/GCC_frontend.pdf

Aquí es la arquitectura GCC exigido desde arriba mensaje:

Utilice nuestro» hello.c » como ejemplo. He aquí todos los pasos de una compilación completa

$ gcc. – v – hola.c save-temp

/ usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -E-quiet-v-imultiarch x86_64-linux-gnu hello.c-mtune = genérico -march = x86-64-fpch-preproceso-o Hello.I

Courier New, Courier, monospace; font-size: x-small;»>

como-v – 64-o hello.o hello.s

/ usr/lib/gcc/x86_64-linux-gnu/4.7/collect2 – sysroot = / – build-id – sea necesario sin añadir – eh-frame-hdr-m elf_x86_64 – hash-style = ambos-dinámico-enlazador / lib64/ld-linux-x86 -64.so.2 / usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o / usr/lib/gcc/x86_64-linux- gnu/4.7/../../../x86_64-linux-gnu/crti.o / usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o -L/usr/lib/gcc/x86_64 -linux-gnu/4.7 -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux- gnu/4.7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu-L / usr / lib /.. / lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7 / .. / .. / .. hello.o-lgcc – as–lgcc_s necesarios – no-como-necesaria-lc-lgcc – lgcc_s-según sea necesario – no-como-necesaria / usr/lib/gcc/x86_64-linux-gnu / 4.7/crtend.o / usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o

Así puede ver hello.c es procesada por una cartera de herramientas y la experiencia de una serie de transformaciones.
Here» «es tanto el pre-procesador y c compilador. Una vez generado el archivo de ensamblado «*. S», la tarea del compilador de C se hace ya. GCC sólo es responsable de generar un archivo de ensamblaje. La tarea restante se deja a binutils «, como / ld». «Collect2» es un programa envoltorio gcc para «ld». Generará código adicional (una función llamada «__main», que se llamará antes de «principal») para agregar lógica de inicialización de constructor de objeto. Esta parte del tratamiento es necesario para c + +. Si su código c se compilará con c + + de código, sino que también tiene que ser procesado por «collect2». Así que si la compilación a través del controlador «gcc», la collect2 siempre se llamará. Si está programando directamente en asamblea, puede utilizar «ld» directamente.

gcc es sólo un «controlador compilador», y actúa como una fachada para los programas de back-end. Los parámetros de gcc se traducirán a los parámetros correspondientes de los programas respectivos.

2. Cómo definir un «entorno alojado»?

El entorno de ejecución para una aplicación se proporciona una multitud de componentes. Entre ellos, cpu, kernel, sistema operativo, libc, cadena de herramientas, bibliotecas de tiempo de ejecución idioma y el formato de archivo de aplicación de tienda juegan un papel importante.

Como programador, tenemos acceso a la CPU a través del conjunto de instrucciones proporcionada por la CPU. ¿Cuántos vendedores cpu hay en el mundo? Más de lo que puedo concebir personalmente. Entre ellos, Intel, AMD, ARM, IBM (Power PC), Oracle (Sparc), MIPS son los que he usado antes. Para una familia de CPUs de un solo proveedor, aunque puede ser que tiene gran cantidad de modelos específicos con diferente poder de cómputo, para mantener la compatibilidad entre ellos y hacer la vida más fácil para programadores de software, proveedores de CPU generalmente definirá una «arquitectura del conjunto de instrucciones (ISA)» que cubrirá toda la familia. Por ejemplo, Intel tiene un ISA unificada para todos sus 8086/286/386/486/pentium/core CPUs de la serie. ARM definen una serie de ISA por su cada vez más potente CPU, que se extiende desde amrv1 a ARMv8 hoy. La documentación más autorizada para cpu viene de «Manual de consulta técnica de» vendedores de CPU, que a menudo en el volumen de varios miles de páginas.

Para

núcleo, que sólo se centran en Linux. Así que sólo hay un kernel que debemos tratar. Kernel Linux está programado en C, y la funcionalidad proporcionada por el kernel de Linux se define en un conjunto de archivos de cabecera C denominado «kernel headers» y se exporta como «llamadas del sistema». Kernel Linux es compatible con una versión anterior. Por ejemplo, aunque la versión 3.8 añade muchas nuevas características que la versión 3.0, pero todos los programas escritos en contra de la versión 3.0 serán todos trabajar bajo kernel 3.8. En la plataforma Linux, el mayor cliente de kernel es libc, ya sea glibc, EGLIBC, uclibc o Bionic, etc Así que si usted va a compilar la biblioteca de CA, es necesario especificar primero la versión del núcleo y correspondiente cabecera del kernel archivos, de manera libc puede compilarse contra ella.
Hay muchas distribuciones del sistema operativo basado en el kernel de Linux y el software GNU. Todos ellos son «Unix» como sistemas en los ojos del usuario. Tradicionalmente, hay muchas normas que definen qué sistema operativo podría ser considerado como un sistema de «Unix». Entre ellos la norma más importante se llama «POSIX» style=»font-family: inherit;»> ( Sistema Operativo Portable .) Muchas OS comerciales como AIX, HP-UX, OS X, Solaris, Tru64 z / OS son marcas «POSIX» sistemas operativos compatibles. Linux / BSD, en la mayoría de los aspectos, si no todos, son también «POSIX» compatible. También hay una especificación «Linux Estándar Base» para definir lo que es una distribución de Linux debe ser similar, que es básicamente un acuerdo entre los proveedores de distribución de linux.

mayoría de los programas tendrán acceso a servicio de OS / kernel a través de una interfaz de biblioteca estándar de C . C biblioteca es la más importante API (Interfaz de Programación de Aplicaciones) en el sistema host. Si la biblioteca c implementa todas las interfaces en el estándar POSIX, diremos que esta biblioteca es c «POSIX» obediente. Con una libc, como la línea de base, se puede desarrollar cualquier aplicación para que su distribución OS «POSIX» obediente.

ayuda de GCC c / c + + de compilación. Para el lenguaje C, existen normas C89/C99/C11. GCC es C89/C99 compatible con su nuestra extensión de GNU. Actualmente ayuda de GCC para C11 es todavía experimental. La biblioteca de ejecución C es proporcionado por glibc, la implementación GNU de la biblioteca estándar c. Para C + +, hay C + 98 C / C + 03 C / C + 11 normas. GCC 4.8.1 es un compilador compatible con C + +11. La biblioteca de c + + runtime «libstdc + +» es parte de la distribución de GCC.

style=»line-height: 19.1875px;»>

En Linux y Unix Plataforma, ELF ( ejecutable y enlazable Formato ) es la corriente principal formato oficial de archivos para almacenar aplicaciones artefactos binarios.


style=»line-height: 19.1875px;»> Por lo tanto, lo que puede define exactamente un «entorno alojado»? Todas las materias antes mencionadas y, junto con otras cosas que no sabía. En lo personal, desde el ojo de un programador, creo que la documentación más relevante e integral que debe buscar a debe ser la interfaz binaria de aplicación (ABI) spec.

Un ABI se basa en una arquitectura de CPU específica (ISA), especificará convención llamada a la función, la interfaz de llamadas al sistema (a nivel de sistema operativo), y, la información más importante en formato binario. Consulte a continuación enlace para obtener más información sobre ABI:

style=»line-height: 19.1875px;»>

http://refspecs.linuxbase.org/
Para los procesadores ARM, aquí está la ABI de la compañía ARM (interfaz binaria de aplicación (ABI) para la arquitectura ARM) para la arquitectura ARM
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.swdev.abi/index.html

style=»line-height: 19.1875px;»> En el mundo de Linux, que normalmente exigen la implementación de ARM ABI como «eabi», dando a entender «ABI incrustado», ya que la mayoría de las CPU de ARM se utilizan en el escenario integrado. Con ARMv8-A y la corteza A53/A57, las CPU de ARM se encuentran ahora en la edad de 64 bits y puede tener una buena oportunidad de competir en los mercados de servidores tradicionales. Así que «eabi» es una especie de engaño en la actualidad.

style=»line-height: 19.1875px;»>


3. Máquina del trío de GCC
GCC se ha migrado a diferentes arquitecturas de CPU y sistemas operativos. GCC trabaja en Intel / AMD / ARM / Sparc / PowerPC / SH / MIPS, etc, y el CCG se migra a Linux, BSD, Mac OS, Solaris, AIX, etc Para muchos puertos, GCC necesita una formalidad para especificar el «entorno alojado» donde GCC se ejecuta en y genera código para. GCC utilizar su propia terminología para especificar un entorno alojado. Es el famoso «triplete máquina»:
cpu-vendedor-os
«cpu» corresponde a un conjunto de instrucciones de la familia, por ejemplo, x86, x86_64, brazo, etc;
«vendedor» no es significativo, por lo general puede ser «none» o «desconocido». En muchos casos, puede omitir «vendedor» y acaba de especificar «cpu-os»;
«os» en realidad se especifica el sistema operativo y ABI correspondiente. Por ejemplo, linux-gnu, eabi / eabihf (Linux en ARM). Algunos tríos típicos son:
x86_64-ningunos-linux-gnu: (intel 64bit / amd cpu con Linux se ejecutan en él)
i586-ningunos-linux-gnu: (intel 32bit / amd cpu con Linux corriendo en él)
brazo-ningunos-linux-gnu: (brazo de 32 bits que ejecutan Linux)
brazo Coincidir eabi: (brazo de 32 bits de la máquina de metal desnudo, flotador suave)
armar Coincidir eabihf: ; (brazo de 32 bits de la máquina de metal desnudo, flotador duro)
aarch64-ningunos-linux-gnu: (brazo de 64 bits (ARMv8-A) que se ejecuta Linux)
aarch64- ninguno-eabihf: (brazo de 64 bits (ARMv8-A) de metal desnudo, flotador duro)
No hay ninguna norma para el triplete gcc. Es una especie de formalidad empleada por GCC. Los materiales más relevantes de gcc relativos máquina triplete que pude encontrar es en los códigos fuente del CCG.

style=»font-family:’Courier New’, Courier, monospace; font-size: x-small;»> $ {} gccsrc / gcc / config. sub

Este script en realidad es sólo un script de shell. Se distribuye con muchos programas GNU, además de GCC. Por ejemplo, se puede encontrar en binutils. Esa debe ser la misma copia. La copia más reciente se pudo encontrar aquí:
http://git.savannah.gnu.org/gitweb/?p=config.git; a = blob_plain; f = config.sub; mp = CABEZA

Si usted no está seguro de cómo especificar un triplete, puede proporcionar su mejor respuesta a config.sub, y le dirá que la «GCC triplete canónico», basado en su nombre adivinado. Por ejemplo,

$ . / Config.sub x86
x86-desconocido-no
$ / config.sub x86-linux
-x86 unknown-linux-gnu
$ / config.sub x64-linux
x64 inválido configuración` -linux ‘: máquina `x64’. no reconocido
$ / config.sub amd64-linux
x86_64-pc-linux-gnu
$ . / config.sub arm-linux
-brazo unknown-linux-gnu
$ / config.sub brazo-linux-eabi
arm-linux-eabi
$ / config . sub arm-linux-eabihf
arm-linux-eabihf
$ . / config.sub aarch64
aarch64-desconocido-no
$ / config.sub aarch64-linux
aarch64-unknown-linux-gnu
$ / config.sub. aarch64-linux-eabihf
aarch64-linux-eabihf

¿Cómo GCC interpretará estos «forma canónica» depende de abajo GCC scripts de configuración:

{$ gccsrcdir} / configure {crear, alojar, target}

GCC definirá un montón de variables de base en los valores suministrados por el triplete de «host» y «objetivo» al compilar el programa. Para A20 cubietruck gcc cruz cadena de herramientas, la mejor relación calidad «- host» y «- objetivo» debe ser:

– host = x86_64-unknown-linux-gnu
– target = brazo-linux-eabihf

Vamos a hablar más acerca de cómo configurar GCC tarde
4. Determine entorno alojado de un binario de la aplicación
Si se le entregó un binario de la aplicación, (ejecutables, archivos objeto, biblioteca estática / acción), ¿cómo se puede determinar en donde se celebró el medio ambiente se ejecutará?
El «archivo» util en Linux hace este trabajo muy bien para usted.

Courier New, Courier, monospace; font-size: x-small;»> / usr/bin/gcc-4.7: ELF 64-bit LSB ejecutable , x86-64, versión 1 (SYSV), vinculada de forma dinámica (usa librerías compartidas), para GNU / Linux 2.6.26, BUILDID [SHA1] = 0x5b1e5d5b83ae088e6e189e0387376f75ccb71fe9, despojado

Courier New, Courier, monospace; font-size: x-small;»> archivo / lib/x86_64-linux-gnu/libc-2.13.so

Courier New, Courier, monospace; font-size: x-small;»>

$ file / usr/lib/gcc/x86_64-linux-gnu/4.7 / crtbegin.o

$ ldd / usr/bin/gcc-4.7

Courier style=»font-family: linux-vdso.so.1 => (0x00007fffe8bb0000)
libm.so.6 => / lib/x86_64-linux-gnu/libm. so.6 (0x00007f8731bc4000)

libc.so.6 => / lib/x86_64-linux-gnu/libc.so.6 (0x00007f873183a000)

/ lib64/ld-linux-x86-64.so.2 (0x00007f8731e6f000)

Podemos ver «gcc» bibliotecas utilización compartir «libm / libc» y su enlazador dinámico es «/ lib64/ld-linux-x86-64.so.2».
Si el binario de la aplicación es el formato ELF, entonces usted puede conseguir todos los detalles a través de «objdump / readelf». Dado que todos los datos que un entorno alojado necesita para ejecutar su aplicación reside en el archivo ELF bien estructurado, con las herramientas adecuadas se puede obtener todo lo que quieras saber. En realidad, «archivo» y «ldd» también aprovechan la información ELF
información general #
$ readelf-h / usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Clase: elf64

Version: 1 (actual)

ABI Versión: 0

Tipo: ; REL (archivo reubicable)
Máquina: Advanced Micro Devices X86-64

dirección del punto de entrada : 0x0

……


$ readelf-h / usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc.a
….
Archivo: / usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc.a (morestack.o)
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Clase: ; elf64

Versión: ; 1 (actual)

ABI Versión: ; 0

de la máquina: ; Advanced Micro Devices X86-64

Versión: 0x1
Courier New, Courier, monospace; font-size: x-small;»> …. ..

$ readelf-h / lib/x86_64-linux-gnu/libc. so.6

Courier New, Courier, monospace; font-size: x-small;»> Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00

de los datos: el complemento a 2, little endian

OS / ABI: UNIX – System V

Courier New, Courier, monospace; font-size: x-small;»> Tipo: DYN (fichero objeto compartido)

Versión: 0x1

$ readelf-h / usr/bin/gcc-4.7
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Clase: elf64
de datos: complemento a 2, little endian
Versión: ; 1 (actual)
OS / ABI: UNIX – System V
ABI Versión: ; 0
Tipo: EXEC (archivo ejecutable)
de la máquina: ; Advanced Micro Devices X86-64
Versión: 0x1
Punto de entrada: 0x405ba8

$ objdump-d / usr/bin/gcc-4.7 | grep-A15 405ba8

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *