http://www.76ku.cn
分类: LINUX
2007-06-10 02:03:01
Building a GNU/Linux ARM Toolchain (from scratch)
建设 GNU/Linux arm 交叉编译工具(从零开始)
一 下载源文件( 或其它网站)
1.
2.
3.
4.
5.~coldwell/toolchain/ioperm.c.diff
6.
7.
8.~coldwell/toolchain/t-linux.diff 9.
二 设置环境变量及工作目录
环境变量
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
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
打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
* GNU Compiler Collection (GCC)
* GNU C Library (glibc)
* Linux kernel sources
* ARM Linux
* Atmel AT91RM9200 patches for Linux 2.6
* Atmel AT91 processors
* Software floating point in GCC wiki/Software%20floating%20point