Linux From Scratch para Cubietruck – C7: Edificio de la cadena de herramientas GCC – cadena de herramientas de objetivo (ABB) -> (BBC)

1. herramienta de destino cadena consideración (BBC)
cadena de herramientas Target es para «brazo-luke-linux-gnueabihf».

a. Todas las bibliotecas de soporte están listos, sólo tenemos que construir binutils y gcc />
c. Una cruz GDB es necesario la aplicación de depuración remota en Cubietruck />
objetivo libs / encabezados durante la compilación, y vamos a configurarlo en bash_profile ya que utilizamos a menudo:.

SYSROOT = $ BUILDROOT / usr / $ target / sys-root

versiones de software:

linux-3.12.2.tar.xz
glibc-2.18.tar.xz
qemu-1.7.0.tar.bz2
gdb-7.6.2.tar . bz2

2. binutils

../../../src/binutils-2.23. 2/configure – prefix = $ BUILDROOT / usr – build = $ HOST – host = $ HOST – target = $ OBJETIVO – with-sysroot = $ SYSROOT – enable-build-with-CXX – enable- werror – disable-shared – enable-ld = por defecto – enable-oro = no

– con-sysroot puntos a « $ BUILDROOT / usr / $ BLANCO / sys-root» , ya que no podemos compartir con la máquina sysroot X86 más. Esta ronda de acumulación no construirá binutils lib objetivo (libbfd), ya que no tenemos la cadena de herramientas meta todavía. Vamos a construir después de cadena de herramientas está disponible.

3. Un independiente compilador gcc boostrap
Desde la construcción de bibliotecas de destino gcc exige una libc objetivo, y no tenemos ARM libc todavía, así que tenemos dependencia circular entre GCC y libc. La solución es construir un gcc «independiente» en primer lugar. A gcc independiente generará códigos para el medio ambiente «independiente», donde no existe libc. También se le llama cadena de herramientas «bare-metal» a veces. En nuestro caso, puesto que especificamos triplete destino como «brazo-luke-linux-gnueabihf», por lo que el gcc de arranque no puede ser llamado «bare metal» en sentido estricto, sino una versión degradada del gcc alojada. Si especificamos destino como «brazo Coincidir gnueabi» o «brazo Coincidir gnueabihf», entonces será un gcc «bare metal».

. ./../../src/gcc-4.8.2/configure
– prefix = $ BUILDROOT / usr
– build = $ HOST – host = $ HOST-target = $ target
– with-headers = no – with-newlib = sí – with-prefijo local de = $ SYSROOT

– disable-multilib – disable-nls – disable-shared
– with-gmp = $ HOSTROOT / usr – with-MPFR = $ HOSTROOT / usr – with-mpc = $ HOSTROOT / usr
– con-isl = $ HOSTROOT / usr – with-cloog = $ HOSTROOT / usr
– disable-libgomp – disable-libssp – disable-libmudflap

– disable-libatomic – disable-libitm – disable-libstdc + +-v3
– disable -libsanitizer – disable-gfortran – disable-boehm-gc
– -disable-libffi – disable-libjava
– disable- librería libobjc – disable-libada – disable-libgo
– disable- hilos
– with-abi = AAPCS-linux
– with-cpu = cortex-a7
– with-mode = brazo
– with-fpu = neon-vfpv4
– with-float = duro

Algunos configuración justifica explicar la profundidad

– with-headers = no with_newlib = sí

Esto indica a gcc que se compila sin cabeceras de sistema (encabezado libc es parte de ella), por lo que gcc no tratará de enlazar con libc, y no añadir «/ usr, / usr / lib «ruta del sistema etc en su ruta de búsqueda lib predeterminado después de que se construye y cuando se trate de compilar los programas para la plataforma de destino. Los nuevos «- con-sysroot» opciones deben estar vacíos ahora, ya que se trata de un gcc «independiente» sin ningún tipo de bibliotecas del sistema

en «$ gccsrc / gcc / configure.ac. «, hay una lógica para juzgar si el apoyo libc se debe desactivar mientras que la construcción gcc:

# Si este es un compilador cruzado que no
# tiene su propio conjunto de cabeceras y defina
# inhibit_libc

# Si esto es usar newlib, sin tener los encabezados disponibles ahora,
# y luego definir inhibit_libc en LIBGCC2_CFLAGS
# Esto evita libgcc2 de contener cualquier código que requiere libc
# apoyo
: $ {inhibit_libc = false}
si {{prueba x $ host = x && $ target test «x $ with_sysroot» = x;} | |
prueba x $ with_newlib = xsí;} &&
{prueba» x $ with_headers «= x | | test» x $ with_headers «= XNO;}; entonces ;
inhibit_libc = true
fi
AC_SUBST (inhibit_libc)

La lógica aquí es la siguiente: (a grabar en c sintaxis):

if (((host = objetivo) &&! ; with_sysroot == null) | | (with_newlib == sí))
; && (with_headers == no)

inhibit_libc = true;

Para inhibir libc, primero tenemos que especificar «with_headers = no»;
entonces si estamos cruzando la compilación de gcc, tenemos que garantizar «with_sysroot» no se ha especificado, o simplemente podemos especificar «with_newlib = yes» ;

En nuestro caso, estamos haciendo compilación cruzada gcc, así que sólo necesitamos especificar «- with_headers = no» y garantizar «with_sysroot» no se especifica;

Si queremos construir un gcc arranque nativo, debemos especificar «- with_headers = no – con-newlib = sí».

«inhibit_libc = true» rompe la dependencia circular entre gcc y libc, gcc desde ahora compilará libgcc sin contener cualquier código de libc

– enable-languages ​​= c

Lo único que necesitamos para compilar libc. . No c + + compilador necesaria

– disable-libgomp – disable-libssp – -disable-libmudflap
disable-libquadmath
– disable-libstdc + +-v3
– disable-libsanitizer – disable-gfortran – disable-boehm-gc
– disable-libffi – disable-libjava
– disable-librería libobjc – disable-libada – disable-libgo
– disable-threads

Estas opciones decirle a gcc no tratar de compilar las bibliotecas de destino, ya que no contamos con una libc objetivo y un compilador gcc de pleno derecho aún. He desactivado casi todos «target-libs/libs» excepto «libgcc / libzip», porque son necesarios para «host-libs/tools». Hay aquí una advertencia: «Enable – xxx» Opciones de gcc dicen acerca de que «característica» que permita, y los efectos de la desactivación de una función son:
. gcc se compila condicionalmente sin esos códigos relacionados en características exclucded;
. el objetivo característica correspondiente ejecutar bibliotecas de tiempo no se configura y construye.
Sabemos gcc haber «build / host / target — libs / herramientas» componentes, que son colectivamente módulos de software integrados para «construir / host / target» máquinas, a través de cadenas de herramientas dirigidas a «build / host / target». Activar / desactivar una función afectará a los componentes en las tres categorías. En nuestros casos gcc arranque, que en realidad sólo queremos desactivar el proceso de construcción de «target-libs/tools», pero tenemos que lograrlo indirectamente a través de la selección de características «enable/disable- ***» opciones. En realidad, Makefile gcc proporciona un mejor control de qué parte (build / host / target) se construiría / instalado a través de los objetivos de make:

hacer all-build install-build
make install-host
todo-host Fabricamos todo-target install-target

A través de ellos son blancos, puede controlar exactamente qué parte le gustaría construir e instalar.

– with-abi = AAPCS-linux
– with-cpu = cortex-a7
– with-mode = brazo
– with-fpu = neon-vfpv4
– with-float = duro

Estas opciones le dicen gcc nueva construcción para generar binaria objetivo para A20 cubietruck cpu, utilizando abi float duro por defecto. Tales incumplimientos se escribirán en el fichero de especificaciones de GCC, por lo que no es necesario especificar opciones de compilación (-m ***) cada vez que la compilación de código dirigido específicamente a bordo Cubietruck.

