1准备源码包
1.1 binutils-2.22
GNU binutils是一组二进制工具集
1.2 gcc-4.7.2
1.3 gmp-5.0.5
GMP是一个免费的库,用于任意精度的算术运算,操作有符号整数、有理数和浮点数。除了在GMP机器上运行的可用内存所暗示的精度外,对精度没有实际的限制。GMP具有丰富的功能集合,功能之间有规则的接口。
GMP的主要目标应用是密码学应用和研究、互联网安全应用、代数系统、计算代数研究等。
1.4 mpfr-3.1.1
MPFR库是一个用于具有正确舍入的多精度浮点计算的C库。MPFR一直得到INRIA的支持,目前的主要作者分别来自法国洛里亚(Nancy)和法国里昂(Lyon)的Caramba和AriC项目团队;详情请见信用页面。MPFR是基于GMP多精度库。
MPFR的主要目标是为多精度浮点计算提供一个库,它既高效又具有良好定义的语义。它复制了ANSI/IEEE-754标准中关于双精度浮点运算(53位有效)的好思想。
1.5mpc-1.0.1
GNU MPC是一个C库,用于计算任意精度的复数和结果的正确舍入。它将IEEE-754标准的固定精度实数浮点数的原则扩展到复数,为每个操作提供定义良好的语义。
1.6 glibc-2.16.0
1.7 glibc-linuxthreads-2.5
1.8 glibc-ports-2.16.0
1.9一份内核源码
内核源码我使用的是linux.3.10
为了方便,把这些源码包都放在这个链接下面:
2 设置环境变量
export TARGET=arm-linux-gnueabi
export PREFIX=/home/lu/tool_chain/cross/gcc-4.7.2/$TARGET
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH
编译下面的软件的时候,要严格按照顺序来编译,不然会报错。上面的TARGET是不能随便改的,只有有限的几种可以选择,不然后面会出现莫名其妙的错误。
3. 编译binutils
tar -xzf binutils-2.22.tar.gz
mkdir binutils-build
cd binutils-build
../binutils-2.22/configure --target=$TARGET --prefix=$PREFIX
make -j2
make install
4 第一次编译gcc(不带glibc支持)
4.1 安装gmp
先安装gmp-5.0.4.tar.bz2
进入gmp目录:cd gmp-5.0.4
建立编译路径: mkdir gmp_install
cd gmp_install
../configure --prefix=/home/lu/tool_chain/cross/gcc-4.7.2/gmp
make
make install
编译gmp的时候,如果出现如下错误:
checking for suitable m4... configure: error: No usable m4 in $PATH or /usr/5bin (see config.log for reasons).
可以在ubunt软件中心安装m4
4.2 安装mpfr
cd mpfr-3.1.0
建立编译路径: mkdir mpfr_install
cd mpfr_install
../configure --prefix=/home/lu/tool_chain/cross/gcc-4.7.2/mpfr --with-gmp=/home/lu/tool_chain/cross/gcc-4.7.2/gmp
make
make install
4.3 安装mpc
进入mpc
建立编译路径: mkdir mpc_install
cd mpc_install
../configure --prefix=/home/lu/tool_chain/cross/gcc-4.7.2/mpc --with-gmp=/home/lu/tool_chain/cross/gcc-4.7.2/gmp --with-mpfr=/home/lu/tool_chain/cross/gcc-4.7.2/mpfr
make
make install
4.4 最后编译gcc
编译gcc的时候,一定需要注意的是,不要在源码目录下面直接编译,不然可能会出现各种莫名其妙的错误。
cd gcc-4.7.2
mkdir build
cd build
../configure --prefix=$PREFIX --target=$TARGET --without-headers --enable-languages=c --disable-threads --with-newlib --disable-shared --disable-libmudflap --disable-libssp --disable-decimal-float --with-gmp=/home/lu/tool_chain/cross/gcc-4.7.2/gmp --with-mpfr=/home/lu/tool_chain/cross/gcc-4.7.2/mpfr --with-mpc=/home/lu/tool_chain/cross/gcc-4.7.2/mpc
make all-gcc -j4
make install-gcc
make all-target-libgcc -j4
make install-target-libgcc
如果make all-target-libgcc -j4出现如下错误
../../../libgcc/libgcc2.c:149:1: internal compiler error: Segmentation fault
解决:
修改gcc/ira-int.h文件:
把
static inline bool
ira_allocno_object_iter_cond (ira_allocno_object_iterator *i, ira_allocno_t a,
ira_object_t *o)
{
*o = ALLOCNO_OBJECT (a, i->n);
return i->n++ < ALLOCNO_NUM_OBJECTS (a);
}
修改为
static inline bool
ira_allocno_object_iter_cond (ira_allocno_object_iterator *i, ira_allocno_t a,
ira_object_t *o)
{
int n = i->n++;
if (n < ALLOCNO_NUM_OBJECTS (a))
{
*o = ALLOCNO_OBJECT (a, n);
return true;
}
return false;
}
5 安装内核头文件
tar -xjf linux-3.10.tar.bz2
cd linux-3.10
make ARCH=arm headers_check
make ARCH=arm INSTALL_HDR_PATH=dest headers_install
sudo cp -rv dest/include/* $PREFIX/$TARGET/include
注意:内核头文件的安装位置是$PREFIX/$TARGET/include,而不是$PREFIX
6 编译c库
tar -xf glibc-2.16.0.tar.xz
tar -xjf glibc-linuxthreads-2.5.tar.bz2 -C glibc-2.16.0
tar -xf glibc-ports-2.16.0.tar.xz
mv glibc-ports-2.16.0 glibc-2.16.0/ports
mkdir glibc-build
cd glibc-build
CC=$TARGET-gcc
ln -s /home/lu/tool_chain/cross/gcc-4.7.2/arm-linux-gnueabi/lib/gcc/arm-linux-gnueabi/4.7.2/libgcc.a /home/lu/tool_chain/cross/gcc-4.7.2/arm-linux-gnueabi/lib/gcc/arm-linux-gnueabi/4.7.2/libgcc_eh.a
../configure --host=$TARGET --target=$TARGET --prefix=$TARGET_PREFIX --enable-add-ons --with-tls --disable-profile --with-binutils=$PREFIX/bin --with-headers=$TARGET_PREFIX/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_arm_tls=yes
make all -j4
make install
如果build的时候遇到如下错误:
scripts/gen-sorted.awk: line 19: regular expression compile failed (bad class -- [], [^] or [)
需要安装gawk
apt-get install gawk
7 编译完整的gcc
把上面的CC变量设置为
export CC=gcc
../configure --host=$TARGET --prefix=$PREFIX --target=$TARGET --enable-shared --enable-languages=c --disable-sjlj-exceptions --with-gmp=/home/lu/tool_chain/cross/gcc-4.7.2/gmp --with-
mpfr=/home/lu/tool_chain/cross/gcc-4.7.2/mpfr --with-mpc=/home/lu/tool_chain/cross/gcc-4.7.2/mpc
make -j2
sudo make install
本文主要参考下面两篇文章:
https://blog.csdn.net/linuxarmsummary/article/details/8545968