Ubuntu 10.04 下编译交叉工具链arm-linux-gcc 4.5.1

前文「Ubuntu 10.04 下编译交叉工具链GCC 4.5.1 」编译出来的交叉工具链不管是在编译内核还是应用程序都存在这样或者那样的问题。分析原因主要是因为采用的是newlib,所以编译的工具比较适合编译内核,应用程序不合适。这次使用glibc,编译出来的交叉工具链比较成功。具体步骤如下:

1. 下载二进制文件处理工具集合binutils-2.20.1.tar.bz2,下载地址为 http://ftp.gnu.org/gnu/binutils/binutils-2.20.1.tar.bz2
2. 下载GNU编译器集合gcc-4.5.1.tar.bz2(也可仅下载core和g++),下载地址为 http://gcc.parentingamerica.com/releases/gcc-4.5.1/gcc-4.5.1.tar.bz2
3. 下载编译GCC-4.5.0的依赖库:
   gmp-5.0.1.tar.bz2: 下载地址为 ftp://ftp.gmplib.org/pub/gmp-5.0.1/gmp-5.0.1.tar.bz2
   mpfr-3.0.0.tar.bz2: 下载地址为 http://www.mpfr.org/mpfr-current/mpfr-3.0.0.tar.bz2
   mpc-0.8.2.tar.gz: 下载地址为 http://www.multiprecision.org/mpc/download/mpc-0.8.2.tar.gz
4. 下载C运行时库glibc的相关安装包及补丁:
   glibc-2.11.tar.bz2,下载地址为 ftp://ftp.gnu.org/gnu/glibc/glibc-2.11.tar.bz2
   glibc-ports-2.11.tar.bz2,下载地址为 ftp://ftp.gnu.org/gnu/glibc/glibc-ports-2.11.tar.bz2
   glibc-2.11-libgcc_eh-1.patch,下载地址为 http://blog.csdn.net/Matrix_Designer/archive/2010/10/31/5977783.aspx (原始地址为 http://www.freesa.org/repositories/entry/freesa/patches/glibc-2.11-libgcc_eh-1.patch?rev=557f86a37891e17e39570db4a5aaead7159d1a37 )
5. 下载linux内核源码linux-2.6.20.tar.bz2,地址为ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.tar.bz2
6. 下载调试器gdb-7.2.tar.bz2,下载地址为 http://ftp.gnu.org/gnu/gdb/gdb-7.2.tar.bz2
7. 将所有文件都拷贝到同一目录下,然后进入此目录,执行:gedit Makefile &

    添加以下内容:

TARGET= arm-linux
PREFIX=/opt/$(TARGET)-tools/
TEMP_PREFIX=$(HOME)/build-temp/
PROCS=2

GMP_REV = 5.0.1
MPFR_REV = 3.0.0
MPC_REV = 0.8.2
BINUTILS_REV = 2.20.1
GCC_REV = 4.5.1
LINUX_REV = 2.6.20
LINUX_ARCH = arm
LINUX_MACH = s3c2410
GLIBC_REV = 2.11
GLIBC_PORTS_REV = 2.11
GLIBC_LIBGCC_EH_REV = 2.11
GDB_REV = 7.2

.PHONY: all, distclean, install-deps, install-cross, clean

all: prerequest install-deps install-cross


prerequest:
    mkdir -p $(PREFIX)/bin
    mkdir -p $(TEMP_PREFIX)/lib
    apt-get install curl flex bison libgmp3-dev libmpfr-dev autoconf texinfo build-essential texlive libncurses5-dev sed
    touch prerequest

install-deps: gmp mpfr mpc

install-cross: cross-binutils cross-gcc1 cross-header cross-glibc cross-gcc2 cross-gdb


gmp: gmp-$(GMP_REV).tar.bz2
    tar -xvf $<
    mkdir -p build/gmp && cd build/gmp && /
    pushd ../../gmp-$(GMP_REV) ; /
    make clean; /
    popd ; /
    ../../gmp-$(GMP_REV)/configure --disable-shared --prefix=$(TEMP_PREFIX) && /
    $(MAKE) -j$(PROCS) && /
    $(MAKE) install && /
    touch ../../gmp

mpfr: mpfr-$(MPFR_REV).tar.bz2 gmp
    tar -xvf $<
    mkdir -p build/mpfr && cd build/mpfr && /
    bushed ../../mpfr-$(MPFR_REV) ; /
    make clean ; /
    popd ; /
    ../../mpfr-$(MPFR_REV)/configure LDFLAGS="-Wl,-search_paths_first" --disable-shared --with-gmp=$(TEMP_PREFIX) --prefix=$(TEMP_PREFIX) && /
    $(MAKE) -j$(PROCS) all && /
    $(MAKE) install && /
    touch ../../mpfr

mpc: mpc-$(MPC_REV).tar.gz gmp mpfr
    tar -xvf $<
    mkdir -p build/mpc && cd build/mpc && /
    pushed ../../mpc-$(MPC_REV) ; /
    make clean ; /
    popd ; /
    ../../mpc-$(MPC_REV)/configure --disable-shared --with-gmp=$(TEMP_PREFIX) --with-mpfr=$(TEMP_PREFIX) --prefix=$(TEMP_PREFIX) && /
    $(MAKE) -j$(PROCS) && /
    $(MAKE) install && /
    touch ../../mpc