gcc @ debian: ~ /. cadena de herramientas / directo / gcc / home / gcc / cadena de herramientas / buildroot $ árbol

└ ─ ─ usr
├ ─ ─ bin
│ ├ ─ ─ brazo-luke-linux-gnueabihf-cpp
│ ├ ─ ─ brazo-luke-linux-gnueabihf-gcc
│ ├ ─ ─ brazo luke-linux-gnueabihf-gcc-4.8.2
│ ├ ─ ─ brazo-luke-linux-gnueabihf-gcc-ar
│ ├ ─ ─ brazo-luke-linux-gnueabihf-gcc-nm
│ ├ ─ ─ brazo-luke-linux-gnueabihf-gcc-ranlib
│ └ ─ ─ brazo-luke-linux-gnueabihf-gcov
├ ─ ─ incluyen
├ ─ ─ lib
│ └ ─ ─ gcc
│ └ ─ ─ brazo-luke-linux-gnueabihf
│ └ ─ ─ 4.8.2 (archivos de inicio de gcc)
│ ├ ─ ─ crtbegin.o
│ ├ ─ ─ crtbeginS.o
│ ├ ─ ─ crtbeginT.o
│ ; ├ ─ ─ crtend.o
│ ├ ─ ─ crtendS.o
│ ├ ─ ─ incluir (archivo de encabezados estándar exigido para una compatible con el estándar «independiente» compilador de C
│ │ ├ ─ ─ arm_neon.h
│ │ ├ ─ ─ float.h
│ ; │ ├ ─ ─ iso646.h
│ │ ├ ─ ─ mmintrin.h
│ │ ├ ─ ─ stdalign.h
│ ; │ ├ ─ ─ stdarg.h
│ │ ├ ─ ─ stdbool.h
│ │ ├ ─ ─ stddef.h
│ │ ├ ─ ─ stdfix.h
│ │ ├ ─ ─ stdint-gcc.h
│ ; │ ├ ─ ─ stdint.h
│ │ ├ ─ ─ stdnoreturn.h
│ │ ├ ─ ─ descansar-brazo -common.h
│ ; │ ├ ─ ─ unwind.h
│ │ └ ─ ─ cabecera varargs.h
│ ├ ─ ─ fijo incluir
│ │ ├ ─ ─ limits.h
│ │ ├ ─ ─ README
│ │ └ ─ ─ syslimits.h
│ ├ ─ ─ install-herramientas
│ │ ├ ─ ─ fixinc_list
│ ; │ ├ ─ ─ gsyslimits.h
│ │ ├ ─ ─ incluir
│ │ │ ├ ─ ─ limits.h
│ │ │ └ ─ ─ README
│ ; │ ├ ─ ─ macro_list
│ │ └ ─ ─ mkheaders.conf
│ ├ ─ ─ libgcc.a
│ ; ├ ─ ─ libgcov.a
│ └ ─ ─ Plugin
│ ├ ─ ─ gtype.state
│ └ ─ ─ incluya
│ ; ├ ─ ─ ada
… ………………………………………….. ……….
│ ; ├ ─ ─ vec.h
│ └ ─ ─ version.h
├ ─ ─ lib64
│ └ ─ ─ libiberty . a
├ ─ ─ libexec
│ └ ─ ─ gcc
│ └ ─ ─ brazo-luke-linux-gnueabihf
│ └ ─ ─ 4.8.2 (programas internos CCG)
│ ├ ─ ─ cc1
│ ├ ─ ─ collect2
│ ├ ─ ─ install-herramientas
│ │ ├ ─ ─ fixincl
│ │ ├ ─ ─ fixinc.sh
│ │ ├ ─ ─ mkheaders
│ │ └ ─ ─ mkinstalldirs
│ ├ ─ ─ liblto_plugin . la
│ ; ├ ─ ─ liblto_plugin.so -> liblto_plugin.so.0.0.0
│ ├ ─ ─ liblto_plugin.so.0 -> liblto_plugin.so .0.0.0
│ ; ├ ─ ─ liblto_plugin.so.0.0.0
│ ├ ─ ─ LTO1
│ ├ ─ ─ lto- envoltorio
│ └ ─ ─ Plugin
│ └ ─ ─ gengtype
└ ─ ─ acción
├ ─ ─ info
│ ├ ─ ─ cpp.info
│ ├ ─ ─ cppinternals.info
│ ├ ─ ─ dir
│ ├ ─ ─ gcc.info
│ ├ ─ ─ gccinstall.info
│ └ ─ ─ gccint.info
└ ─ ─ hombre
├ ─ ─ man1
│ ├ ─ ─ brazo-luke-linux-gnueabihf-cpp.1
│ ├ ─ ─ brazo-luke-linux-gnueabihf-gcc.1
│ └ ─ ─ brazo-luke -linux-gnueabihf-gcov.1
└ ─ ─ man7
├ ─ ─ fsf-funding.7
x-small;»>COLLECT_LTO_WRAPPER=/home/gcc/toolchain/buildroot/usr/libexec/gcc/arm-luke-linux-gnueabihf/4.8.2/lto-wrapper


COLLECT_LTO_WRAPPER=/home/gcc/toolchain/buildroot/usr/libexec/gcc/arm-luke-linux-gnueabihf/4.8.2/lto-wrapper
 /home/gcc/toolchain/buildroot/usr/lib/gcc/arm-luke-linux-gnueabihf/4.8.2/include
 /home/gcc/toolchain/buildroot/usr/lib/gcc/arm-luke-linux-gnueabihf/4.8.2/include-fixed
 /home/gcc/toolchain/buildroot/usr/lib/gcc/arm-luke-linux-gnueabihf/4.8.2/../../../../arm-luke-linux-gnueabihf/bin/as x-small;»>COMPILER_PATH=/home/gcc/toolchain/buildroot/usr/libexec/gcc/arm-luke-linux-gnueabihf/4.8.2/:/home/gcc/toolchain/buildroot/usr/libexec/gcc/arm-luke-linux-gnueabihf/4.8.2/:/home/gcc/toolchain/buildroot/usr/libexec/gcc/arm-luke-linux-gnueabihf/:/home/gcc/toolchain/buildroot/usr/lib/gcc/arm-luke-linux-gnueabihf/4.8.2/:/home/gcc/toolchain/buildroot/usr/lib/gcc/arm-luke-linux-gnueabihf/:/home/gcc/toolchain/buildroot/usr/lib/gcc/arm-luke-linux-gnueabihf/4.8.2/../../../../arm-luke-linux-gnueabihf/bin/
LIBRARY_PATH=/home/gcc/toolchain/buildroot/usr/lib/gcc/arm-luke-linux-gnueabihf/4.8.2/:/home/gcc/toolchain/buildroot/usr/lib/gcc/arm-luke-linux-gnueabihf/4.8.2/../../../../arm-luke-linux-gnueabihf/lib/
 /home/gcc/toolchain/buildroot/usr/libexec/gcc/arm-luke-linux-gnueabihf/4.8.2/collect2 -L/home/gcc/toolchain/buildroot/usr/lib/gcc/arm-luke-linux-gnueabihf/4.8.2/../../../../arm-luke-linux-gnueabihf/lib />

http://oreilly.com/linux/excerpts/9780596100797/kernel-build-command-line-reference.html
http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-1.4274/

/home/gcc/toolchain/x86_64-luke-linux-gnu/usr/lib/gcc/x86_64-luke-linux-gnu/4.8.2/include 

/home/gcc/toolchain/arm-luke-linux-gnueabihf/usr/arm-luke-linux-gnueabihf/sys-root
«.