Linux From Scratch para Cubietruck – C8: Bare cadena de herramientas de metal

En el post anterior, sabemos que al compilar el kernel y glibc usando una cadena organizada transversal de la herramienta, los Makefiles de kernel y glibc hará toda la disposición alguna compilar banderas de gcc, cabeceras de entorno de modo alojados, puesta en marcha códigos y las bibliotecas no se incluirá y se vincula a binario final. El guión enlazador también puede personalizar de acuerdo al formato de memoria deseado. Este es un escenario típico para el desarrollo «, independiente / bare metal» de programación.

Además del kernel y glibc, vamos a compilar los gestores de arranque para cubietruck. Una cadena de herramientas de metal desnudo personalizado para cubietruck nos ahorrará el tener que introducir cuando tratamos de codificar para el medio ambiente metal desnudo, ya que todos los parámetros por defecto de compilación se han establecido en la cadena de herramientas. También es una buena oportunidad para poner a prueba nuestra comprensión de la cadena de herramientas mediante la construcción de una cadena de herramientas de metal desnudo, y lo utilizan para compilar glibc, kernel, y otras aplicaciones de metal desnudo potenciales.

El objetivo para máquina de metal desnudo es «brazo-luke-eabihf», frente al «brazo-luke-linux-gnueabihf». Las binutils y gcc se compilarán de acuerdo con este nuevo objetivo. Veamos lo que diferencia este nuevo objetivo lleva a nuestra cadena de herramientas de metal desnudo. Dado que se añade un nuevo objetivo, hacemos algún cambio a «bash_profile.»:

gcc @ luke-debian:. ~ $ cat bash_profile
BUILDSYSROOT = $ BUILDROOT / usr / $ BUILD / sys-root
HOSTSYSROOT = $ HOSTROOT / usr / $ HOST / sys-root
TARGETSYSROOT = $ TARGETROOT / usr / $ BLANCO / sys-root
TOOLSYSROOT = $ TOOLROOT / usr / $ HERRAMIENTA / sys-root
= $ BARESYSROOT raíz desnuda / usr / $ BARE / sys-root


PATH = $ {} TARGETROOT / usr / bin: $ {} TARGETROOT / bin: $ {HOSTROOT} / usr / bin: $ {HOSTROOT} / bin: $ {} a raíz desnuda / usr / bin: $ {raíz desnuda} / bin: $ {BUILDROOT} / usr / bin: $ {BUILDROOT} / bin: $ {TOOLROOT} / usr / bin: $ {TOOLROOT} / bin: $ {PATH}

MANPATH = $ TARGETROOT / usr / share / man: $ HOSTROOT / usr / share / man: $ MANPATH

cadena de herramientas de exportación WEB CAMINO MANPATH

CONSTRUIR TARGET BARE
exportación BIULDROOT HOSTROOT TOOLROOT a raíz desnuda
de exportación BIULDSYSROOT TARGETSYSROOT BARESYSROOT


if [-f ~ . / bashrc], luego
. . ~ / Bashrc;
fi
1. binutils
../../../src/binutils-2.23.2 / configure – prefix = $ a raíz desnuda / usr – build = $ HOST – host = $ HOST – target = $ BARE – with-sysroot = $ BARESYSROOT – disable-nls – enable-werror – disable -shared – enable-ld = por defecto – enable-oro = no

