编译工具链(GCC)建立

编译工具链(GCC)建立

1.资源包下载

1)binutils-2.17下载

http://ftp.gnu.org/gnu/

2)gcc-4.1.2、mpfr-2.4.0、gmp-4.2下载

http://ftp.gnu.org/gnu/

3)内核linux-2.6.18下载

https://www.kernel.org/pub/linux/kernel/

4)glibc-2.5下载

http://ftp.gnu.org/gnu/

2.设置编译环境变量

#!/bin/sh
PRJROOT=${PWD}

export TARGET=i486-linux-gnu
export PREFIX=${PRJROOT}/stbgcc-4.1.2
export TARGET_PREFIX=${PREFIX}/${TARGET}/sysroot/usr
export SYSROOT=${PREFIX}/${TARGET}/sysroot
export PATH=${PREFIX}/bin:${PATH}

TARGET:变量用来定义目标板的类型,以后会根据此目标板的类型来建立工具链。参看下面《体系结构和TAEGET变量的对应》。目标板的定义与主机的类型是没有关系的,但是如果更改TARGET的值,GNU工具链必须重新建立一次。

PREFIX:变量提供了指针,指向目标板工具程序将被安装的目录。

TARGET_PREFIX:变量指向与目标板相关的头文件和链接库将被安装的目录。

PATH:变量指向二进制文件(可执行文件)将被安装的目录。如果不惯用环境变量的,可以直接用绝对或相对路径。如果不用环境变量,一般都用绝对路径,相对路径有时会失败。环境变量也可以定义在.bashrc文件中,这样就不用老是export这些变量了。

体系结构和TAEGET变量的对应

体系结构                    TARGET变量的值
PowerPC                 Powerpc-linux
ARM                         arm-linux
MIPS(big endian)            mips-linux
MIPS(little endian)     mipsel-linux
MIPS64                      mips64-linux
SuperH3                 sh3-linux
SuperH4                 sh4-linux
I3(4,5,6)86             i3(4,5,6)86-linux
Ia64                        ia64-linux
M68k                        m68k-linux
M88k                        m88k-linux
Alpha                       alpha-linux
Sparc                       sparc-linux
Sparc64                 sparc64-linux

3.binutils编译

./../configure --target=${TARGET} --prefix=${PREFIX} --enable-werror=no --with-sysroot=${SYSROOT} 
make install
cd ${PREFIX}/
mkdir sysroot
mkdir sysroot/usr
mkdir sysroot/usr/include

4.编译gcc(编译静态gcc工具,用于编译glibc)

tar xjf mpfr-2.4.0.tar.bz2 
tar xjf gmp-4.2.tar.bz2
mv mpfr-2.4.0 ./gcc-4.1.2/mpfr
mv gmp-4.2 ./gcc-4.1.2/gmp
./../configure --target=$TARGET --prefix=$PREFIX --enable-languages=c --disable-threads --disable-shared --disable-libmudflap --disable-libssp --disable-decimal-float 

说明:

–disable-libmudflap:不编译边界检查函数的运行时库。(-g -fmudflap -lmudflap)

–disable-libssp:不编译保护缓冲区溢出的运行时库。

–disable-decimal-float:启用或禁用 libdecnumber 库的 C 语言十进制浮点扩展,还可以进一步选择浮点格式(bid是i386与x86_64的默认值|dpd是PowerPC的默认值)。在 PowerPC/i386/x86_64 GNU/Linux 系统默认启用,在其他系统上默认禁用。

5.获得内核linux头文件

tar xjvf linux-2.6.18.tar.bz2
make ARCH=i386 menuconfig
make include/linux/version.h
mkdir –p $TARGET_PREFIX/include
cp linux-2.6.18/include/linux/ $TARGET_PREFIX/include/ -r
cp linux-2.6.18/include/asm-i386 $TARGET_PREFIX/include/asm -r
cp linux-2.6.18/include/asm-generic $TARGET_PREFIX/include/ -r

6.编译glibc

1)解压

tar xjvf glibc-2.5.tar.bz2

2)新增链接库

cd $PREFIX/lib/gcc/i486-linux-gnu/4.1.2
ln -s libgcc.a libgcc_eh.a

3)创建config.cache配置文件

vim config.cache

config.cache配置文件内容如下:

libc_cv_forced_unwind=yes
libc_cv_c_cleanup=yes
libc_cv_arm_tls=yes

4)修改文件

主要解决增加–with-sysroot编译选项时编译gcc时链接libc libpthread找不到路径问题,具体修改如下:

修改glibc-2.5目录下的Makerule文件,具体把其中GROUP的内容修改如下:

echo 'GROUP ( /usr/lib/libc.so$(libc.so-version)' \
          '/usr/lib/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
          ' AS_NEEDED (' /usr/lib/$(rtld-installed-name) ') )' \
    ) > $@.new

修改glibc-2.5/nptl/Makefile文件,具体把其他GROUP的内容修改如下:

echo 'GROUP ( /usr/lib/libpthread.so$(libpthread.so-version)' \
          '/usr/lib/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\
          ')' \
    ) > $@.new

5)编译glibc

cd glibc-2.5
mkdir x86
CC=i486-linux-gnu-gcc ./../configure --host=$TARGET --target=$TARGET --prefix=${TARGET_PREFIX} --enable-add-ons --with-headers=${SYSROOT}/usr/include --cache-file=./../config.cache  --with-sysroot=${SYSROOT}
make  install

Linux线程模型:LinuxThreads 和 NPTL,glibc默认自带NPTL线程库,编译nptl时目标机器要求i486及其以上才可以编译通过。(参考文章:http://www.ibm.com/developerworks/cn/linux/l-threading.html

7.编译完整gcc(基于glibc)

./../configure --target=$TARGET --enable-languages=c,c++ --prefix=$PREFIX --with-local-prefix=${SYSROOT} --with-sysroot=${SYSROOT} 
make install

查看新安装gcc链接库、头文件路径:

echo 'main(){}' | i486-linux-gnu-gcc -E -v -
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值