編譯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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM