Linux From Scratch para Cubietruck – C5: Edificio de la cadena de herramientas GCC – cadena de herramientas de máquina de compilación (AAA)

Para tener un entorno de generación limpia, me gustaría hacer todo el edificio en una Debian 7 máquina virtual prístina.

1. camino de evolución cadena de herramientas

En Debian 7, tenemos una cadena de herramientas nativas existentes dirigidos especialmente a los «x86_64-linux-gnu». Vamos a construir una cadena de herramientas de focalización a «brazo-luke-linux-gnueabihf». Se trata de una ruta de evolución de la cadena de herramientas típicas de «AAA» a «AAC». Para que corresponde a los componentes de software de GCC «host-meta-construir», me gustaría que fingir otra cadena de herramientas que se enfoca en «x86_64-luke-linux-gnu». Esta cadena de herramientas tiene la firma «AAB»

A:. X86_64-linux-gnu />

» AAB «—>» ABC «. Nuestra cadena de herramientas final será un «canaidan» cadena de herramientas. Su build-tool/lib residirá en la máquina «A», host-libs/tools residirán en la máquina «B», y sus target-libs/tools residirán en la máquina de «C». Vamos a utilizar la cadena de herramientas «AAB» para construir host-libs/tools, y el recién generado «ABC» para construir target-libs/tools.

2. construir la cadena de máquina herramienta (AAA) preparación

Recordemos del último mensaje:

build_libs =» construir- libiberty «

# estas herramientas están diseñadas para el entorno de construcción
build_tools = «build-m4 acumulación fixincludes »

es una biblioteca gcc interna. Cuando gcc es de compilación, que necesita para acceder a esta lib en ciertos lugares. Se puede considerar como parte del tiempo de ejecución de gcc. libiberty se construye como biblioteca estática y vinculado a binario gcc estáticamente. Bintuils también incluyen libiberty. De acuerdo con el «README» en dir fuente libiberty:

Este directorio contiene la biblioteca-la libertad del software libre.
Es una colección de subrutinas usadas por varios programas GNU.
Los miembros actuales son:

getopt – obtener opciones de línea de comandos
obstack – pilas de objetos arbitrariamente empresas
; strerror – cadenas de mensajes de error correspondientes a errno
strtol – de cadena a largo conversión
; strtoul – string-to-largo sin signo de conversión

Esperamos que muchas de las subrutinas de GNU que están flotando alrededor de
finalmente llegar aquí.

La biblioteca debe configurarse desde el directorio de origen superior. No
intentar ejecutar configure de este directorio. Siga la configuración
instrucciones .. / README.

Pero libiberty incluye más funciones que las mencionadas en «README»:

libiberty $ ls * c
memcmp.c getopt.c alloca.c cp-demint.c ; sencilla-objeto-coff.c strncasecmp.c vfork.c pex-uno.c
argv.c CPLUS-dem.c getpagesize.c memcpy.c pex-unix.c simple a objetos elf.c strncmp.c vfprintf.c
asprintf.c crc32. c getpwd.c memmem.c pex-win32.c sencilla-objeto-mach-oc strndup.c vprintf.c
atexit.c _doprnt.c getruntime.c memmove.c ; physmem.c sencilla-objeto-xcoff.c strnlen.c vsnprintf.c
basename.c gettimeofday.c dwarfnames.c mempcpy.c putenv.c snprintf.c strrchr.c vsprintf.c
bcmp.c dyn-string.c memset.c hashtab.c random.c sort.c strsignal.c waitpid.c
hex.c fdmatch.c bcopy.c spaces.c regex.c mkstemps.c ; strstr.c xatexit.c
index.c ffs.c bsearch.c rename.c msdos.c splay-tree.c strtod.c xexit.c
bzero.c fibheap.c insque.c objalloc.c rindex.c apilar-limit.c strtol.c xmalloc.c
calloc.c filename_cmp.c lbasename.c obstack.c seguro ctype.c stpcpy.c strtoul.c xmemdup.c
floatformat.c elegir-temp.c ; lrealpath.c partition.c setenv.c stpncpy.c strverscmp . c xstrdup.c
reloj . c fnmatch.c make-relativa-prefix.c pex-common.c setproctitle.c strcasecmp.c ; timeval-utils.c xstrerror.c
concat.c fopen_unlocked.c make-temp-file.c pex-djgpp.c sha1.c strchr.c tmpnam.c xstrndup.c
copysign.c getcwd.c md5.c strdup.c sigsetmask.c pexecute.c ; desvincular-si-ordinary.c
getopt1-cp demangle.c . c memchr.c pex-msdos.c strerror.c simple object.c vasprintf.c

Muchos de ellos están funcs definen en la biblioteca de C estándar, como «memcpy / asprintf / random», etc Una posible uso de libiberty puedo adivinar debe estar en libgcc cuando GCC se configura como un «compilador independiente», donde se encuentra disponible para las bibliotecas de destino no «libc». Tal GCC es generalmente construido como el compilador de arranque para un compilador compilador cruzado hecho y derecho. Por ejemplo, una ruta de evolución de la cadena de herramientas de (AAB) a (ABC). Dado que el compilador cruzado se ejecutará en diferentes ordenador central (B frente a A), que debe ser construido en contra de una nueva libc. La forma más limpia para aislar el compilador cruzado desde libc entorno existente del equipo de generación es construir un «compilador de arranque independiente» en primer lugar. Este primer paso del compilador (AAB) se configura para ser independiente del compilador con «- sin-headers» y «- with-newlib». Así que cuando se utiliza para construir la nueva biblioteca libc (libc sí es sin duda una aplicación independiente y puede ser y debe ser construido por un compilador independiente), encabezados / libs de la máquina de construcción no tendrán ninguna posibilidad de contaminar la nueva libc. Algunas funciones estándar todavía se necesitan para este gcc bootstrap para correr, así que libgcc (el tiempo de ejecución gcc) utilizará las versiones proporcionadas por «libiberty» cuando el entorno libc estándar no está disponible.

libiberty también se incluye como «host-libs/tools», cada gcc necesita que se ejecute.

«fixincludes» es una herramienta de gcc utilizada para fijar algunas cabeceras de los archivos en de la máquina host «/ usr / include» antes de compilar gcc. GCC a veces no se puede compilar con los archivos de cabecera del sistema existentes. ¿Por qué cosas tan horribles sucedan es mucho más allá de mi interés personal y el alcance de esta serie. Hay un enlace aquí para obtener más información acerca de «fixincludes»:

http://ewontfix.com/12/

Si GCC disgustaba algunos archivos de cabecera del sistema, se utilizará «fixincludes» para remendar ellos y salvar las versiones parcheadas en su nuestro directorio build «$ gccbuild / gcc / fijo incluir». Entonces gcc se compilarán contra estos ficheros de cabecera parcheados. Para hacer esta historia un poco más aterrador es que «fijo incluyen» se empaquetan en la distribución en «$ libexec / fijo incluir» y estos archivos de cabecera son remendados en rutas de búsqueda de gcc y se tienen mayor prioridad que los archivos de cabecera en su sistema. En mi Debian 7 gcc-4.7, que se puede ver lo que está en «fijo incluir»:

$ tree-l / usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
/ usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
├ ─ ─ limits.h
├ ─ ─ linux
│ └ ─ ─ a.out.h
├ ─ ─ README
└ ─ ─ syslimits.h

Esto explica por qué GCC construirá la función «fixincludes». «Fixincludes» es también un «host-herramientas».

$ dpkg-l | grep gcc
gcc ii 4:4.7.2-1 ; amd64 GNU compilador de C
ii gcc-4.6 4.6 0,3-14 amd64 compilador GNU C
ii gcc-4.6-base: amd64 4.6.3-14 GCC amd64, el GNU Compiler Collection (paquete base)
ii gcc-4.7 4.7.2-5 ; amd64 GNU compilador de C
ii gcc-4.7-base: amd64 4.7.2-5 GCC amd64, la colección de compiladores de GNU (paquete base)
libgcc1 ii: amd64 ; 1:4.7.2-5 Biblioteca de ayuda de GCC amd64

