从零开始建设交叉编译工具
时间:2007-06-10 来源:cdy_0
Building a GNU/Linux ARM Toolchain (from scratch)
建设 GNU/Linux arm 交叉编译工具(从零开始)
一 下载源文件(www.chinaunix.net 或其它网站)
1.http://ftp.gnu.org/gnu/binutils/binutils-2.16.tar.gz
2.http://ftp.gnu.org/gnu/gcc/gcc-3.4.4/gcc-3.4.4.tar.bz2
3.http://ftp.gnu.org/gnu/glibc/glibc-2.3.5.tar.gz
4.http://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.3.5.tar.gz
5.http://frank.harvard.edu/~coldwell/toolchain/ioperm.c.diff
6.http://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.10.tar.gz
7.http://maxim.org.za/AT91RM9200/2.6/2.6.10-at91.patch.gz
8.http://frank.harvard.edu/~coldwell/toolchain/t-linux.diff 9.http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3
二 设置环境变量及工作目录
环境变量
TARGET=arm-unknown-linux-gnu 生成的 arm-linux 工具的安装目录
PREFIX=/usr/arm 顶级目录
SYSROOT=${PREFIX}/sysroot
export ARCH=arm cpu系列(arm类)
export CROSS_COMPILE=${TARGET}-
export PATH=$PATH:${PREFIX}/bin 命令路径
源文件目录
mkdir -p $PREFIX/src
三 创建二进制工具
binutils是一些二进制工具的集合,其中包含了我们常用到的as和ld。
cd ${PREFIX}/src
tar xvfz binutils-2.16.tar.gz
mkdir -p BUILD/binutils-2.16
cd BUILD/binutils-2.16
../../binutils-2.16/configure --prefix=${PREFIX} --target=${TARGET} --with-sysroot=${SYSROOT} && make && make install && echo ok (如果最后一行显示 ok 则表示安装成功)
四 建立内核头文件
在这一步,内核头被安装在sysroot目录. 为处理器AT91RM9200配置内核,安装补丁。
cd ${PREFIX}/src
tar zxvf linux-2.6.10.tar.gz
ln -s linux-2.6.10 linux
zcat 2.6.10-at91.patch.gz | patch -d linux -p1
cd linux
make at91rm9200dk_defconfig
make include/linux/version.h
mkdir -p ${SYSROOT}/usr/include
cp -a ${PREFIX}/src/linux/include/linux ${SYSROOT}/usr/include/linux
cp -a ${PREFIX}/src/linux/include/asm-arm ${SYSROOT}/usr/include/asm
cp -a ${PREFIX}/src/linux/include/asm-generic ${SYSROOT}/usr/include/asm-generic
五 安装glibc头文件
cd ${PREFIX}/src
tar zxvf glibc-2.3.5.tar.gz
patch -d glibc-2.3.5 -p1 <ioperm.c.diff
cd glibc-2.3.5
tar xvfz ../glibc-linuxthreads-2.3.5.tar.gz
cd ..
mkdir -p BUILD/glibc-2.3.5-headers
cd BUILD/glibc-2.3.5-headers
../../glibc-2.3.5/configure --prefix=/usr --host=${TARGET} --enable-add-ons=linuxthreads --with-headers=${SYSROOT}/usr/include && make cross-compiling=yes install_root=${SYSROOT}
install-headers && echo ok
touch ${SYSROOT}/usr/include/gnu/stubs.h
touch ${SYSROOT}/usr/include/bits/stdio_lim.h
六 第一阶段编译器GCC
打2个补丁,用于生成所需的C运行时文件crti.o,crtn.o,及修正错误(避免内部编译器错误)。
cd ${PREFIX}/src
tar jxvf gcc-3.4.4.tar.bz2
patch -d gcc-3.4.4 -p1 < flow.c.diff
patch -d gcc-3.4.4 -p1 < t-linux.diff
mkdir -p BUILD/gcc-3.4.4-stage1
cd BUILD/gcc-3.4.4-stage1
../../gcc-3.4.4/configure --prefix=${PREFIX} --target=${TARGET} --enable-languages=c --with-sysroot=${SYSROOT} && make && make install && echo ok
七 建立GNU C 库
cd ${PREFIX}/src
mkdir -p BUILD/glibc-2.3.5
cd BUILD/glibc-2.3.5
BUILD_CC=gcc CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}ar RANLIB=${CROSS_COMPILE}ranlib AS=${CROSS_COMPILE}as LD=${CROSS_COMPILE}ld ../../glibc-2.3.5/configure --prefix=/usr --build=i386-redhat-linux --host=arm-unknown-linux-gnu --target=arm-unknown-linux-gnu --without-__thread --enable-add-ons=linuxthreads --with-headers=${SYSROOT}/usr/include && make && make install_root=${SYSROOT} install && echo ok
八 第二阶段重建GCC
利用建好的GNU C库重建编译器GCC
cd ${PREFIX}/src
mkdir -p BUILD/gcc-3.4.4
cd BUILD/gcc-3.4.4
../../gcc-3.4.4/configure --prefix=${PREFIX} --target=${TARGET} --enable-languages=c,c++ --with-sysroot=${SYSROOT} && make && make install && echo ok
九 测试
1)编写一个 HelloWorld 程序,然后 arm-unknown-linux-gnu-gcc helloworld.c -o helloworld
2)file helloworld
aa: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.0.0, dynamically linked (usesshared libs), not stripped
如果显示出上面的输出,说明你编译了一个能在 arm 体系结构下运行的 helloworld,证明你的编译工具做成功了。
(the end)
Resources
* GNU Binutils http://www.gnu.org/software/binutils/
* GNU Compiler Collection (GCC) http://gcc.gnu.org/
* GNU C Library (glibc) http://www.gnu.org/software/libc/libc.html
* Linux kernel sources http://www.kernel.org
* ARM Linux http://www.arm.linux.org.uk/
* Atmel AT91RM9200 patches for Linux 2.6 http://maxim.org.za/AT91RM9200/2.6/
* Atmel AT91 processors http://www.atmel.com/products/AT91/
* Software floating point in GCC http://gcc.gnu.org/wiki/Software%20floating%20point