gcc @ luke-debian: ~ / directo / home / gcc / arm-luke-eabihf / usr $ árbol
.
├ ─ ─ brazo-luke-eabihf
│ ├ ─ ─ bin
│ │ ├ ─ ─ ar
│ │ ├ ─ ─ como
│ │ ├ ─ ─ ld
│ │ ├ ─ ─ ld.bfd
│ │ ├ ─ ─ nm
│ │ ├ ─ ─ objcopy
│ │ ├ ─ ─ objdump
│ │ ├ ─ ─ ranlib
│ │ └ ─ ─ strip
│ └ ─ ─ lib
│ └ ─ ─ ldscripts
│ ├ ─ ─ armelf.x
│ ├ ─ ─ armelf.xbn
│ ├ ─ ─ armelf.xc
│ ├ ─ ─ armelf.xn
│ ├ ─ ─ armelf.xr
│ ├ ─ ─ armelf.xs
│ ├ ─ ─ armelf.xsc
│ ├ ─ ─ armelf.xsw
│ ├ ─ ─ armelf.xu
│ └ ─ ─ armelf.xw
├ ─ ─ bin
│ ├ ─ ─ brazo-luke-eabihf-addr2line
│ ├ ─ ─ brazo-luke-eabihf-ar
│ ├ ─ ─ brazo-luke-eabihf-as
│ ├ ─ ─ brazo-luke-eabihf-c + + filt
│ ├ ─ ─ brazo-luke-eabihf-elfedit
│ ├ ─ ─ brazo-luke-eabihf-gprof
│ ├ ─ ─ brazo-luke-eabihf-ld
│ ├ ─ ─ brazo-luke-eabihf-ld.bfd
│ ├ ─ ─ brazo-luke-eabihf-nm
│ ├ ─ ─ brazo-luke-eabihf-objcopy
│ ├ ─ ─ brazo-luke-eabihf-objdump
│ ├ ─ ─ arm-luke-eabihf-ranlib
│ ├ ─ ─ brazo-luke -eabihf-readelf
│ ├ ─ ─ brazo-luke-eabihf- tamaño
│ ├ ─ ─ brazo-luke-eabihf cuerdas
│ └ ─ ─ brazo-luke-eabihf-strip
├ ─ ─ lib
├ ─ ─ lib64
│ └ ─ ─ libiberty.a
└ ─ ─ acción
………….. ………

La primera diferencia proviene de las ldscripts. Esta vez, «armelf. **» Linker script se usa en lugar de «armelf_linux_eabi. ***» Y «armelfb_linux_eabi. ***» En la cadena de herramientas alojado. Vamos a diferencia de dos de ellos:
gcc @ luke-debian: ~ $ diff arm-luke-eabihf/usr/arm-luke-eabihf/lib/ldscripts/armelf.x arm-luke-linux-gnueabihf/usr/arm-luke-linux-gnueabihf/lib/ldscripts/armelf_linux_eabi.x
10c10

Courier New, Courier, monospace; font-size: x-small;»>> PROPORCIONAR (__executable_start = SEGMENT_START (» text-segmento «, 0x00008000));. = SEGMENT_START («text-segmento», 0x00008000) + SIZEOF_HEADERS ,

103c103

162a163

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

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

> PROPORCIONAR (__data_start =.);
191a193
>. = DATA_SEGMENT_END (.);

Courier New, Courier, monospace; font-size: x-small;»> <. pila ; 0x80000:

Courier New, Courier, monospace; font-size: x-small;»> <_stack =;.

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

< ARM.attributes 0: {KEEP (* (ARM.attributes) ) MANTENGA (. * (gnu.attributes))}

Courier New, Courier, monospace; font-size: x-small;»>> gnu.attributes 0: { MANTENGA (* (. gnu.attributes))}

Puntos clave aquí:
a. ambos proporcionan un símbolo «__executable_start», con el valor de la dirección de inicio de. segmento de texto. Si no hay segmento de texto encontrado, que por defecto es «0x8000».

inherit;»> b. en entorno alojado, ld asume archivo ELF se carga en la memoria a través de cargador de Linux, por lo que se agregará «SIZEOF_HEADER» (el tamaño de la cabecera del programa en el archivo ELF) como compensación al contador de ubicación (.); En el entorno de metal desnudo, ld asume la llanura formato «binario» se utilizará para que nadie cabecera del programa de creación de contador de posición (.);

inherit;»> c. en el metal desnudo, apilar límite superior se establece en «0x80000»

inherit;»> d. en el metal desnudo, ARM atributos sección se conservan junto con los atributos de gnu sección; en env alojado, sólo gnu atributos se incluye. Para la sección de atributos acumulación brazo, por favor refiérase a ARM ABI:


inherit;»> Por lo que podemos ver, bajo «brazo-luke-eabihf», ld no sabe demasiado cómo le gustaría organizar su imagen de memoria ejecutable y proporcionar una básicamente guión de enlazado a la una en el brazo-linux-gnueabi entorno alojado. En realidad, para el metal desnudo, cada CPU puede tener muy diferentes mapa de memoria, casi siempre es necesario proporcionar su propio guión enlazador personalizado.


inherit;»>


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

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

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

/ * Script para-z combreloc: combinar y secciones tipo reloc * /
output_format («ELF32-littlearm», «ELF32-bigarm»,
«ELF32-littlearm»)

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

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

$ brazo-luke-eabihf-ld – verbose

ld GNU (GNU Binutils) 2.23.2

emulaciones compatibles:
armelf
mediante secuencias de comandos del vinculador interno:
====================================== ============

