Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
A shell script to download packages for, configure, build and install a GCC cross-compiler.
#! /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!'
@CheatRAM

This comment has been minimized.

Show comment
Hide comment

Love U !!

@yinjinzhong

This comment has been minimized.

Show comment
Hide comment

Good.

@zeroows

This comment has been minimized.

Show comment
Hide comment

zeroows commented Mar 30, 2015

thanks

@andrewchambers

This comment has been minimized.

Show comment
Hide comment

thanks!

@dvranizan

This comment has been minimized.

Show comment
Hide comment
@dvranizan

dvranizan May 29, 2015

Thank you!!!

Thank you!!!

@BaoshanPang

This comment has been minimized.

Show comment
Hide comment
@BaoshanPang

BaoshanPang Sep 14, 2015

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 <gnu/stubs.h>
^
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' make[1]: *** [sunrpc/install-headers] Error 2 make[1]: Leaving directory/net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/glibc-2.20'
make: *** [install-headers] Error 2

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 <gnu/stubs.h>
^
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' make[1]: *** [sunrpc/install-headers] Error 2 make[1]: Leaving directory/net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/glibc-2.20'
make: *** [install-headers] Error 2

@Vladinator

This comment has been minimized.

Show comment
Hide comment
@Vladinator

Vladinator Mar 25, 2016

Is there a version to build gcc 5.3.x?

Is there a version to build gcc 5.3.x?

@itzurabhi

This comment has been minimized.

Show comment
Hide comment
@itzurabhi

itzurabhi May 18, 2016

used this guide to compile GCC 6.1 with latest GLibc and 4.6 Kernel , thank you for your efforts

used this guide to compile GCC 6.1 with latest GLibc and 4.6 Kernel , thank you for your efforts

@pwaring

This comment has been minimized.

Show comment
Hide comment
@pwaring

pwaring May 18, 2016

@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

pwaring commented May 18, 2016

@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

@thijstriemstra

This comment has been minimized.

Show comment
Hide comment
@thijstriemstra

thijstriemstra Jun 20, 2016

Thanks @pwaring, maybe you can add a note at the top of your blog post for the github repository?

Thanks @pwaring, maybe you can add a note at the top of your blog post for the github repository?

@mdeguzis

This comment has been minimized.

Show comment
Hide comment
@mdeguzis

mdeguzis Jul 23, 2016

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

mdeguzis commented Jul 23, 2016

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
@pwaring

This comment has been minimized.

Show comment
Hide comment
@pwaring

pwaring Jul 29, 2016

@thijstriemstra The blog post you link to isn't mine so I can't edit it.

pwaring commented Jul 29, 2016

@thijstriemstra The blog post you link to isn't mine so I can't edit it.

@astro-gokart

This comment has been minimized.

Show comment
Hide comment

Thanks

@itsmesrujan

This comment has been minimized.

Show comment
Hide comment
@itsmesrujan

itsmesrujan Sep 9, 2016

I am also facing same issue like...

make[4]: *** [subsegs.o] Error 1
make[4]: *** Waiting for unfinished jobs....
mv -f .deps/stabs.Tpo .deps/stabs.Po
mv -f .deps/symbols.Tpo .deps/symbols.Po
mv -f .deps/read.Tpo .deps/read.Po
make[4]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils/gas'
Makefile:2165: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils/gas'
Makefile:682: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils/gas'
Makefile:4710: recipe for target 'all-gas' failed
make[1]: *** [all-gas] Error 2
make[1]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils'
Makefile:830: recipe for target 'all' failed
make: *** [all] Error 2
FAILED COMMAND: make $PARALLEL_MAKE

I am also facing same issue like...

make[4]: *** [subsegs.o] Error 1
make[4]: *** Waiting for unfinished jobs....
mv -f .deps/stabs.Tpo .deps/stabs.Po
mv -f .deps/symbols.Tpo .deps/symbols.Po
mv -f .deps/read.Tpo .deps/read.Po
make[4]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils/gas'
Makefile:2165: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils/gas'
Makefile:682: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils/gas'
Makefile:4710: recipe for target 'all-gas' failed
make[1]: *** [all-gas] Error 2
make[1]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils'
Makefile:830: recipe for target 'all' failed
make: *** [all] Error 2
FAILED COMMAND: make $PARALLEL_MAKE

@uraymeiviar

This comment has been minimized.

Show comment
Hide comment
@uraymeiviar

uraymeiviar Oct 9, 2016

I have issue with PATH_MAX undefined while compiling last part of gcc (part6)

