linaro gcc 交叉编译链编译全解析
gmp
ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
mpfr 依赖gmp
ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
mpc 依赖mpfr,gmp
ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
isl 依赖gmp
ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.11.1.tar.bz2
cloog 依赖isl或者编译自带的,编译cloog自带的有可能会有和binutils需要的isl版本冲突
ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-0.18.1.tar.gz
binutils 需要依赖isl和cloog
http://releases.linaro.org/archive/14.03/components/toolchain/binutils-linaro/binutils-linaro-2.24-2014.03.tar.xz
kernel 作为编译glibc时需要依赖的linux头文件
https://www.kernel.org/pub/linux/kernel/ 3.4.39
eglibc 需要用编译出来的交叉编译链中的gcc作为编译器
http://releases.linaro.org/archive/13.10/components/toolchain/eglibc-linaro/eglibc-linaro-2.18-2013.10.tar.bz2
gcc 依赖binutils编译出来的ar等程序
http://releases.linaro.org/archive/14.04/components/toolchain/gcc-linaro/4.8/gcc-linaro-4.8-2014.04.tar.xz
编译顺序:
gmp
mpfr
mpc
isl
cloog
binutils
gcc_first 首先静态编译出用于编译eglibc编译的gcc(这时候需要依赖libc的功能都不要选)
kernel 编译需要用到的headers
eglibc_header 初次编译再次编译gcc所依赖的libc库
gcc_second 编译可以依赖libc的动态库
eglibc 编译完整的glibc库
gcc_all 编译需要依赖glibc完整库的gcc(g++ libmudflap等)
sudo apt-get install linux-generic-lts-xenial linux-headers-generic-lts-xenial linux-image-generic-lts-xenial (更新到当前版本的最新系统时提示还有几个没有更新,可以不需要)
sudo apt-get autoclean
sudo apt-get clean
需要用到编译相关的程序/库
sudo apt-get install gcc
sudo apt-get install gdb
sudo apt-get install g++
sudo apt-get install pkg-config
sudo apt-get install autoconf
sudo apt-get install texinfo
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install gettext
sudo apt-get install unzip
sudo apt-get install texlive
其他
sudo apt-get install cmake
sudo apt-get install git
sudo apt-get install subversion
sudo apt-get install lib32stdc++6
sudo apt-get install lib32ncurses5
sudo apt-get install lib32bz2-1.0
sudo apt-get install lib32z1
sudo apt-get install ncurses-dev
在此编译的是4.8.3版本的gcc,依赖2.18的glibc,2.24的binutils
参考http://blog.chinaunix.net/uid-24943863-id-3997047.html 和 CodeSourcery的编译脚本
依赖:gmp
ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
mpfr 依赖gmp
ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
mpc 依赖mpfr,gmp
ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
isl 依赖gmp
ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.11.1.tar.bz2
cloog 依赖isl或者编译自带的,编译cloog自带的有可能会有和binutils需要的isl版本冲突
ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-0.18.1.tar.gz
binutils 需要依赖isl和cloog
http://releases.linaro.org/archive/14.03/components/toolchain/binutils-linaro/binutils-linaro-2.24-2014.03.tar.xz
kernel 作为编译glibc时需要依赖的linux头文件
https://www.kernel.org/pub/linux/kernel/ 3.4.39
eglibc 需要用编译出来的交叉编译链中的gcc作为编译器
http://releases.linaro.org/archive/13.10/components/toolchain/eglibc-linaro/eglibc-linaro-2.18-2013.10.tar.bz2
gcc 依赖binutils编译出来的ar等程序
http://releases.linaro.org/archive/14.04/components/toolchain/gcc-linaro/4.8/gcc-linaro-4.8-2014.04.tar.xz
编译顺序:
gmp
mpfr
mpc
isl
cloog
binutils
gcc_first 首先静态编译出用于编译eglibc编译的gcc(这时候需要依赖libc的功能都不要选)
kernel 编译需要用到的headers
eglibc_header 初次编译再次编译gcc所依赖的libc库
gcc_second 编译可以依赖libc的动态库
eglibc 编译完整的glibc库
gcc_all 编译需要依赖glibc完整库的gcc(g++ libmudflap等)
编译平台:Ubuntu 14.04 amd64 server I5 4G
sudo apt-get update
sudo apt-get upgrade (更新到当前版本的最新系统)sudo apt-get install linux-generic-lts-xenial linux-headers-generic-lts-xenial linux-image-generic-lts-xenial (更新到当前版本的最新系统时提示还有几个没有更新,可以不需要)
sudo apt-get autoclean
sudo apt-get clean
需要用到编译相关的程序/库
sudo apt-get install gcc
sudo apt-get install gdb
sudo apt-get install g++
sudo apt-get install pkg-config
sudo apt-get install autoconf
sudo apt-get install texinfo
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install gettext
sudo apt-get install unzip
sudo apt-get install texlive
其他
sudo apt-get install cmake
sudo apt-get install git
sudo apt-get install subversion
sudo apt-get install lib32stdc++6
sudo apt-get install lib32ncurses5
sudo apt-get install lib32bz2-1.0
sudo apt-get install lib32z1
sudo apt-get install ncurses-dev
开始构建:
设置相关的参数变量:
#!/bin/bash
BUILDPKGVERSION="GCC Linaro Lite 2014.04"
#build depends
HOST_LIBS=host-libs/usr
BINUTILS_LIBS=binutils-libs/usr
GCC_LIBS=gcc-libs
TARGET=arm-linux-gnueabi
HOST_TARGET=x86_64-linux-gnu
CUR_DIR=`pwd`
SRC_DIR=${CUR_DIR}/src
BUILD_DIR=${CUR_DIR}/build
INSTALL_DIR=${CUR_DIR}/install
GMP_TAR=${CUR_DIR}/gmp-4.3.2.tar.bz2
MPFR_TAR=${CUR_DIR}/mpfr-2.4.2.tar.bz2
ISL_TAR=${CUR_DIR}/isl-0.11.1.tar.bz2
CLOOG_TAR=${CUR_DIR}/cloog-0.18.1.tar.bz2
MPC_TAR=${CUR_DIR}/mpc-0.8.1.tar.bz2
LINUX_TAR=${CUR_DIR}/kernel-3.4.39.tar.bz2
GLIBC_TAR=${CUR_DIR}/eglibc-linaro-2.18-2013.10.tar.bz2
BINUTILS_TAR=${CUR_DIR}/binutils-linaro-2.24-2014.03.tar.bz2
GCC_TAR=${CUR_DIR}/gcc-linaro-4.8-2014.04.tar.bz2
GDB_TAR=${CUR_DIR}/gdb-linaro-7.6-2013.05.tar.bz2
PROJ_NAME=arm-eglibc-linux-gnueabi
SYSROOT=sysroot
GMP_SRC=${SRC_DIR}/gmp
MPFR_SRC=${SRC_DIR}/mpfr
MPC_SRC=${SRC_DIR}/mpc
ISL_SRC=${SRC_DIR}/isl
CLOOG_SRC=${SRC_DIR}/cloog
BINUTILS_SRC=${SRC_DIR}/binutils
LINUX_SRC=${SRC_DIR}/linux
GLIBC_SRC=${SRC_DIR}/glibc
GCC_SRC=${SRC_DIR}/gcc
GDB_SRC=${SRC_DIR}/gdb
GMP_BUILD=${BUILD_DIR}/gmp
MPFR_BUILD=${BUILD_DIR}/mpfr
MPC_BUILD=${BUILD_DIR}/mpc
ISL_BUILD=${BUILD_DIR}/isl
CLOOG_BUILD=${BUILD_DIR}/cloog
BINUTILS_BUILD=${BUILD_DIR}/binutils
LINUX_BUILD=${BUILD_DIR}/linux
GLIBC_HEADER_BUILD=${BUILD_DIR}/glibc_header
GLIBC_BUILD=${BUILD_DIR}/glibc
GCC_FIRST_BUILD=${BUILD_DIR}/gcc_first
GCC_SECOND_BUILD=${BUILD_DIR}/gcc_second
GCC_THIRD_BUILD=${BUILD_DIR}/gcc_third
GDB_BUILD=${BUILD_DIR}/gdb
GDB_B_BUILD=${BUILD_DIR}/gdb_build
GDB_SERVER_BUILD=${BUILD_DIR}/gdb_server
export PATH=$PATH:${INSTALL_DIR}/${PROJ_NAME}/bin
#init src build install
init_dir()
{
rm -rf ${SRC_DIR} ${BUILD_DIR} ${INSTALL_DIR}
mkdir -p ${SRC_DIR}
mkdir -p ${BUILD_DIR}
mkdir -p ${INSTALL_DIR}
}
配置和编译需要依赖的库(gmp、mpfr等):
#编译静态库的方式,以便后面不需要把动态库包含进来
#gmp
build_gmp()
{
tar -jxf ${GMP_TAR} -C ${SRC_DIR}
BASENAME=`basename ${GMP_TAR} .tar.bz2`
mv ${SRC_DIR}/${BASENAME} ${GMP_SRC}
mkdir -p ${GMP_BUILD}
pushd ${GMP_BUILD}
${GMP_SRC}/configure \
--prefix=${INSTALL_DIR}/build/${HOST_LIBS} \
--build=${HOST_TARGET} --host=${HOST_TARGET} \
--target=${HOST_TARGET} \
--disable-shared
make -j4 CFLAGS="-g -O2"
make install
make check
popd
}
#mpfr
build_mpfr()
{
tar -jxf ${MPFR_TAR} -C ${SRC_DIR}
BASENAME=`basename ${MPFR_TAR} .tar.bz2`
mv ${SRC_DIR}/${BASENAME} ${MPFR_SRC}
mkdir -p ${MPFR_BUILD}
pushd ${MPFR_BUILD}
${MPFR_SRC}/configure \
--prefix=${INSTALL_DIR}/build/${HOST_LIBS} \
--build=${HOST_TARGET} \
--host=${HOST_TARGET} \
--target=${TARGET} \
--with-gmp=${INSTALL_DIR}/build/${HOST_LIBS} \
--disable-shared
make -j4 CFLAGS="-g -O2"
make install
make check
popd
}
#mpc
build_mpc()
{
tar -jxf ${MPC_TAR} -C ${SRC_DIR}
BASENAME=`basename ${MPC_TAR} .tar.bz2`
mv ${SRC_DIR}/${BASENAME} ${MPC_SRC}
mkdir -p ${MPC_BUILD}
pushd ${MPC_BUILD}
${MPC_SRC}/configure \
--prefix=${INSTALL_DIR}/build/${HOST_LIBS} \
--build=${HOST_TARGET} \
--host=${HOST_TARGET} \
--target=${TARGET} \
--with-gmp=${INSTALL_DIR}/build/${HOST_LIBS} \
--with-mpfr=${INSTALL_DIR}/build/${HOST_LIBS} \
--disable-shared
make -j4 CFLAGS="-g -O2"
make install
make check
popd
}
#mpc
build_isl()
{
tar -jxf ${ISL_TAR} -C ${SRC_DIR}
BASENAME=`basename ${ISL_TAR} .tar.bz2`
mv ${SRC_DIR}/${BASENAME} ${ISL_SRC}
mkdir -p ${ISL_BUILD}
pushd ${ISL_BUILD}
${ISL_SRC}/configure \
--prefix=${INSTALL_DIR}/build/${HOST_LIBS} \
--build=${HOST_TARGET} \
--host=${HOST_TARGET} \
--target=${TARGET} \
--with-gmp-prefix=${INSTALL_DIR}/build/${HOST_LIBS} \
--disable-shared
make -j4 CFLAGS="-g -O2"
make install
make check
popd
}
#cloog 如果没有配置isl则会编译自带的,如果上面编译了isl,这里没有进行关联,会导致isl冲突而binutils配置失败
build_cloog()
{
tar -jxf ${CLOOG_TAR} -C ${SRC_DIR}
BASENAME=`basename ${CLOOG_TAR} .tar.bz2`
mv ${SRC_DIR}/${BASENAME} ${CLOOG_SRC}
mkdir -p ${CLOOG_BUILD}
pushd ${CLOOG_BUILD}
${CLOOG_SRC}/configure \
--prefix=${INSTALL_DIR}/build/${HOST_LIBS} \
--build=${HOST_TARGET} \
--host=${HOST_TARGET} \
--target=${TARGET} \
--with-isl=system \
--with-isl-prefix=${INSTALL_DIR}/build/${HOST_LIBS} \
--with-gmp-prefix=${INSTALL_DIR}/build/${HOST_LIBS} \
--disable-shared
make -j4 CFLAGS="-g -O2"
make install
make check
popd
}
编译binutils:(不能加--enable-shared,会导致移植后使用时链接库失败)
#binutils
build_binutils()
{
tar -jxf ${BINUTILS_TAR} -C ${SRC_DIR}
BASENAME=`basename ${BINUTILS_TAR} .tar.bz2`
mv ${SRC_DIR}/${BASENAME} ${BINUTILS_SRC}
mkdir -p ${BINUTILS_BUILD}
pushd ${BINUTILS_BUILD}
${BINUTILS_SRC}/configure \
--prefix=${INSTALL_DIR}/${PROJ_NAME} \
--build=${HOST_TARGET} \
--host=${HOST_TARGET} \
--target=${TARGET} \
--disable-gdb \
--disable-libdecnumber \
--disable-readline \
--disable-sim \
--disable-nls \
--enable-poison-system-directories \
--enable-plugins \
--with-float=softfp \
--with-pkgversion="'""${BUILDPKGVERSION}""'" \
--with-isl=${INSTALL_DIR}/build/${HOST_LIBS} \
--with-sysroot=${INSTALL_DIR}/${PROJ_NAME}/${TARGET}/${SYSROOT}
make -j4 all-libiberty CPPFLAGS=-I${INSTALL_DIR}/build/${HOST_LIBS}/include LDFLAGS=-L${INSTALL_DIR}/build/${HOST_LIBS}/lib
mkdir -p ${INSTALL_DIR}/build/${BINUTILS_LIBS}
mkdir -p ${INSTALL_DIR}/build/${BINUTILS_LIBS}/lib
mkdir -p ${INSTALL_DIR}/build/${BINUTILS_LIBS}/include
mkdir -p ${INSTALL_DIR}/build/${BINUTILS_LIBS}/testbin
cp -r ${BINUTILS_SRC}/include ${INSTALL_DIR}/build/${BINUTILS_LIBS}/include
chmod -R u+w ${INSTALL_DIR}/build/${BINUTILS_LIBS}/include
cp ${BINUTILS_BUILD}/libiberty/libiberty.a ${INSTALL_DIR}/build/${BINUTILS_LIBS}/lib
make -j4 CPPFLAGS=-I${INSTALL_DIR}/build/${HOST_LIBS}/include LDFLAGS=-L${INSTALL_DIR}/build/${HOST_LIBS}/lib includedir=${INSTALL_DIR}/${PROJ_NAME}/${TARGET}/${SYSROOT}/usr/include libdir=${INSTALL_DIR}/${PROJ_NAME}/${TARGET}/${SYSROOT}/usr/lib
cp ${BINUTILS_BUILD}/bfd/.libs/libbfd.a ${INSTALL_DIR}/build/${BINUTILS_LIBS}/lib
cp ${BINUTILS_BUILD}/bfd/bfd.h ${INSTALL_DIR}/build/${BINUTILS_LIBS}/include
cp ${BINUTILS_SRC}/bfd/elf-bfd.h ${INSTALL_DIR}/build/${BINUTILS_LIBS}/include
cp ${BINUTILS_BUILD}/opcodes/.libs/libopcodes.a ${INSTALL_DIR}/build/${BINUTILS_LIBS}/lib
cp ${BINUT