前文「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