...
libtool: compile:  /rtos/test/build-gcc/./gcc/xgcc -B/rtos/test/build-gcc/./gcc/ -B/rtos/cross/x86_64-artos-linux/bin/ -B/rtos/cross/x86_64-artos-linux/lib/ -isystem /rtos/cross/x86_64-artos-linux/include -isystem /rtos/cross/x86_64-artos-linux/sys-include -DHAVE_CONFIG_H -I. -I../../../../gcc-6.2.0/libmpx/mpxrt -I.. -I../../../../gcc-6.2.0/libmpx/.. -fPIC -g -O2 -c ../../../../gcc-6.2.0/libmpx/mpxrt/mpxrt-utils.c  -fPIC -DPIC -o .libs/libmpx_la-mpxrt-utils.o
../../../../gcc-6.2.0/libmpx/mpxrt/mpxrt-utils.c:69:23: error: 'PATH_MAX' undeclared here (not in a function)
 #define MAX_FILE_NAME PATH_MAX
                       ^
../../../../gcc-6.2.0/libmpx/mpxrt/mpxrt-utils.c:91:22: note: in expansion of macro 'MAX_FILE_NAME'
 static char out_name[MAX_FILE_NAME];
                      ^~~~~~~~~~~~~
Makefile:390: recipe for target 'libmpx_la-mpxrt-utils.lo' failed
make[4]: *** [libmpx_la-mpxrt-utils.lo] Error 1
make[4]: Leaving directory '/rtos/test/build-gcc/x86_64-artos-linux/libmpx/mpxrt'
Makefile:409: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/rtos/test/build-gcc/x86_64-artos-linux/libmpx'
Makefile:300: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/rtos/test/build-gcc/x86_64-artos-linux/libmpx'
Makefile:12473: recipe for target 'all-target-libmpx' failed
make[1]: *** [all-target-libmpx] Error 2
...

my configuration are :

LINUX_ARCH=x86_64
CONFIGURATION_OPTIONS="--disable-multilib --disable-nls --disable-doc --without-selinux --disable-debug --disable-valgrind-tests --disable-documentation --disable-gtk-doc-pdf --disable-gtk-doc --disable-manpages --disable-gtk-doc-html --disable-tests" #
PARALLEL_MAKE=-j4
BINUTILS_VERSION=binutils-2.27
GCC_VERSION=gcc-6.2.0
LINUX_KERNEL_VERSION=linux-4.8.1
GLIBC_VERSION=glibc-2.24
MPFR_VERSION=mpfr-3.1.5
GMP_VERSION=gmp-6.1.1
MPC_VERSION=mpc-1.0.3
ISL_VERSION=isl-0.17.1
CLOOG_VERSION=cloog-0.18.4

any hints to fix?

I have issue with PATH_MAX undefined while compiling last part of gcc (part6)

...
libtool: compile:  /rtos/test/build-gcc/./gcc/xgcc -B/rtos/test/build-gcc/./gcc/ -B/rtos/cross/x86_64-artos-linux/bin/ -B/rtos/cross/x86_64-artos-linux/lib/ -isystem /rtos/cross/x86_64-artos-linux/include -isystem /rtos/cross/x86_64-artos-linux/sys-include -DHAVE_CONFIG_H -I. -I../../../../gcc-6.2.0/libmpx/mpxrt -I.. -I../../../../gcc-6.2.0/libmpx/.. -fPIC -g -O2 -c ../../../../gcc-6.2.0/libmpx/mpxrt/mpxrt-utils.c  -fPIC -DPIC -o .libs/libmpx_la-mpxrt-utils.o
../../../../gcc-6.2.0/libmpx/mpxrt/mpxrt-utils.c:69:23: error: 'PATH_MAX' undeclared here (not in a function)
 #define MAX_FILE_NAME PATH_MAX
                       ^
../../../../gcc-6.2.0/libmpx/mpxrt/mpxrt-utils.c:91:22: note: in expansion of macro 'MAX_FILE_NAME'
 static char out_name[MAX_FILE_NAME];
                      ^~~~~~~~~~~~~
Makefile:390: recipe for target 'libmpx_la-mpxrt-utils.lo' failed
make[4]: *** [libmpx_la-mpxrt-utils.lo] Error 1
make[4]: Leaving directory '/rtos/test/build-gcc/x86_64-artos-linux/libmpx/mpxrt'
Makefile:409: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/rtos/test/build-gcc/x86_64-artos-linux/libmpx'
Makefile:300: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/rtos/test/build-gcc/x86_64-artos-linux/libmpx'
Makefile:12473: recipe for target 'all-target-libmpx' failed
make[1]: *** [all-target-libmpx] Error 2
...

my configuration are :

