[Clfs-support] Binutils for ARM devices

Michele Bucca michele.bucca at gmail.com
Mon Nov 27 03:15:08 PST 2017


2017-11-27 11:20 GMT+01:00 Angel Ivan Castell Rovira <al004140 at gmail.com>:

> I attach documentation in spanish you can follow step by step to generate
> your own toolchain. Hope It helps!
>
> === 1. Preparar el entorno ===
>
> Configura estas variables de entorno, esenciales para guiar todo el
> proceso.
>
>     export ROOTDIR="${HOME}/custom-toolchains/ARM"
>     export NATIVE_PREFIX="${ROOTDIR}/opt/native"
>     export CROSS_PREFIX="${ROOTDIR}/opt/cross"
>     export ABI=eabi         ## Variable especifica para las CPU basadas en
> ARM, opciones: oabi, eabi
>     export LINUX_ARCH=arm
>     export CPU=arm
>     export ARCH=armv5
>     export CLIB=musl${ABI}
>     export TARGET_TRIPLET=${CPU}-linux-${CLIB}
>
> Los parámetros mas importanes los puedes encontrar aqui:
>
>     https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html#ARM-Options
>
> === 2. Descargar los fuentes ===
>
> Crear este directorio:
>
>     mkdir -p ${ROOTDIR}/src
>     cd ${ROOTDIR}/src
>
> Descargar todos estos fuentes:
>
>     wget http://ftpmirror.gnu.org/binutils/binutils-2.27.tar.bz2
>     wget http://ftpmirror.gnu.org/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2
>     wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.12.6.tar.bz2
>     wget https://www.musl-libc.org/releases/musl-1.1.16.tar.gz
>     wget http://ftpmirror.gnu.org/mpfr/mpfr-3.1.5.tar.bz2
>     wget http://ftpmirror.gnu.org/gmp/gmp-6.1.2.tar.bz2
>     wget http://ftpmirror.gnu.org/mpc/mpc-1.0.2.tar.gz
>
> Y descomprimelos:
>
>     tar xvfj binutils-2.27.tar.bz2
>     tar xvfj gcc-6.3.0.tar.bz2
>     tar xvfz mpc-1.0.3.tar.gz
>     tar xvfj mpfr-3.1.5.tar.bz2
>     tar xvfj gmp-6.1.2.tar.bz2
>     tar xvfz musl-1.1.16.tar.gz
>     tar xvfj linux-3.12.6.tar.bz2
>
> === 3. Compilar binutils nativo ===
>
> Tu PC host ya tiene instaladas unas binutils, por lo que con toda seguridad
> puedes saltarte este paso. De todos modos, no hace ningún daño empezar el
> proceso con las binutils mas modernas.
>
>     cd ${ROOTDIR}/src
>     mkdir build-binutils
>     cd build-binutils
>     ../binutils-2.27/configure --prefix="${NATIVE_PREFIX}" --disable-nls
> --disable-werror --disable-multilib
>     make
>     make install-strip
>
> === 4. Compilar el gcc nativo con sus dependencias ===
>
> Las versiones del gcc se identifican por tres números: MAJOR.MINOR.RELEASE.
> Estos tres números te ayudarán a conocer si necesitas hacer este paso o no:
>
>     * Si el MAJOR.MINOR del compilador instalado en tu PC host coincide
> con el
>       del cross-compilador que quieres generar (por ejemplo, si tu PC host
>       tiene un gcc-6.2.0 y quieres generar un cross-compiler para el
> 6.2.3),
>       salta al siguiente paso del proceso, el proceso finalizará bien.
>
>     * Si el MAJOR del compilador instalado en tu PC host coincide con el
> del
>       cross-compilador que quieres generar (por ejemplo, si tu PC host
> tiene
>       un gcc-6.0.0 y quieres generar un cross-compiler para el gcc-6.3.0),
> lo
>       recomendable es que realices este paso antes de saltar al siguiente,
>       aunque no es obligatorio.
>
>     * Si el MAYOR del compilador instalado en tu PC host difiere del
>       cross-compiler que quieres generar (), este paso es obligatorio.
>
> Si has decidido que debes realizar este paso, ejecuta los siguientes
> comandos:
>
>     cd ${ROOTDIR}/src/gcc-6.3.0
>     ln -s ../mpfr-3.1.5 mpfr
>     ln -s ../gmp-6.1.2 gmp
>     ln -s ../mpc-1.0.3 mpc
>     cd ..
>     mkdir build-gcc
>     cd build-gcc
>     ../gcc-6.3.0/configure --prefix=${NATIVE_PREFIX} --disable-nls
> --enable-languages=c --disable-multilib
>     make
>     make install-strip
>
> Ten mucha paciencia porque es un proceso MUY costoso computacionalmente
> (varias
> horas en mi PC). Una vez finalizado el proceso, ajusta la variable PATH
> para
> usar el nuevo compilador nativo:
>
>     export PATH="${NATIVE_PREFIX}/bin:${PATH}"
>
> Confirma que estas usando el compilador recién compilado:
>
>     gcc --version
>      gcc (GCC) 6.3.0
>      Copyright (C) 2016 Free Software Foundation, Inc.
>      This is free software; see the source for copying conditions. There
> is NO
>      warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
> PURPOSE.
>
> === 5. Compilar las cross-binutils ===
>
> Ahora configura binutils y lanza su compilación:
>
>     cd ${ROOTDIR}/src
>     mkdir build-${CPU}-binutils
>     cd build-${CPU}-binutils
>     ../binutils-2.27/configure --target=${TARGET_TRIPLET}
> --prefix=${CROSS_PREFIX} --with-sysroot --disable-nls --disable-werror
> --disable-multilib
>     make
>     make install-strip
>
> La magia se produce al especificar el flag --target="arm-linux-musl" en el
> script de configure, que detecta que la máquina host no es un MIPS, y como
> resultado configurará la compilación para generar un cross-assembler, un
> cross-linker, y el resto de cross-tools para la plataforma MIPS.
>
> === 6. Instalar los headers del kernel ===
>
> Instala los headers del kernel:
>
>     cd ${ROOTDIR}/src
>     cd linux-3.12.6
>     make ARCH=${LINUX_ARCH} INSTALL_HDR_PATH=${CROSS_PREFIX}/${TARGET_TRIPLET}
> headers_install
>
> === 7. Compilar el cross-compiler (fase 1) ===
>
> Se genera un bootstrap cross-compiler sin C library, que solo soporta
> linkado
> estático. Empezamos ajustando la variable de entorno PATH para poder usar
> las
> cross-binutils compiladas en el paso anterior:
>
>     export PATH="${CROSS_PREFIX}/bin/:$PATH"
>
> Compila el cross-compiler 6.3.0 usando el cross-assembler recién generado:
>
>     cd ${ROOTDIR}/src
>     mkdir build-bootstrap-${CPU}-gcc
>     cd build-bootstrap-${CPU}-gcc
>     ../gcc-6.3.0/configure --target=${TARGET_TRIPLET}
> --prefix=${CROSS_PREFIX} --disable-nls --enable-languages=c
> --disable-multilib --disable-threads --disable-shared --with-float=soft
> --with-arch=${ARCH}
>     make all-gcc install-gcc
>     make all-target-libgcc install-target-libgcc
>
> Puesto que hemos especificado --target=arm-linux-musl, el script configure
> busca el cross-assembler que hemos compilado en el paso anterior.
>
> Ahora prueba a ejecutar este comando:
>
>     ${TARGET_TRIPLET}-gcc --version
>
> Este cross-compiler no es capaz de compilar programas en C del user-space,
> ya
> que todavía no dispone de ninguna C library para el sistema target. Sin
> embargo, si posee la funcionalidad básica necesaria para poder compilar la
> C
> library para el target.
>
> === 8. Compilar la librería de C ===
>
> Utilizamos el cross-compiler generado en el paso anterior (fase 1) para
> compilar la C library.
>
>     cd ${ROOTDIR}/src
>     mkdir build-${CLIB}
>     cd build-${CLIB}
>     CC=${TARGET_TRIPLET}-gcc CFLAGS=-Wa,-msoft-float
> ../musl-1.1.16/configure --prefix=${CROSS_PREFIX}/${TARGET_TRIPLET}/
> --enable-optimize CROSS_COMPILE=${TARGET_TRIPLET}-
>     make
>     make install
>
> === 9. Compilar el cross-compiler final (fase 2) ===
>
> Se genera el cross-compiler final, también conocido como fase 2, con su
> propia
> C library (compilada en el paso anterior) y soporte para linkado dinámico.
>
>     cd ${ROOTDIR}/src
>     mkdir build-${CPU}-gcc
>     cd build-${CPU}-gcc
>     ../gcc-6.3.0/configure --target=${TARGET_TRIPLET}
> --prefix=${CROSS_PREFIX} --disable-nls --enable-languages=c,c++
> --disable-multilib --enable-threads --enable-shared --with-float=soft
> --with-arch=${ARCH} --enable-target-optspace --disable-libgomp
> --disable-libmudflap --without-isl --without-cloog --disable-decimal-float
> --disable-libssp --disable-libsanitizer --enable-lto
> --with-host-libstdcxx=-lstdc++
>     make
>     make install-strip
>
>
>
Sorry but I already have a musl cross-compiler. Now I want to use that
cross compiler to make a musl toolchain that runs on the ARM target.
However when I try to cross-compile I get that nasty error about libiberty
(See Below) Can I avoid building libiberty alltoghether?


