S3C6410交叉编译工具链的制作过程
环境: Ubuntu9.10, with kernel 2.6.31-14-generic SMP Inter Core^2 T6600
工具 : GCC 4.4.1(Ubuntu 4.4.1-4ubuntu9), binutils 2.20, glibc 2.10, make 3.81 automake 1.11, autoconf 2.64, flex 2.5.35, bison 2.4.1
源码: linux kernel 2.6.39.2, binutils 2.21, gcc 4.6.0, glibc 2.13, glibc-ports 2.13, gmp 5.0.2, mpfr 3.0.1, mpc 0.8.2
以下所有内容为第2步中install.sh文件中的内容,可以拷贝到文件中配置好以下环境直接运行,获得交叉编译工具链
#!/bin/sh
#1.获取源码
#进入http://www.kernel.org,下载linux kernel 2.6.39.2
#进入http://ftp.gnu.org/gnu,下载binutils 2.21, gcc 4.6.0, glibc 2.13, glibc-ports 2.13, gmp 5.0.2, mpfr 3.0.1, mpc 0.8.2
#2.建立工作目录,install.sh文件为automatic script
cd /home/stu/tools/eabi
mkdir build src tar
touch install.sh
#把第一步中下载的源代码放入tar目录中
#3.解压源代码(有关gmp、mpfr、mpc压缩包的说明请查看gcc编译配置说明和三个压缩包的说明)
cd tar
tar xjvf linux-2.6.39.2.tar.bz2 -C /home/stu/tools/eabi/src
tar xjvf binutils-2.21.tar.bz2 -C /home/stu/tools/eabi/src
tar xjvf gcc-4.6.0.tar.bz2 -C /home/stu/tools/eabi/src
tar xjvf glibc-2.13.tar.bz2 -C /home/stu/tools/eabi/src
tar xjvf glibc-ports-2.13.tar.bz2 -C /home/stu/tools/eabi/src
tar xjvf gmp-5.0.2.tar.bz2 -C /home/stu/tools/eabi/src
tar xjvf mpfr-3.0.1.tar.bz2 -C /home/stu/tools/eabi/src
tar xjvf mpc-0.8.2.tar.bz2 -C /home/stu/tools/eabi/src
mv /home/stu/tools/eabi/src/gmp-5.0.2 /home/stu/tools/eabi/src/gcc-4.6.0/gmp
mv /home/stu/tools/eabi/src/mpfr-3.0.1 /home/stu/tools/eabi/src/gcc-4.6.0/mpfr
mv /home/stu/tools/eabi/src/mpc-0.8.2 /home/stu/tools/eabi/src/gcc-4.6.0/mpc
mv /home/stu/tools/eabi/src/glibc-ports-2.13 /home/stu/tools/eabi/src/gcc-4.6.0/glibc-2.13/ports
cd -
#4.全局环境设置
export PROROOT=/home/stu/tools/eabi
export TARGET=arm-abzc-linux-gnueabi
export PREFIX=/opt/ZC6410/toolschain/4.6.0
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH
#(编译步骤按顺序bintuils、gcc、linux-headers、glibc、gcc)
#5.编译binutils(在$PROROOT目录下)
mkdir build/build-bintuils
cd build/build-binutils
# --target arm-abzc-linux-gnueabi,其中abzc为vendor,含义是安博中程科技有限公司,gnueabi必须加,文档中有说明
# --prefix make install根目录
# --disable-nls disable native language support
# 配置选项很重要,有些配置是默认选择和不选择的,不一一列举,请./configure --help查看需要的配置选项
../../src/binutils-2.21/configure --target=$TARGET --prefix=$PREFIX --disable-nls
make configure-host
make 2>&1 | tee make.out
make install
cd -
#6.编译gcc(没有abi的支持,编译出来的gcc可以通过-nostdlib等选项编译bootloader、linux kernel等无需库支持的源码)
#此步骤目的是为了编译后面的glibc做准备
mkdir build/build-gcc
cd build/build-gcc
# --with-sysroot 告诉GCC把此选项指定的目录包括子目录作为目标系统的根文件系统
# --without-headers 在编译glibc动态库文件libc.so...的时候打开
# --with-newlib 生成libgcc.a作为C库使用
# --disable-libgomp 不用生成运行库libgomp
# --disable-libmudflap 不用生成运行库libgomp --disable-libmudflap --disable-libssp 同理
# --disable-shared 不生成动态库,只生成静态库文件作为编译用
# --disable-threads 不对系统做特殊支持,相当于--enable-threads=single
# --enable-languages=c 编译生成支持c的编译器
../../src/gcc-4.6.0/configure --target=$TARGET --with-sysroot=$TARGET_PREFIX/sysroot --prefix=$PREFIX --without-headers --with-newlib --disable-nls --disable-libgomp --disable-libmudflap --disable-libssp --disable-shared --disable-threads --enable-languages=c
make all-gcc all-target-libgcc 2>&1 | tee make.out
make install-gcc install-target-libgcc
cd -
#because of "--disable-shared", this file is needed by libgcc_eh.a
cd $PREFIX/lib/gcc/$TARGET/4.6.0
ln -s libgcc{,_eh}.a
cd -
#7.编译glibc所需要的内核库文件
cd /home/stu/tools/eabi/src/linux-2.6.39.2
make mrproper
make ARCH=arm headers_check
make ARCH=arm INSTALL_HDR_PATH=$TARGET_PREFIX headers_install
cd -
8.编译glibc(libc.so...)
mkdir build/build-glibc
cd build/build-glibc
# --enable-add-ons 如果选项后面不赋值,默认编译源代码所有的子目录
# --enable-kernel=2.6.28 这个选项只用在编译GNU/linux当中有用,表示支持的内核最小版本
# --disable-profile 不编译一些介绍信息
# --with-tls 对一些兼容性问题的检查支持
# --with-headers 系统头文件路径
# libc_cv_forced_unwind=yes nptl支持
# libc_cv_c_cleanup=yes nptl支持
../../src/glibc-2.13/configure --host=$TARGET --prefix=$TARGET_PREFIX/sysroot --enable-add-ons --enable-kernel=2.6.28 --disable-profile --with-tls --with-headers=$TARGET_PREFIX/usr/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
make 2>&1 | tee make.out
make install
cd -
9.编译完整gcc(support c and c++)
mkdir build/build-fullgcc
cd build/build-fullgcc
# 此配置为针对特定CPU,体现在--with-cpu=arm1176jzf-s --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp
# 其余选项以上配置中大多已说明,其余小部分无需解释,通过./configure --help查明含义
../../src/gcc-4.6.0/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ --disable-multilib --with-cpu=arm1176jzf-s --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp --with-bugurl=eabi010@gmail.com --enable-__cxa_atexit --disable-libmudflap --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --with-local-prefix=$TARGET_PREFIX/sysroot --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long
make 2>&1 | tee make.out
make install
cd -
10.测试
echo 'int main(){printf("hello, __eabi\n");return 0;}' > test.c
arm-abzc-linux-gnueabi-gcc test.c
arm-abzc-linux-gnueabi-objdump -x a.out
有问题发送邮件:eabi010@gmail.com或留言