LINUX_ARCH=x86_64
CONFIGURATION_OPTIONS="--disable-multilib --disable-nls --disable-doc --without-selinux --disable-debug --disable-valgrind-tests --disable-documentation --disable-gtk-doc-pdf --disable-gtk-doc --disable-manpages --disable-gtk-doc-html --disable-tests" #
PARALLEL_MAKE=-j4
BINUTILS_VERSION=binutils-2.27
GCC_VERSION=gcc-6.2.0
LINUX_KERNEL_VERSION=linux-4.8.1
GLIBC_VERSION=glibc-2.24
MPFR_VERSION=mpfr-3.1.5
GMP_VERSION=gmp-6.1.1
MPC_VERSION=mpc-1.0.3
ISL_VERSION=isl-0.17.1
CLOOG_VERSION=cloog-0.18.4

any hints to fix?

@prsolucoes

This comment has been minimized.

Show comment
Hide comment
@prsolucoes

prsolucoes Dec 14, 2016

How to make it works with "arm android"?

How to make it works with "arm android"?

@lcbcFoo

This comment has been minimized.

Show comment
Hide comment
@lcbcFoo

lcbcFoo Mar 27, 2017

Nice script! Just had to change a few things to build a gcc cross compiler for mips.

lcbcFoo commented Mar 27, 2017

Nice script! Just had to change a few things to build a gcc cross compiler for mips.

@bembam

This comment has been minimized.

Show comment
Hide comment
@bembam

bembam Apr 9, 2017

I am facing the following error after make -j4:

cc1: all warnings being treated as errors
Makefile:891: recipe for target 'subsegs.o' failed
make[4]: *** [subsegs.o] Error 1
make[4]: *** Waiting for unfinished jobs....
mv -f .deps/stabs.Tpo .deps/stabs.Po
mv -f .deps/read.Tpo .deps/read.Po
mv -f .deps/symbols.Tpo .deps/symbols.Po
make[4]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils/gas'
Makefile:2165: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils/gas'
Makefile:682: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils/gas'
Makefile:4710: recipe for target 'all-gas' failed
make[1]: *** [all-gas] Error 2
make[1]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils'
Makefile:830: recipe for target 'all' failed
make: *** [all] Error 2

bembam commented Apr 9, 2017

I am facing the following error after make -j4:

cc1: all warnings being treated as errors
Makefile:891: recipe for target 'subsegs.o' failed
make[4]: *** [subsegs.o] Error 1
make[4]: *** Waiting for unfinished jobs....
mv -f .deps/stabs.Tpo .deps/stabs.Po
mv -f .deps/read.Tpo .deps/read.Po
mv -f .deps/symbols.Tpo .deps/symbols.Po
make[4]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils/gas'
Makefile:2165: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils/gas'
Makefile:682: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils/gas'
Makefile:4710: recipe for target 'all-gas' failed
make[1]: *** [all-gas] Error 2
make[1]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils'
Makefile:830: recipe for target 'all' failed
make: *** [all] Error 2

@U007D

This comment has been minimized.

Show comment
Hide comment
@U007D

U007D May 6, 2017

I'm building for a RaspberryPi3 running Raspbian, so I want to build my cross-compiler for a 32-bit Linux target. (I'm on Mac OS X Sierra 10.12.4, if that matters.) Should I use arm-linux? armv7-unknown-gnueabihf? Something else?

Fairly new to this, so in addition to knowing the proper 32-bit target identifier for the RPi3, I'd like to know how/where to find the list of valid targets.

Thank you for this and the blog article!

U007D commented May 6, 2017

I'm building for a RaspberryPi3 running Raspbian, so I want to build my cross-compiler for a 32-bit Linux target. (I'm on Mac OS X Sierra 10.12.4, if that matters.) Should I use arm-linux? armv7-unknown-gnueabihf? Something else?

Fairly new to this, so in addition to knowing the proper 32-bit target identifier for the RPi3, I'd like to know how/where to find the list of valid targets.

Thank you for this and the blog article!

@U007D

This comment has been minimized.

Show comment
Hide comment
@U007D

U007D May 6, 2017

Incidentally I'm here looking at the script, because in following the steps on your blog, I got an error on Step 4.

I'm on Mac OS X Sierra 10.12.4. No errors (modulo having to unpack linux-4.4.38 to a case-sensitive filesystem in order for it to install properly) following Steps 1-3.

At Step 4, though, I got the following:

$ ../glibc-2.19/configure --prefix=/usr/local/bin/gcc-7.1.0-armv7-linux-gnueabihf/armv7-linux-gnueabihf --build=$MACHTYPE --host=armv7-linux-gnueabihf --target=armv7-linux-gnueabihf --with-headers=/usr/local/bin/gcc-7.1.0-armv7-linux-gnueabihf/include --disable-multilib libc_cv_forced_unwind=yes
checking build system type... x86_64-apple-darwin16
checking host system type... armv7-unknown-linux-gnueabihf
checking for armv7-linux-gnueabihf-gcc... /usr/local/bin/gcc-7.1.0-armv7-linux-gnueabihf/bin/armv7-linux-gnueabihf-gcc
...
checking whether to put _rtld_local into .sdata section... no
checking for .preinit_array/.init_array/.fini_array support... no
configure: error: Need linker with .init_array/.fini_array support.

I've tried several Google searches and a number of variations of the above configure command, but no luck.

Any ideas on how to fix this?

--

Some background, in case it helps:

  • Followed steps 1-4 exactly, changing only the target (armv7-unknown-gnueabihf for 32-bit ARM) and the install path (/usr/local/bin/gcc-7.1.0-armv7-unknown-gnueabihf).
  • Compiled using gcc v7.1.0 using the following versions of the gcc components to best match the kernel version used for the Raspberry Pi 3's Raspbian Linux or otherwise used the latest version:
    • binutils v2.28
    • glibc v2.19
    • gmp v6.1.2
    • isl v0.16.1
    • linux 4.4.38
    • mpc v1.0.3
    • mpfr v3.1.5

U007D commented May 6, 2017

Incidentally I'm here looking at the script, because in following the steps on your blog, I got an error on Step 4.

I'm on Mac OS X Sierra 10.12.4. No errors (modulo having to unpack linux-4.4.38 to a case-sensitive filesystem in order for it to install properly) following Steps 1-3.

At Step 4, though, I got the following:

$ ../glibc-2.19/configure --prefix=/usr/local/bin/gcc-7.1.0-armv7-linux-gnueabihf/armv7-linux-gnueabihf --build=$MACHTYPE --host=armv7-linux-gnueabihf --target=armv7-linux-gnueabihf --with-headers=/usr/local/bin/gcc-7.1.0-armv7-linux-gnueabihf/include --disable-multilib libc_cv_forced_unwind=yes
checking build system type... x86_64-apple-darwin16
checking host system type... armv7-unknown-linux-gnueabihf
checking for armv7-linux-gnueabihf-gcc... /usr/local/bin/gcc-7.1.0-armv7-linux-gnueabihf/bin/armv7-linux-gnueabihf-gcc
...
checking whether to put _rtld_local into .sdata section... no
checking for .preinit_array/.init_array/.fini_array support... no
configure: error: Need linker with .init_array/.fini_array support.

I've tried several Google searches and a number of variations of the above configure command, but no luck.

Any ideas on how to fix this?

--

Some background, in case it helps:

  • Followed steps 1-4 exactly, changing only the target (armv7-unknown-gnueabihf for 32-bit ARM) and the install path (/usr/local/bin/gcc-7.1.0-armv7-unknown-gnueabihf).
  • Compiled using gcc v7.1.0 using the following versions of the gcc components to best match the kernel version used for the Raspberry Pi 3's Raspbian Linux or otherwise used the latest version:
    • binutils v2.28
    • glibc v2.19
    • gmp v6.1.2
    • isl v0.16.1
    • linux 4.4.38
    • mpc v1.0.3
    • mpfr v3.1.5
@ScrambledAuroras

This comment has been minimized.

Show comment
Hide comment
@ScrambledAuroras

ScrambledAuroras Dec 30, 2017

Disable libsanitizer by passing --disable-libsanitizer to GCC while configuring. That is, if you're using uClibc-ng.

If you want to compile on macOS do a Canadian Cross Compile with a macOS to Linux ABI handover. I'm not sure how to explain.

ScrambledAuroras commented Dec 30, 2017

Disable libsanitizer by passing --disable-libsanitizer to GCC while configuring. That is, if you're using uClibc-ng.

If you want to compile on macOS do a Canadian Cross Compile with a macOS to Linux ABI handover. I'm not sure how to explain.

@kanj

This comment has been minimized.

Show comment
Hide comment
@kanj

kanj Apr 3, 2018

Amazing script. I was able to create a cross compiler for ARM, and then create a Kernel and BusyBox to boot up in QEMU. I have converted the script to a makefile under kanj/MAKE_CROSS_LINUX for reference.

kanj commented Apr 3, 2018

Amazing script. I was able to create a cross compiler for ARM, and then create a Kernel and BusyBox to boot up in QEMU. I have converted the script to a makefile under kanj/MAKE_CROSS_LINUX for reference.

@BetterCallBene

This comment has been minimized.

Show comment
Hide comment
@BetterCallBene

BetterCallBene Apr 24, 2018

Very interesting script. On this basis, i create conan package https://github.com/BetterCallBene/conan-cgcc.

Very interesting script. On this basis, i create conan package https://github.com/BetterCallBene/conan-cgcc.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment