linaro gcc 交叉编译链编译

本文档详细介绍了如何在Ubuntu 14.04 amd64环境下,搭建Linaro GCC 4.8.3的交叉编译链。编译过程中涉及依赖项包括gmp、mpfr、binutils、glibc_headers、glibc等,并特别指出在编译binutils时禁用multilib可能导致的问题。在多次编译gcc的过程中,需要注意不同阶段的配置选项,例如--with-newlib和--enable-shared的使用时机,以及解决编译过程中遇到的如stdio.h缺失和zlib编译失败等错误。
摘要由CSDN通过智能技术生成
linaro gcc 交叉编译链编译全解析

在此编译的是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
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值