>
> El 26/11/2017 20:08, <michele.bucca at gmail.com> escribió:
>
>
>
>
> Hey There
>
> I'm trying to install binutils to my embedded linux from scratch for armel
> processors (ARMv5 with soft floating point).
>
> these are the configure parameters I'm giving
>
> ../binutils-2.27/configure --host=arm-linux-musleabi
> --target=arm-linux-musleabi --build=x86_64-linux-gnu --disable-nls
> --disable-multilib --prefix=/home/michele/toolchain-arm
>
> However during the build I get this error regarding libiberty:
>
> make[1]: ingresso nella directory "/home/michele/sources/build-binutils"
> make[2]: ingresso nella directory "/home/michele/sources/build-b
> inutils/libiberty"
> if [ x"" != x ]; then \
>   arm-linux-musleabi-gcc -c -DHAVE_CONFIG_H -g -O2  -I.
> -I../../binutils-2.27/libiberty/../include  -W -Wall -Wwrite-strings
> -Wc++-compat -Wstrict-prototypes -pedantic  -D_GNU_SOURCE
> ../../binutils-2.27/libiberty/strsignal.c -o pic/strsignal.o; \
> else true; fi
> if [ x"" != x ]; then \
>   arm-linux-musleabi-gcc -c -DHAVE_CONFIG_H -g -O2  -I.
> -I../../binutils-2.27/libiberty/../include  -W -Wall -Wwrite-strings
> -Wc++-compat -Wstrict-prototypes -pedantic  -D_GNU_SOURCE
> ../../binutils-2.27/libiberty/strsignal.c -o noasan/strsignal.o; \
> else true; fi
> arm-linux-musleabi-gcc -c -DHAVE_CONFIG_H -g -O2  -I.
> -I../../binutils-2.27/libiberty/../include  -W -Wall -Wwrite-strings
> -Wc++-compat -Wstrict-prototypes -pedantic  -D_GNU_SOURCE
> ../../binutils-2.27/libiberty/strsignal.c -o strsignal.o
> ../../binutils-2.27/libiberty/strsignal.c:554:1: error: conflicting types
> for 'psignal'
>  psignal (int signo, char *message)
>  ^~~~~~~
> In file included from ../../binutils-2.27/libiberty/strsignal.c:22:0:
> /opt/cross/arm-linux-musleabi/include/signal.h:219:6: note: previous
> declaration of 'psignal' was here
>  void psignal(int, const char *);
>       ^~~~~~~
> Makefile:1443: set di istruzioni per l'obiettivo "strsignal.o" non riuscito
> make[2]: *** [strsignal.o] Errore 1
> make[2]: uscita dalla directory "/home/michele/sources/build-b
> inutils/libiberty"
> Makefile:8049: set di istruzioni per l'obiettivo "all-libiberty" non
> riuscito
> make[1]: *** [all-libiberty] Errore 2
> make[1]: uscita dalla directory "/home/michele/sources/build-binutils"
> Makefile:850: set di istruzioni per l'obiettivo "all" non riuscito
> make: *** [all] Errore 2
>
> How do I fix this problem? Can this problem be circumvented in some way?
> --
> Inviato dal mio dispositivo Android con K-9 Mail. Perdonate la brevità.
> _______________________________________________
> Clfs-support mailing list
> Clfs-support at lists.clfs.org
> http://lists.clfs.org/listinfo.cgi/clfs-support-clfs.org
>
>
>
> _______________________________________________
> Clfs-support mailing list
> Clfs-support at lists.clfs.org
> http://lists.clfs.org/listinfo.cgi/clfs-support-clfs.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.clfs.org/pipermail/clfs-support-clfs.org/attachments/20171127/6ad2a5b1/attachment.htm>


More information about the Clfs-support mailing list