cross-binutils: binutils-$(BINUTILS_REV).tar.bz2
    tar -xvf $<
    mkdir -p build/binutils && cd build/binutils && /
    pushd ../../binutils-$(BINUTILS_REV) ; /
    make clean ; /
    popd ; /
    ../../binutils-$(BINUTILS_REV)/configure --prefix=$(PREFIX) --target=$(TARGET) --disable-shared --disable-nls --disable-werror && /
    $(MAKE) -j$(PROCS) && /
    $(MAKE) install && /
    touch ../../cross-binutils

cross-gcc1: gcc-$(GCC_REV).tar.bz2 cross-binutils
    tar -xvf $<
    cp gcc-$(GCC_REV)/gcc/config/arm/t-linux gcc-$(GCC_REV)/gcc/config/arm/t-linux.bak
    sed -i 's/-fomit-frame-pointer -fPIC/-fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h/g' gcc-$(GCC_REV)/gcc/config/arm/t-linux
    mkdir -p build/gcc1 && cd build/gcc1 && /
    pushd ../../gcc-$(GCC_REV) ; /
    export LD_LIBRARY_PATH=$(TEMP_PREFIX)/lib:$(LD_LIBRARY_PATH) && /
    make clean ; /
    popd ; /
    export LD_LIBRARY_PATH=$(TEMP_PREFIX)/lib:$(LD_LIBRARY_PATH) && /
    ../../gcc-$(GCC_REV)/configure --prefix=$(PREFIX) --target=$(TARGET) --enable-languages="c" --with-gnu-ld --with-gnu-as --with-newlib --disable-nls --disable-shared --disable-threads --disable-libssp --disable-libmudflap --disable-libgomp --with-gmp=$(TEMP_PREFIX) --with-mpfr=$(TEMP_PREFIX) --with-mpc=$(TEMP_PREFIX) && /
    $(MAKE) -j$(PROCS) && /
    $(MAKE) install && /
    ln -sv $(PREFIX)/bin/$(TARGET)-gcc $(PREFIX)/bin/$(TARGET)-cc && /
    touch ../../cross-gcc1

cross-header: linux-$(LINUX_REV).tar.bz2 cross-gcc1
    tar -xvf $<
    cd linux-$(LINUX_REV) ; /
    export PATH=$(PREFIX)/bin:$(PATH) && /
    $(MAKE) distclean ; /
    export PATH=$(PREFIX)/bin:$(PATH) && /
    $(MAKE) ARCH=$(LINUX_ARCH) CROSS_COMPILE=$(TARGET)- $(LINUX_MACH)_defconfig && /
    $(MAKE) ARCH=$(LINUX_ARCH) CROSS_COMPILE=$(TARGET)- --ignore-errors && /
    mkdir -p $(PREFIX)/$(TARGET)/include && /
    cp -aR include/linux $(PREFIX)/$(TARGET)/include/ && /
    cp -aR include/asm-arm $(PREFIX)/$(TARGET)/include/asm && /
    cp -aR include/asm-generic $(PREFIX)/$(TARGET)/include/ && /
    ln -s $(PREFIX)/$(TARGET)/include $(PREFIX)/$(TARGET)/sys-include && /
    touch ../cross-header

cross-glibc: glibc-$(GLIBC_REV).tar.bz2 glibc-ports-$(GLIBC_PORTS_REV).tar.bz2 glibc-$(GLIBC_LIBGCC_EH_REV)-libgcc_eh-1.patch cross-gcc1 cross-header
    tar -xvf $<
    tar -xvf glibc-ports-$(GLIBC_PORTS_REV).tar.bz2 --directory=glibc-$(GLIBC_REV)
    cd glibc-$(GLIBC_REV) && /
    patch -Np1 -i ../glibc-$(GLIBC_LIBGCC_EH_REV)-libgcc_eh-1.patch && /
    cd ..
    mkdir -p build/glibc && cd build/glibc && /
    pushd ../../glibc-$(GLIBC_REV) ; /
    export PATH=$(PREFIX)/bin:$(PATH) && /
    make clean ; /
    popd ; /
    export PATH=$(PREFIX)/bin:$(PATH) && /
    CC=$(TARGET)-gcc AR=$(TARGET)-ar RANLIB=$(TARGET)-ranlib ../../glibc-$(GLIBC_REV)/configure --prefix=$(PREFIX)/$(TARGET) --host=$(TARGET) --build=i686-pc-linux-gnu --with-headers=$(PREFIX)/$(TARGET)/include --enable-add-ons --with-binutils=$(PREFIX)/$(TARGET)/bin --with-tls --with-__thread --enable-sim --enable-nptl --enable-kernel=$(LINUX_REV) --disable-profile --without-gd libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes && /
    $(MAKE) -j$(PROCS) && /
    $(MAKE) install && /
    touch ../../cross-glibc

