Linux From Scratch para Cubietruck – C3: Aplicación Portable y GCC Build System (Autotools)

En el post anterior, hemos examinado la forma del núcleo, libc, gcc, archivo ELF, linux cargador dinámico (ld.so) trabaja en conjunto para proporcionar un entorno alojado por lo que nuestra aplicación pueda ser compilada y felizmente se ejecuta en este entorno alojado.

software GNU ha sido portado a muchos sistemas operativos como Unix, incluyendo Linux. Sí GCC podría funcionar bajo muchas plataformas. Con la ayuda de GCC, podemos escribir c / c + + programa y utilizar GCC para cruzar compilarlo para multiplataformas. / Programas portables C C + + no se logran fácilmente, al igual que su homólogo de java / python / .NET. GCC cadena de herramientas tiene un sistema de construcción denominado «autotools», que se refieren específicamente a los temas de la programación de aplicaciones portátiles para diferentes sistemas Unix. Sí GCC se construye utilizando este sistema de construcción.

Escribir portátil c / c + + / código de proyecto se hace bastante esfuerzo, y su complejidad se basa en cómo «portátil» que será el programa. Los materiales más relevantes para este tema es este libro «, escriben los códigos portátiles»:

http://www.nostarch.com/wpc.htm

Necesitamos una cadena de herramientas GCC compilación cruzada para nuestro medio ambiente Cubietruck ARM. Este es un escenario típico para el desarrollo de aplicaciones portátiles, tanto para GCC y de la aplicación que vamos a instalar en Cubietruck, como núcleo, init, rootfs, etc Es realmente necesario para entender cómo GCC soporte multiplataforma desarrollo a través de autotools antes de compilación cruzada propio GCC. />
1. El sabor de desarrollo de código portátil en el Sistema de construcción GCC

GCC es intrínsecamente un «compilador cruzado», incluso cuando usted lo está utilizando como un compilador nativo. Voy a demostrar los conceptos de desarrollo de plataforma cruzada utilizando nuestro sencillo «hello.c» de nuevo en el entorno de compilación de GCC. Supongamos que yo volvería a hacer portátil «hello.c» a través de diferentes plataformas de tipo Unix, esto es lo que voy a hacer en el entorno de compilación gcc:

a. Primero lo primero, hello.c sólo usan «printf» se define en «stdio.h». Esta es la función definida en C estándar. Se debe trabajar a través de la plataforma compatible con POSIX;
b. Para construir mi hello.c para diferentes plataformas, necesito cadenas de herramientas GCC correspondientes, cada uno dirigido a la generación de códigos para diferentes plataformas;
c. Voy a organizar mi proyecto usando GCC Autotools (autoconf, automake), por lo que los archivos de compilación cruzada se generará automáticamente para mí a través de script «configure». . Esto me ahorrará un montón de problemas

Autotools es un gran tema, refiérase por favor debajo enlace para obtener más información:
http://en.wikipedia.org/wiki/GNU_build_system
http://www.amazon.com/Autotools-Practioners-Autoconf-Automake-Libtool/dp/1593272065
http://www.apress.com/9781590591093

$ ls
configure.ac hola.c Makefile.am

hola.c $ cat
# include
int main (int argc, char * argv [])
{

printf (» hola mundo n «);

return 0;

$ cat configure.ac

AC_PREREQ ([2.69])
AC_INIT ([Hola], [1,0], [[email protected]])
AC_CONFIG_SRCDIR ([hola.c])
AM_INIT_AUTOMAKE

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

# Los cheques para las bibliotecas.
# Comprueba si los archivos de cabecera
AC_CHECK_HEADERS ([stdio.h])
# Comprueba si typedefs, estructuras y características del compilador
# Comprueba si las funciones de biblioteca

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

$ cat Makefile.am
bin_PROGRAMS = hola
hello_SOURCES = hola.c


$ aclocal
$ automake-a
configure.ac: 10: instalación ‘/ compile.’
configure.ac: 7: instalar ‘. / install-sh’
configure.ac: 7: instalar ‘. / perdido»
Makefile.am: instalar ‘/ INSTALAR.’
Makefile.am: error: archivo requerido ‘/ NEWS.’ no encontrado
Makefile.am: error: archivo requerido ‘/ README.’ no encontrado
Makefile.am: error: archivo requerido ‘. / autores no encontraron
Makefile.am: error: archivo requerido ‘. / ChangeLog’ no encontrado
Makefile.am: instalar ‘/ COPIA.’ usando el archivo de licencia v3 Pública General GNU
Makefile.am: Considere agregar el archivo COPYING para el sistema de control de versiones
Makefile.am: su código, para evitar preguntas sobre qué licencia el proyecto utiliza
Makefile.am: instalar ‘/ depcomp.’
AUTORES $ touch NOTICIAS README ChangeLog
$ automake
$ autoconf
$ ls
aclocal.m4 autom4te.cache compilación configure.ac depcomp INSTALAR Makefile.am falta README
AUTORES ChangeLog configure COPIA hola.c install-sh Makefile.in NOTICIAS

ahora el «configure» y «Makefile.in» han sido generados por autotools. Podemos utilizar «configure» para generar scripts de compilación multiplataforma. En mi máquina de trabajo, tengo dos herramientas principales GCC. Uno de ellos es el nativo proporcionado por Debian-7, la versión es 4.7, y el otro es una cadena de herramientas del brazo Linaro con la versión 4.8.1. Tengo que poner a todos en mi variable de entorno «Path» por lo que «configurar» puede encontrarlos />

$ / home/luke/gcc-linaro-arm-linux-gnueabihf-4.8-2013.11_linux/bin/arm-linux-gnueabihf-gcc-v
Utilizando las especificaciones incorporadas.
COLLECT_GCC=/home/luke/gcc-linaro-arm-linux-gnueabihf-4.8-2013.11_linux/bin/arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/luke/gcc-linaro-arm-linux-gnueabihf-4.8-2013.11_linux/bin/../libexec/gcc/arm-linux-gnueabihf/4.8.3/lto-wrapper
Objetivo: arm-linux-gnueabihf
Configurado con: /cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/src/gcc-linaro-4.8-2013.11/configure – Build = i686-build_pc-linux-gnu – host = i686-build_pc-linux-gnu – target = arm-linux-gnueabihf – prefix = / cbuild / esclavos / oorts / crosstool -ng/builds/arm-linux-gnueabihf-linux/install –with-sysroot=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/install/arm-linux-gnueabihf/libc – Enable-languages ​​= c, c + +, Fortran – enable-multilib – = ARMv7-a con-arch – with-tune = Cortex-A9 – with-fpu = vfpv3-d16 – = duros con-float – with-pkgversion = ‘crosstool-NG Linaro-1.13.1-4,8-2.013,11 – Linaro del CCG 2.013,10’ – with-bugurl = https://bugs.launchpad.net/gcc-linaro – enable-__cxa_atexit – enable-libmudflap – enable-libgomp – enable-libssp –with-gmp=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static –with-mpfr=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static –with-mpc=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static –with-isl=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static –with-cloog=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static –with-libelf=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static – enable-threads = posix – disable-libstdcxx-pch – enable-enlazador-build-id – enable-oro –with-local-prefix=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/install/arm-linux-gnueabihf/libc – Enable-c99 – enable-largo-largo – with-mode = pulgar – with-float = duro
modelo de la rosca: posix
versión gcc 4.8.3 20131111 (preliminar) (crosstool-NG Linaro-1.13.1-4,8-2.013,11 – Linaro del CCG 2.013,10)

$ / usr / bin / gcc -v
Utilizando las especificaciones incorporadas.
COLLECT_GCC = / usr / bin / gcc
COLLECT_LTO_WRAPPER = / usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
<= "font-family: Courier New, Courier, espacio sencillo; font-size: x-small;"> 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 sufijo = -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 – with-tune = genérica – enable-checking = liberación – build = x86_64-linux -gnu – host = x86_64-linux-gnu – target = x86_64-linux-gnu
modelo de la rosca: posix
gcc Versión 4.7.2 (Debian 4.7.2-5)


$ / configure – host = x86_64-linux-gnu

la comprobación de una impresora compatible con BSD instalar … / Usr / bin / install-c

Courier New, Courier, monospace; font-size: x-small;»> comprobación de x86_64-linux-gnu-tira … no

Courier New, Courier, monospace; font-size: x-small;»> comprobación de un mkdir-p-thread-safe … / Bin / mkdir-p

Courier New, Courier, monospace; font-size: x-small;»> comprobar si hacen juegos $ (MAKE) … sí

Courier New, Courier, monospace; font-size: x-small;»> comprobación de x86_64-linux-gnu-gcc … x86_64-linux-gnu-gcc

Courier New, Courier, monospace; font-size: x-small;»> comprobación de nombre de archivo de salida predeterminado compilador de C … a.out

Courier New, Courier, monospace; font-size: x-small;»> comprobando si estamos realizando compilación cruzada … no

Courier New, Courier, monospace; font-size: x-small;»> comprobar si estamos usando el compilador GNU C … sí

Courier New, Courier, monospace; font-size: x-small;»> comprobación de x86_64-linux -gnu-gcc opción de aceptar ISO C89 … No es necesaria

Courier New, Courier, monospace; font-size: x-small;»> comprobación de estilo de incluir utilizado por marca … GNU

Courier New, Courier, monospace; font-size: x-small;»> comprobar cómo ejecutar el preprocesador de C … x86_64-linux-gnu-gcc-E

Courier New, Courier, monospace; font-size: x-small;»> comprobación de egrep … / Bin / grep-E

Courier New, Courier, monospace; font-size: x-small;»> comprobación de sys / types.h … sí

Courier New, Courier, monospace; font-size: x-small;»> comprobación de stdlib.h … sí

Courier New, Courier, monospace; font-size: x-small;»> comprobación de memory.h … sí

Courier New, Courier, monospace; font-size: x-small;»> comprobación de inttypes.h … sí

Courier New, Courier, monospace; font-size: x-small;»> comprobación de unistd.h … sí

Courier New, Courier, monospace; font-size: x-small;»> comprobar la presencia stdio.h … sí

Courier New, Courier, monospace; font-size: x-small;»> comprobación que genera archivos son más recientes que configure … done

Courier New, Courier, monospace; font-size: x-small;»> config.status: la creación de Makefile

config.status: ejecutar depfiles comandos
luke luke @ debian: ~ / hola $ make
x86_64-linux-gnu-gcc -DPACKAGE_NAME = » hola «-DPACKAGE_TARNAME = » hola «-DPACKAGE_VERSION = «1.0 «-DPACKAGE_STRING = «Hola 1.0 «-DPACKAGE_BUGREPORT = «[email protected] «-DPACKAGE_URL = «»-DPACKAGE = «hola «-DVERSION = «1.0 «-DSTDC_HEADERS = 1-DHAVE_SYS_TYPES_H = 1-DHAVE_SYS_STAT_H = 1-DHAVE_STDLIB_H = 1-DHAVE_STRING_H = 1-DHAVE_MEMORY_H = 1-DHAVE_STRINGS_H = 1-DHAVE_INTTYPES_H = 1-DHAVE_STDINT_H = 1-DHAVE_UNISTD_H = 1-DHAVE_STDIO_H = 1-I. -G-O2-MT hello.o-MD-MP-MF .deps / hello.Tpo -c-o hello.o hola.c
mv-f .deps / hello.Tpo .deps / hello.Po

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

Courier New, Courier, monospace; font-size: x-small;»> $ . / hola

hola mundo

Cuando especificamos «- host = x86_64-linux-gnu» a la escritura «configure», que tratará de buscar en el PATH para controlador gcc llamado «$ {HOST}-gcc». En este caso, se está buscando «x86_64-linux-gnu-gcc». «Configurar» verificar este gcc funciona la cadena de herramientas y luego generar corresponde crear el archivo de la base de esta cadena de herramientas. Cuando ejecutamos «make», la cadena de herramientas a la derecha se llama para generar binarios para nuestro requerida «host», como se puede ver en la salida

A continuación vamos a generar ejecutables ARM como se muestra a continuación:.


$ make clean
test-z» hola «| | rm-f hola
. rm-f * o
$ . / configure – acogida = arm-linux-gnueabihf
comprobación de compatibilidad BSD-a instalar … / Usr / bin / install-c
comprobar si entorno de compilación es sana .. . sí
comprobación de brazo-linux-gnueabihf tira … arm-linux-gnueabihf-strip
la comprobación de un hilo- seguro mkdir-p … / Bin / mkdir-p
comprobación de gawk … gawk
comprobar si hacen juegos $ (MAKE) … sí
comprobar si make admite variables anidadas … sí
comprobación de brazo-linux-gcc-gnueabihf … arm-linux-gcc-gnueabihf
comprobar si el compilador de C funciona … sí
comprobación de nombre de archivo de salida predeterminado compilador de C … a.out
comprobación de sufijo de ejecutables …
comprobando si estamos realizando compilación cruzada … sí
comprobación de sufijo de los archivos objeto … o
comprobar si estamos usando el compilador GNU C … sí
comprobar si el brazo-linux-gcc-gnueabihf acepta-g … Sí
comprobación de brazo-linux-gnueabihf- opción de gcc para aceptar ISO C89 … No es necesaria
comprobar si el brazo-linux-gnueabihf -gcc entiende-c y-o juntos … Sí
comprobación de estilo de incluir utilizada por marca … GNU
comprobar estilo dependencia del brazo-linux-gcc-gnueabihf … gcc3
comprobar cómo ejecutar el preprocesador de C … arm-linux-gnueabihf-gcc-E
comprobación de grep que se encarga de las largas colas y-e … / Bin / grep
comprobación de egrep … / Bin / grep-E
la comprobación de los archivos de cabecera de C de ANSI … sí
comprobación de sys / types.h … sí
comprobación de sys / stat.h … sí
comprobación de stdlib.h … sí
comprobación de string.h … sí
comprobación de memory.h … sí
comprobación de strings.h … sí
comprobación de inttypes.h … sí
comprobación de stdint.h … sí
comprobación de unistd.h … sí
comprobar la usabilidad stdio.h … sí
comprobar la presencia stdio.h … sí
comprobación de stdio.h … sí
comprobación que genera archivos son más recientes que configure … done
configure:. crear / config.status
config.status: la creación de Makefile
config.status: comandos ejecutar depfiles
$ make
brazo- linux-gnueabihf-gcc -DPACKAGE_NAME = «hola «-DPACKAGE_TARNAME = «hola «-DPACKAGE_VERSION = «1.0 «-DPACKAGE_STRING = «Hola 1.0 «-DPACKAGE_BUGREPORT = «luke @ luke.org «-DPACKAGE_URL = » «-DPACKAGE = » hola «-DVERSION = » 1.0 «-DSTDC_HEADERS = 1-DHAVE_SYS_TYPES_H = 1-DHAVE_SYS_STAT_H = 1-DHAVE_STDLIB_H = 1-DHAVE_STRING_H = 1-DHAVE_MEMORY_H = 1-DHAVE_STRINGS_H = 1-DHAVE_INTTYPES_H = 1-DHAVE_STDINT_H = 1-DHAVE_UNISTD_H = 1-DHAVE_STDIO_H = 1-I. -G-O2-MT hello.o-MD-MP-MF .deps / hello.Tpo -c-o hello.o hola.c
mv-f .deps / hello.Tpo .deps / hello.Po
arm-linux-gnueabihf-gcc-g-O2-o hola hello.o
$ file hola
hola: ELF 32-bits LSB ejecutable, ARM , versión 1 (SYSV), vinculada dinámicamente (usa librerias compartidas), para GNU / Linux 3.1.1, BUILDID [SHA1] = 0x759ac38b3bed8ea02fb13f347e3c9764d19538f7, no despojado

Esta vez «configurar» se comprobar «arm-linux-gnueabihf-*» cadena de herramientas GCC, y generar correspondiente crea el archivo. Después de «hacer», podemos ver un «ARM» ejecutable «hola» en realidad está construido. Dado que no tenemos un «ARM» entorno alojado, sin embargo, no podemos ejecutar esta versión «ARM» «hola» en estos momentos.

Es bastante sencillo de cruzar compilar nuestra ingenua » cruz-plataforma portátil «proyecto hola en entorno de compilación GCC. En el entorno Autotools, el flujo de trabajo básico es:

[config.ac] —> Especifica requisito característica de alto nivel para entorno de compilación / host para su programa. El script «configure» generada le ayudará a verificar estos requisitos se cumple antes de compilar. Si no es así, sino que terminará con error;
[Makefile.am] —> especifica la arquitectura de su proyecto

; [

GCC es mucho, mucho más compleja que la nuestra «hello.c». Antes de que podamos construir con éxito cruzado GCC, tenemos que tener un conocimiento básico del compilador cruzado.

2. Compilación de un compilador: Pollo y Huevo Historia />


Por suerte, GCC aún no es tan inteligente. Ahora perfectamente puede replicarse a sí mismo, pero no es una versión de la energía más sabio o más. GCC es propio escrito en código C / C + + código fuente.

Deja un comentario

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