output_format («ELF32-littlearm», «ELF32-bigarm»,

» ELF32-littlearm «)
OUTPUT_ARCH (brazo)
…………………………………… ….

En la terminología de ld, una» emulación «es una combinación de» objetivo «,» arco «, y el guión enlazador personalizado. Un «objetivo» es el formato de archivo binario con el apoyo de libbfd, por ejemplo, « ELF32 poco», «elf64-x86-64», etc Para un formato, puede haber variaciones entre las diferentes plataformas de la CPU, es por eso que se necesita «arco». (Arco significa la arquitectura de la CPU). En tercer lugar, para el mismo blanco + arco, es posible escoger tipo de memoria de proceso diferente en diferentes sistemas operativos. Por eso usted tendrá una secuencia de comandos de enlace personalizado. En nuestro ld metal desnudo, se admite la «simulación» de «armelf». «Armelf» en realidad es el nombre de base de todos los scripts de enlazador bajo «lib / ldscripts», es decir «armelf.x», «armelf.xc», ect.
«armelf.x» será script por defecto, otras secuencias de comandos se usarán si las diferentes opciones del comando ld se encargar de ellos.
Para enumerar todos los «target «/» arco «libbfd soportes, utilice» objdump-i «:
$ brazo-luke-eabihf-objdump-i
cabecera BFD archivo de la versión (Binutils GNU) 2.23.2
ELF32-littlearm

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

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

binario
(encabezado endianness desconocido, datos endianness desconocido)
brazo
ihex

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


ELF32-littlearm-ELF32 bigarm ELF32 poco ELF32-grande srec


verilog symbolsrec tekhex ihex binario
brazo symbolsrec verilog tekhex ihex binario

Podemos ver mientras configurado para la máquina de destino «brazo-luke-eabihf», bfd apoyará « ELF32-littlearm-ELF32 bigarm ELF32 poco ELF32-grande srec symbolsrec verilog tekhex ihex binario « «objetivos» bajo el brazo «arch / cpu». Es el mismo formato que en el apoyo organizado «brazo-luke-linux-gnueabihf». Pero utilizan diferentes scripts de enlazador (emulación).

En los hechos, BFD soportar muchos formatos de lo posible puedo imaginar. Binutils tiene una opción de configuración «- enable-dianas = all». Si se utiliza esta opción, bfd va a construir el apoyo para todos los formatos, objdump / readelf / tira / nm puede leer / escribir todos los formatos de archivos binarios, ya que se utilizan libbfd como back-end para manipular ficheros objeto. Para el «como», que no es compatible «- enable-dianas = all», y que sólo configurar su generación de código basado en «- target = ***». El detalle está en «$ src / gas / configure.tgt».

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

cpu_type =


em = genérico

bfd_gas = no
arco =
endian =
………..

Brazo * ser | el brazo * b) cpu_type = brazo endian = grande;;


estilo

Brazo *) endian cpu_type = brazo = poco;;

…..

brazo-*-linux-* eabi *) fmt = elf em = armlinuxeabi ;;

caso $ {fmt} en

elf | ECOFF | fdpicelf | varios | som)
/home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/../../../../arm-luke-eabihf/bin/ld: x-small;»>/home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/../../../../arm-luke-eabihf/bin/ld: x-small;»>/home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/../../../../arm-luke-eabihf/bin/ld: x-small;»>/home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/../../../../arm-luke-eabihf/bin/ld: x-small;»>/home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/../../../../arm-luke-eabihf/bin/ld: x-small;»>COLLECT_LTO_WRAPPER=/home/gcc/arm-luke-eabihf/usr/libexec/gcc/arm-luke-eabihf/4.8.2/lto-wrapper
 /home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/include
 /home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/include-fixed
 /home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/../../../../arm-luke-eabihf/bin/as x-small;»>COMPILER_PATH=/home/gcc/arm-luke-eabihf/usr/libexec/gcc/arm-luke-eabihf/4.8.2/:/home/gcc/arm-luke-eabihf/usr/libexec/gcc/arm-luke-eabihf/4.8.2/:/home/gcc/arm-luke-eabihf/usr/libexec/gcc/arm-luke-eabihf/:/home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/:/home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/:/home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/../../../../arm-luke-eabihf/bin/
LIBRARY_PATH=/home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/:/home/gcc/arm-luke-eabihf/usr/lib/gcc/arm-luke-eabihf/4.8.2/../../../../arm-luke-eabihf/lib/

Deja un comentario

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