| #! /bin/bash | |
| set -e | |
| trap 'previous_command=$this_command; this_command=$BASH_COMMAND' DEBUG | |
| trap 'echo FAILED COMMAND: $previous_command' EXIT | |
| #------------------------------------------------------------------------------------------- | |
| # This script will download packages for, configure, build and install a GCC cross-compiler. | |
| # Customize the variables (INSTALL_PATH, TARGET, etc.) to your liking before running. | |
| # If you get an error and need to resume the script from some point in the middle, | |
| # just delete/comment the preceding lines before running it again. | |
| # | |
| # See: http://preshing.com/20141119/how-to-build-a-gcc-cross-compiler | |
| #------------------------------------------------------------------------------------------- | |
| INSTALL_PATH=/opt/cross | |
| TARGET=aarch64-linux | |
| USE_NEWLIB=0 | |
| LINUX_ARCH=arm64 | |
| CONFIGURATION_OPTIONS="--disable-multilib" # --disable-threads --disable-shared | |
| PARALLEL_MAKE=-j4 | |
| BINUTILS_VERSION=binutils-2.24 | |
| GCC_VERSION=gcc-4.9.2 | |
| LINUX_KERNEL_VERSION=linux-3.17.2 | |
| GLIBC_VERSION=glibc-2.20 | |
| MPFR_VERSION=mpfr-3.1.2 | |
| GMP_VERSION=gmp-6.0.0a | |
| MPC_VERSION=mpc-1.0.2 | |
| ISL_VERSION=isl-0.12.2 | |
| CLOOG_VERSION=cloog-0.18.1 | |
| export PATH=$INSTALL_PATH/bin:$PATH | |
| # Download packages | |
| export http_proxy=$HTTP_PROXY https_proxy=$HTTP_PROXY ftp_proxy=$HTTP_PROXY | |
| wget -nc https://ftp.gnu.org/gnu/binutils/$BINUTILS_VERSION.tar.gz | |
| wget -nc https://ftp.gnu.org/gnu/gcc/$GCC_VERSION/$GCC_VERSION.tar.gz | |
| if [ $USE_NEWLIB -ne 0 ]; then | |
| wget -nc -O newlib-master.zip https://github.com/bminor/newlib/archive/master.zip || true | |
| unzip -qo newlib-master.zip | |
| else | |
| wget -nc https://www.kernel.org/pub/linux/kernel/v3.x/$LINUX_KERNEL_VERSION.tar.xz | |
| wget -nc https://ftp.gnu.org/gnu/glibc/$GLIBC_VERSION.tar.xz | |
| fi | |
| wget -nc https://ftp.gnu.org/gnu/mpfr/$MPFR_VERSION.tar.xz | |
| wget -nc https://ftp.gnu.org/gnu/gmp/$GMP_VERSION.tar.xz | |
| wget -nc https://ftp.gnu.org/gnu/mpc/$MPC_VERSION.tar.gz | |
| wget -nc ftp://gcc.gnu.org/pub/gcc/infrastructure/$ISL_VERSION.tar.bz2 | |
| wget -nc ftp://gcc.gnu.org/pub/gcc/infrastructure/$CLOOG_VERSION.tar.gz | |
| # Extract everything | |
| for f in *.tar*; do tar xfk $f; done | |
| # Make symbolic links | |
| cd $GCC_VERSION | |
| ln -sf `ls -1d ../mpfr-*/` mpfr | |
| ln -sf `ls -1d ../gmp-*/` gmp | |
| ln -sf `ls -1d ../mpc-*/` mpc | |
| ln -sf `ls -1d ../isl-*/` isl | |
| ln -sf `ls -1d ../cloog-*/` cloog | |
| cd .. | |
| # Step 1. Binutils | |
| mkdir -p build-binutils | |
| cd build-binutils | |
| ../$BINUTILS_VERSION/configure --prefix=$INSTALL_PATH --target=$TARGET $CONFIGURATION_OPTIONS | |
| make $PARALLEL_MAKE | |
| make install | |
| cd .. | |
| # Step 2. Linux Kernel Headers | |
| if [ $USE_NEWLIB -eq 0 ]; then | |
| cd $LINUX_KERNEL_VERSION | |
| make ARCH=$LINUX_ARCH INSTALL_HDR_PATH=$INSTALL_PATH/$TARGET headers_install | |
| cd .. | |
| fi | |
| # Step 3. C/C++ Compilers | |
| mkdir -p build-gcc | |
| cd build-gcc | |
| if [ $USE_NEWLIB -ne 0 ]; then | |
| NEWLIB_OPTION=--with-newlib | |
| fi | |
| ../$GCC_VERSION/configure --prefix=$INSTALL_PATH --target=$TARGET --enable-languages=c,c++ $CONFIGURATION_OPTIONS $NEWLIB_OPTION | |
| make $PARALLEL_MAKE all-gcc | |
| make install-gcc | |
| cd .. | |
| if [ $USE_NEWLIB -ne 0 ]; then | |
| # Steps 4-6: Newlib | |
| mkdir -p build-newlib | |
| cd build-newlib | |
| ../newlib-master/configure --prefix=$INSTALL_PATH --target=$TARGET $CONFIGURATION_OPTIONS | |
| make $PARALLEL_MAKE | |
| make install | |
| cd .. | |
| else | |
| # Step 4. Standard C Library Headers and Startup Files | |
| mkdir -p build-glibc | |
| cd build-glibc | |
| ../$GLIBC_VERSION/configure --prefix=$INSTALL_PATH/$TARGET --build=$MACHTYPE --host=$TARGET --target=$TARGET --with-headers=$INSTALL_PATH/$TARGET/include $CONFIGURATION_OPTIONS libc_cv_forced_unwind=yes | |
| make install-bootstrap-headers=yes install-headers | |
| make $PARALLEL_MAKE csu/subdir_lib | |
| install csu/crt1.o csu/crti.o csu/crtn.o $INSTALL_PATH/$TARGET/lib | |
| $TARGET-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $INSTALL_PATH/$TARGET/lib/libc.so | |
| touch $INSTALL_PATH/$TARGET/include/gnu/stubs.h | |
| cd .. | |
| # Step 5. Compiler Support Library | |
| cd build-gcc | |
| make $PARALLEL_MAKE all-target-libgcc | |
| make install-target-libgcc | |
| cd .. | |
| # Step 6. Standard C Library & the rest of Glibc | |
| cd build-glibc | |
| make $PARALLEL_MAKE | |
| make install | |
| cd .. | |
| fi | |
| # Step 7. Standard C++ Library & the rest of GCC | |
| cd build-gcc | |
| make $PARALLEL_MAKE all | |
| make install | |
| cd .. | |
| trap - EXIT | |
| echo 'Success!' |
Good.
thanks
thanks!
Thank you!!!
How to build the cross compiler for x86_64?
I changed TARGET to "x86_64-linux-gnu", and LINUX_ARCH to "x86_64" in the script, but I got the follow error at the stage building glibc:
x86_64-linux-gnu-gcc -D_RPC_THREAD_SAFE_ -D_GNU_SOURCE -DIS_IN_build -include /net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/build-glibc/c\
onfig.h rpc_main.c \
-o /net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/build-glibc/sunrpc/cross-rpc_main.o -MMD -MP -MF /net/ala-rsubbian-lx1/ala\
-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/build-glibc/sunrpc/cross-rpc_main.o.dt -MT /net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/build\
-glibc/sunrpc/cross-rpc_main.o -c
In file included from /net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/opt/cross/x86_64-linux-gnu/include/errno.h:28:0,
from rpc_main.c:37:
/net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/opt/cross/x86_64-linux-gnu/include/features.h:389:23: fatal error: gnu/stubs.h: No such file \
or directory
#include
^
compilation terminated.
make[2]: *** [/net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/build-glibc/sunrpc/cross-rpc_main.o] Error 1
make[2]: Leaving directory /net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/glibc-2.20/sunrpc'/net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/glibc-2.20'
make[1]: *** [sunrpc/install-headers] Error 2
make[1]: Leaving directory
make: *** [install-headers] Error 2
Is there a version to build gcc 5.3.x?
used this guide to compile GCC 6.1 with latest GLibc and 4.6 Kernel , thank you for your efforts
@Vladinator You should be able to build 5.3.x with this. If not, I've created a similar script with slightly higher levels of abstraction which definitely builds GCC 4.9.x, 5.3.x and 6.1: https://github.com/pwaring/gcc-cross-compiler
Anyone get this to build fine on amd64? @pwaring, I don't see support for amd64 in that, is it possible?
My current version of this script with some improvements:
https://github.com/ProfessorKaos64/LibreGeek-Packaging/blob/brewmaster/gcc/build-cross-gcc.sh
@BaoshanPang - my version of this script above seems to work until a point:
a - /home/desktop/build-cross-gcc/build-glibc/string/rtld-cacheinfo.os
a - /home/desktop/build-cross-gcc/build-glibc/time/rtld-setitimer.os
mv -f /home/desktop/build-cross-gcc/build-glibc/elf/rtld-libc.aT /home/desktop/build-cross-gcc/build-glibc/elf/rtld-libc.a
make[3]: Leaving directory '/home/desktop/build-cross-gcc/glibc-2.23/elf'
make[2]: Leaving directory '/home/desktop/build-cross-gcc/glibc-2.23/elf'
Makefile:214: recipe for target 'elf/subdir_lib' failed
make[1]: *** [elf/subdir_lib] Error 2
make[1]: Leaving directory '/home/desktop/build-cross-gcc/glibc-2.23'
Makefile:9: recipe for target 'all' failed
make: *** [all] Error 2
FAILED COMMAND: sudo make $PARALLEL_MAKE
Love U !!