$ gcc-v
Uso de las especificaciones incorporadas
COLLECT_GCC = gcc
COLLECT_LTO_WRAPPER = / usr/lib/gcc/x86_64-linux-gnu / 4.7/lto-wrapper
Objetivo: x86_64-linux-gnu
Configurado con: .. / src / configure-v – with-pkgversion = ‘Debian 4.7.2-5 ‘- with-bugurl = file :/ / / usr/share/doc/gcc-4.7/README.Bugs – enable-languages ​​= c, c + +, vaya, fortran, objc, obj-c + + – -prefix = / usr – programa-suffix = -4.7 – enable-shared – enable-enlazador-build-id – with-zlib-sistema – libexecdir = / usr / lib – gettext-incluida sin– -enable-threads = posix – with-gxx-include-dir = / usr / include / c + + / 4.7 – libdir = / usr / lib – enable-nls – with-sysroot = / – enable-clocale = gnu – enable-libstdcxx-debug – enable-tiempo libstdcxx = sí – enable-gnu-unique-objeto – enable-plugin – enable-objc-gc – with-arch-32 = i586 – con ajustar = genérica – enable-checking = liberación – construir = x86_64-linux-gnu – host = x86_64-linux-gnu – target = x86_64-linux-gnu
modelo Tema: posix
gcc versión 4.7.2 (Debian 4.7.2-5)






gcc @ debian: ~ $ sudo apt-get install g+ + g+ + -4.7 bison flex texinfo m4

Además de éstos build-libs/tools mencionado en los archivos de configuración de alto nivel del CCG (que se puede construir al lado de GCC), manual de instalación de GCC también la lista de otros paquetes de software prerrequisito aquí:

http://gcc. gnu.org / install / prerequisites.html />
También tendremos que instalar esas herramientas / libs

$ sudo apt-get install gawk gzip bzip2 hacer perl tar zip unzip autoconf automake libtool gettext gperf dejagnu esperar autogen tcl guile-2.0 Diffutils parche texlive svn

de 3. Arquitectura directorio cadena de herramientas />
Aquí es el directorio usado para construir toda la cadena de herramientas:

$ tree-d cadena de herramientas /
cadena de herramientas /
├ ─ ─ brazo-luke-linux-gnueabihf
├ ─ ─ build
├ ─ ─ buildroot
├ ─ ─ src
└ ─ ─ x86_64-luke-linux -gnu

inherit;»> brazo-luke-linux-gnueabihf: La herramienta definitiva cruz cadena residirá bajo esta dir


Las anteriores 3 dirs son todos ellos considerados como «sysroot». Bajo sysroot, por lo general espera «/ usr / lib / bin / etc …». La mayor parte del software que construiremos será instalado en «sysroot / usr». libc instalará los archivos tanto en «sysroot / {bin, lib}» y «sysroot / usr / bin {, lib}».

a construir: todo edificio que pasa aquí. Para todo el software GNU, es un requisito bien y obligatorio tener directorio de construcción separada de dir src
puesta en escena:. Voy a hacer «make DESTDIR = $ {} WEB / pkgXX / «o» ​​make prefix = $ {} WEB / pkgXX «antes de que realmente los instalará en el real» prefijo «, y comprobación de validez de los archivos-ser instalados.

Para ahorrar algo de mecanografía, configuro el medio ambiente variables en bash_profile:.

BUILD = x86_64-linux-gnu
HOST = x86_64-luke-linux-gnu
target = brazo-luke-linux-gnueabihf

Toolchain = / home / gcc / cadena de herramientas
HOSTROOT = $ {cadena de herramientas} / x86_64-luke-linux-gnu
TARGETROOT = $ {cadena de herramientas} / arm-luke-linux-gnueabihf
BUILDROOT = $ {cadena de herramientas} / buildroot
WEB = $ {cadena de herramientas} / puesta en escena

PATH = $ {} TARGETROOT / usr / bin : $ {TARGETROOT} / bin: $ {HOSTROOT} / usr / bin: $ {HOSTROOT} / bin: $ {BUILDROOT} / usr / bin: $ {BUILDROOT} / bin: $ PATH
HOST exportación BUILD OBJETIVO Toolchain TARGETROOT HOSTROOT WEB BUILDROOT CAMINO

si [-f ~ / bashrc.] y, a continuación
. ~ / Bashrc;.
fi

Se recuerda que, en PATH, el orden de «{/ usr / bin, / bin}» dir es importante. El racional detrás de esto es: cada vez que se construyen nuevos programas, utilizaremos la nueva versión. TARGETROOT / HOSTROOT son nuestra instalación final, por lo que tiene mayor prioridad entonces BUILDTOOLS. BUILDTOOLS tiene prioridad para cadena de herramientas GCC existente en equipo de generación «x86_64-linux-gnu».

Ahora nuestra cadena de equipo de generación herramienta está lista. Se puede utilizar para compilar «build-tools/libs» de GCC.

Deja un comentario

Tu dirección de correo electrónico no será publicada.