[Clfs-support] Binutils for ARM devices

Angel Ivan Castell Rovira al004140 at gmail.com
Mon Nov 27 02:20:47 PST 2017


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




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-
binutils/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-
binutils/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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.clfs.org/pipermail/clfs-support-clfs.org/attachments/20171127/f4d139e3/attachment.htm>


More information about the Clfs-support mailing list