编译gcc 4.7和binutil 2.22(制作独立于系统的toolchian )

首先要做一做前期的准备:
一、更新一下软件源代码:
sudo su #些时要输入用户的密码
#apt-get update
#apt-get upgrade
接下来要安装一些软件包,以满足编译的关联:
#apt-get install g++
#apt-get install gawk
#apt-get install m4
#apt-get install bison
#apt-get install gcc-multilib
-----------也可以使用下面的命令来安装上面的软件包:
#apt-get install g++ gawk m4 bison gcc-multilib
--------------
二、准备要编译的源代码。
1、gcc-4.7源代码 (下载地址是:http://gcc.gnu.org/mirrors.html)
2、准备gcc-4.7的三个关联库 mpc,mpfr,gmp
2.1版本号分别是;gmp-5.0.4.tar.bz2,mpc-0.9.tar.bz2,mpfr-3.1.0.tar.bz2
2.2关联库的下载地址分别是:
http://www.multiprecision.org/index.php?prog=mpc&page=download     ####这个是mpc的下载地址
http://www.mpfr.org/mpfr-current/                                     #####这个是mpfr的下载地址
http://gmplib.org/                                                #这个是gmp的下载地址
3、所下载得到的源代码文件放置在同一个目录中(我的是/home/sn/GCC_4.7-SRC)
三、编译源代码生成可执行的二进制文件
1、首先要编译的是三个关联的三个库
首先要做的就是得到root权限:
sudo su   #接着输入你的用户密码
下面是解压文件:
cd /home/sn/GCC_4.7-SRC   #进入放置源代码的压缩文件的目录
下面是解压各个压缩包:
tar -xjf gmp-5.0.4.tar.bz2
tar -xjf mpc-0.9.tar.bz2
tar -xjf mpfr-3.1.0.tar.bz2
tar -xjf gcc-4.7.tar.bz2

2、编译源代码
2.1编译这个gmp
mkdir /opt/GCC_4.7   #
cd gmp*
mkdir build
cd build
../configure --prefix=/opt/GCC_4.7 --build=i386-linux-gnu
make
make install

2.2编译mpfr

cd http://www.cnblogs.com/mpfr*
mkdir build
cd build
../configure --pefix=/opt/GCC_4.7 --build=i386-linux-gnu --wiht-gmp=/opt/GCC_4.7
make
make install
2.3编译这个mpc
cd http://www.cnblogs.com/mpc*

mkdir build
cd build
../ocnfigure --prefix=/opt/GCC_4.7 --build=i386-linux-gnu --with-gmp=/opt/GCC_4.7 --with-mpfr=/opt/GCC_4.7
make
make install


2.4下面是编译gcc 4.7
cd http://www.cnblogs.com/
mkdir build
在配置之前先讲解一下,要用到的配置是什么意思:
--target=   生成的目标系统   #在编译主机用的不需要配置这个
--build=    编译的机器的类型  #这个可以说是必须要修改的
--host=    主机的类型           #这个参数不需要用到
--prefix=   安装的目录           #这个一定要配置
--enable-languages=   这个是配置生成的程序,支持什么语言的编译器   #这个要配置,防止生成的文件成多。参数过多造成编译不通过
--disable-werror         这个是关闭提醒   #不一定需要。
--enable-ld=[yes,no]    这个是联合binutils编译的时候用到的。 #如果只编译这个GCC.这个可以省略
--enable-gold=[yes,no]    这个是联合binutils编译的时候用到的。 #只编译GCC 不需要用到这个。
--program-suffix=       这个是程序的后序          #为了区别与系统自带的gcc建议加上这个
--program-transform-name=   这个是用来生成个性化的 gcc 命名规则。#如果使用了这个,可以不用上面的--program-suffix 这个选项
--disable-multilib        关闭使用跨平台的库          #建设使用这个选项
-------------
下面就开始编译gcc 4.7.0

export LIBRARY_PATH=/usr/lib/i386-linux-gnu    #每执行一次export都要按运行(enter)
05 export C_INCLUDE_PATH=/usr/include/i386-linux-gnu
06 export CPLUS_INCLUDE_PATH=/usr/include/i386-linux-gnu
cd build
../gcc-4.7.0/configure --build=i386-linux-gnu --with-gmp=/opt/GCC_4.7 \
--with-mpc=/opt/GCC_4.7 --with-mpfr=/opt/GCC_4.7 --enable-languages=c,c++ \
--disable-multilib --program-transform-name='s&^&sn-linux-x86-& --enable-checking=release \
--enable-ld=yes --enable-gold=yes --prefix=/opt/GCC_4.7
make
make install

#在编译的配置参数当中我加入了:--wiht-ld=yes,--with-gold=yes
目的是用于编译后面的binutils 2.22

四、配置生成的gcc
因为在前面的配置中加入了:--program-transform-name='s&^&sn-linux-x86-&
所以我生成的gcc是:
sn-lnux-x86-gcc
g++:sn-linux-x86-g++
因为我学的是C语言,所以我做的主要测试是GCC

1.把sn-linux-x86-gcc加入到环境变量中:
修改的系统配置文件是:/etc/profile
加入以下的参数:
export PATH=$PATH:/opt/GCC_4.7/bin
sudo gedit /etc/profile         #打开这个profile文件
加入 export PATH=$PATH:/opt/GCC_4.7/bin 到文件的最后一行去。

保存修改。
再用下面的命令使修改生效:
source /etc/profile
-----------------------
1.1检查一下,gcc 4.7搜查共享库和静态库的目录
sn-linux-x86-gcc -print-search-dirs
在显示的内容中有一个是:
######库:/lib/i386-linux-gnu/4.7.0:.........
这个是第一个搜索的目录:
所以要做的就是把这个/usr/lib/i386-linux-gnu目录的内容连接到这个/lib/i386-linux-gnu/4.7.0。
sudo ln -s /usr/lib/i386-linux-gnu /lib/i386-linux-gnu/4.7.0
-----------------------
2.正式测试生成的gcc 4.7
cd /home/sn   #回到主目录去
touch makefile   #生成一个makefile
touch hello.c    #生成一个hello.c文件

makefile与hello.c的内容分别如下:
/*hello.c */
#include <stdio.h>
int main()
  {
  printf("hello GCC_4.7\n");
  return 0;
  }
 
---------makefile---------#在这个makefile中,‘#’做为注释用的。
#makefile for test gcc 4.7
#create by sn
CCOMPILER=sn-linux-x86-
CC = $(CCOMPILE)gcc
#LD = $(CCOMPILER)ld  #由于没有用生成的gcc 4.7来编译这个binutils 2.22所以这个选项行先不用管
CFLAGS = -g -O2
EXEC = hello
OBJ = $(EXEC).o
SRC = $(EXEC).c
.PHONY:all clean
all:hello
$(EXEC):$(OBJ)
 $(CC) $(CFLAGS) -o $@ $<   #此行的开始处,是一个[TAB]键
$(OBJ):$(SRC)
 $(CC) $(CFLAGS) -c $<   #此行的开始处,是一个[TAB]键
 
clean:
 $(RM) $(EXEC) $(OBJ) #此行的开始处,是一个[TAB]键
 
-----------------------------end of makefile----------------

把上面的内容保存为文件。
在终端输入make       #当没有错误提示的时候就成功了。
输出的结果应该是:
sn-linux-x86-gcc -g -O2 -o hello hello.c
sn-linux-x86-gcc -g -O2 -c hello.c
------
./hello    #运行刚刚编译好的hello
#hello GCC_4.7
------------


五、用生成的gcc 4.7编译binutils 2.22,
作用是生成的ld 将会与gcc 4.7相连接,从而可以代表机器上的ld
这个binutils 2.22
可以到以下的网页下载:
ftp://ftp.gnu.org/gnu/binutils/   
下载得到的文件是binutils-2.22.tar.bz2
把这个文件从下载目录复制到/home/sn/GCC-4.7-SRC目录中去
cd /home/sn/GCC_4.7-SRC   #进入源代码目录
tar -xjf binutils-2.22.tar.bz2     #解压
cd binutils*     #进入binutils源代码的目录
mkdir build
cd build
../configure --build=i386-linux-gnu --prefix=/opt/GCC_4.7 --enable-ld=yes --enable-gold=yes \
--with-gmp=/opt/GCC_4.7 --wiht-mpfr=/opt/GCC_4.7 --wiht-mpc=/opt/GCC_4.7 \
disable-werror CC=sn-linux-x86-gcc CXX=sn-linux-x86-g++ \
--program-transform=name='s&^&sn-linux-x86-&' 
make
make install
--------------------
编译这个binutils 2.22大概需要10分钟左右。或者二三分钟就行了。
在make install 后
会在/opt/GCC_4.7/bin目录下面生成
as,ld,strip,string等汇编程序
前序是
sn-linux-x86-

下面就来重写刚刚的makefile

---------makefile---------#在这个makefile中,‘#’做为注释用的。
#makefile for test gcc 4.7
#create by sn
CCOMPILER=sn-linux-x86-
CC = $(CCOMPILE)gcc
LD = $(CCOMPILER)ld  #这个选项现在可以使用了。
CFLAGS = -g -O2
EXEC = hello
OBJ = $(EXEC).o
SRC = $(EXEC).c
.PHONY:all clean
all:hello
$(EXEC):$(OBJ)
 $(CC) $(CFLAGS) -o $@ $<   #此行的开始处,是一个[TAB]键
$(OBJ):$(SRC)
 $(CC) $(CFLAGS) -c $<   #此行的开始处,是一个[TAB]键
 
clean:
 $(RM) $(EXEC) $(OBJ) #此行的开始处,是一个[TAB]键
 
-----------------------------end of makefile----------------

编译完成后
clear   #清屏一下。
cd /home/sn   #再次回到主目录
make clean    #清理一下刚刚编译生成的hello 和hello.o
make         #这次使用的是真正意义上的ld 2.22了


----------------教程到此结束了。------------------
本次教程是基于ubuntu 12.04 32 bit

posted @ 2012-06-08 19:22  sndnvaps  阅读(3998)  评论(1编辑  收藏  举报