cross-gcc2: cross-gcc1 cross-header cross-glibc
    cp gcc-$(GCC_REV)/gcc/config/arm/t-linux.bak gcc-$(GCC_REV)/gcc/config/arm/t-linux
    mkdir -p build/gcc2 && cd build/gcc2 && /
    pushd ../../gcc-$(GCC_REV) ; /
    export PATH=$(PREFIX)/bin:$(PATH) && /
    make clean ; /
    popd ; /
    export PATH=$(PREFIX)/bin:$(PATH) && /
    ../../gcc-$(GCC_REV)/configure --prefix=$(PREFIX) --target=$(TARGET) --enable-languages="c,c++" --with-gnu-ld --with-gnu-as --disable-nls --disable-werror --enable-threads=posix --enable-shared --enable-__cxa_atexit --with-local-prefix=$(PREFIX)/$(TARGET) --with-gmp=$(TEMP_PREFIX) --with-mpfr=$(TEMP_PREFIX) --with-mpc=$(TEMP_PREFIX) && /
    $(MAKE) -j$(PROCS) && /
    $(MAKE) install && /
    echo "$(PREFIX)/bin/arm-linux-readelf -a /$1 | gawk '/Shared library/{print /$5}'" > $(PREFIX)/bin/arm-linux-ldd && /
    chmod a+x $(PREFIX)/bin/arm-linux-ldd && /
    touch ../../cross-gcc2

cross-gdb: gdb-$(GDB_REV).tar.bz2 cross-gcc2
    tar -xvf $<
    mkdir -p build/gdb && cd build/gdb && /
    pushd ../../gdb-$(GDB_REV) ;/
    export PATH=$(PREFIX)/bin:$(PATH) && /
    make clean ; /
    popd ; /
    export PATH=$(PREFIX)/bin:$(PATH) && /
    ../../gdb-$(GDB_REV)/configure --prefix=$(PREFIX) --target=$(TARGET) --enable-shared --disable-werror && /
    $(MAKE) -j$(PROCS) && /
    $(MAKE) install && /
    touch ../../cross-gdb


distclean: clean
    rm -fr $(PREFIX)

clean:
    rm -fr prerequest gmp mpfr mpc cross-binutils cross-gcc1 cross-header cross-glibc cross-gcc2 cross-gdb build gmp-$(GMP_REV) mpfr-$(MPFR_REV) mpc-$(MPC_REV) binutils-$(BINUTILS_REV) gcc-$(GCC_REV) linux-$(LINUX_REV) glibc-$(GLIBC_REV) gdb-$(GDB_REV) $(TEMP_PREFIX)

 

8. sudo make all
9. sudo make clean

10. gedit ~/.bashrc &
在文件末尾添加以下内容:
export PATH=/opt/arm-linux-tools/bin:$(PATH)

至此,工具编译成功。内核和应用程序都可以成功编译,编译的应用程序可以下载到板子上运行(测试过s3c2410)。这个配置也可以用来编译arm-none-linux-gnueabi-gcc,默认使用eabi来编译应用程序,还可以用它来编译eabi配置的内核。

至此安装成功!如果是动态链接的程序,板子上需要拷贝相关的库文件到/lib目录下,具体的文件如下:

/opt/arm-linux-tools/arm-linux/lib/libc.so.6
/opt/arm-linux-tools/arm-linux/lib/libc-2.11.so
/opt/arm-linux-tools/arm-linux/lib/ld-linux.so.2
/opt/arm-linux-tools/arm-linux/lib/libgcc_s.so.1
/opt/arm-linux-tools/arm-linux/lib/libm.so.6
/opt/arm-linux-tools/arm-linux/lib/libdl.so.2
/opt/arm-linux-tools/arm-linux/lib/librt.so.1
/opt/arm-linux-tools/arm-linux/lib/libpthread.so.0
/opt/arm-linux-tools/arm-linux/lib/libpthread-2.11.so
/opt/arm-linux-tools/arm-linux/lib/libstdc++.so.6
/opt/arm-linux-tools/arm-linux/lib/libstdc++.so.6.0.14

前四个文件是必须的,其他的是可选的

 

复制时可以执行下面脚本:

cp /opt/arm-linux-tools/arm-linux/lib/libc* ~/opt/tslib/lib
cp /opt/arm-linux-tools/arm-linux/lib/ld-linux* ~/opt/tslib/lib
cp /opt/arm-linux-tools/arm-linux/lib/libgcc_s* ~/opt/tslib/lib
cp /opt/arm-linux-tools/arm-linux/lib/libm* ~/opt/tslib/lib
cp /opt/arm-linux-tools/arm-linux/lib/libdl* ~/opt/tslib/lib
cp /opt/arm-linux-tools/arm-linux/lib/librt* ~/opt/tslib/lib
cp /opt/arm-linux-tools/arm-linux/lib/libpthread* ~/opt/tslib/lib
cp /opt/arm-linux-tools/arm-linux/lib/libstdc++* ~/opt/tslib/lib

 

最后要添加开发板的LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值