编译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