編譯gcc-4.6.3

編譯gcc-4.6.3

準備

  1. 下載GCC 源碼包 : gcc-4.6.3.tar.bz2

  2. 下載GCC 依賴包: gmp-5.0.4.tar.bz2, mpfr-3.1.0.tar.bz2 ,mpc-0.9.tar.gz

  3. 解壓gcc-4.6.3.tar.bz2 指令=》 [flydream@flydream opt]$ tar -xvf gcc-4.6.3.tar.bz2

  4. 進入[flydream@flydream opt]$ cd gcc-4.6.3

  5. 把下載的gmp-5.0.4.tar.bz2, mpfr-3.1.0.tar.bz2 ,mpc-0.9.tar.gz包放到gcc-4.6.3目錄

  6. 在gcc-4.6.3目錄下分別解壓上面的三個包

編譯依賴

先安裝gmp-5.0.4.tar.bz2

# 進入gmp目錄:
$ cd gmp-5.0.4

# 建立安裝路徑: 
$ mkdir gmp_install
$ cd gmp_install

$ ../configure --prefix=/opt/gcc-4.6.3/gmp-5.0.4/gmp_install
$ make 
$ make install

安裝mpfr-3.1.0.tar.bz2

# 進入mpfr目錄
$ cd mpfr-3.1.0

# 建立安裝路徑: $ 
$ mkdir mpfr_install
$ cd mpfr_install

$ ../configure --prefix=/opt/gcc-4.6.3/mpfr-3.1.0/mpfr_install --with-gmp=/opt/gcc-4.6.3/gmp-5.0.4/gmp_install
$ make 
$ make install

然后安裝mpc-0.9.tar.gz

# 進入mpc
# 建立安裝路徑: 
$ mkdir mpc_install
cd mpc_install

$ ../configure --prefix=/opt/gcc-4.6.3/mpc-0.9/mpc_install --with-gmp=/opt/gcc-4.6.3/gmp-5.0.4/gmp_install  --with-mpfr=/opt/gcc-4.6.3/mpfr-3.1.0/mpfr_install
$ make 
$ make install

在編譯GCC的過程中可能出現“configure: error: cannot compute suffix of object files: cannot compile”的錯誤,解決方法是:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc-4.6.3/mpc-0.9/mpc_install/lib:/opt/gcc-4.6.3/gmp-5.0.4/gmp_install/lib:/opt/gcc-4.6.3/mpfr-3.1.0/mpfr_install/lib

最后編譯安裝GCC

在GCC源碼目錄中建立安裝路徑

$ mkdir gcc_install
$ cd gcc_install

$ ../configure --prefix=/opt/gcc_install --with-gmp=/opt/gcc-4.6.3/gmp-5.0.4/gmp_install  --with-mpfr=/opt/gcc-4.6.3/mpfr-3.1.0/mpfr_install ----with-mpc=/opt/gcc-4.6.3/mpc-0.9/mpc_install --enable-checking=release --program-suffix=4.6.3 --enable-languages=c,c++ 
$ make 
$ make install

注意–program-suffix參數,表示生成的可執行文件的后綴。–enable-languages參數表示要支持的語言。最后make; make install即可。make的時候還有個小技巧:因為gcc文件很多,編譯很慢,可以使用make -j N參數,開啟多線程編輯。其中N值可以設定為機器CPU核數x2。

編譯好了之后就可以使用/opt/gcc-4.6.3/bin/gcc-4.6.3來編譯c程序了。為了使用方便,可以將/opt/gcc-4.6.3/bin/gcc-4.6.3/bin放到系統PATH中:

export PATH=$PATH:/opt/gcc-4.6.3/bin/gcc-4.6.3/bin

構建arm-linux-gnueabi-gcc-4.6.3交叉編譯鏈

準備工作

1、準備文件

binutils-2.22.tar.bz2

gcc-4.6.3.tar.bz2

glibc-2.14.1.tar.xz

glibc-ports-2.14.1.tar.gz

glibc-linuxthreads-2.5.tar.bz2

gdb-7.4.1.tar.bz2

Linux-2.6.38.8.tar.bz2

mpfr-3.1.1.tar.bz2

mpc-1.0.1.tar.gz

gmp-5.1.0.tar.bz2

2、建立以下變量,方便稍候的輸入

$ vim ~/.bashrc
export TARGET=arm-linux-gnueabi
export PREFIX=/usr/local/arm-linux-gcc/4.6.3
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PATH:$PREFIX/bin

3、為宿主機安裝mpfr、mpc、gmp

$ tar -xvf gmp-5.1.0.tar.bz2
$ cd gmp-5.1.0
$ mkdir build
$ cd build
$ ../configure
$ make all -j4
$ make install
$ tar -xvf mpfr-3.1.1.tar.bz2
$ cd mpfr-3.1.1
$ mkdir build
$ cd build
$ ../configure
$ make all -j4
$ make install
$ tar -xvf mpc-1.0.1.tar.gz
$ cd mpc-1.0.1
$ mkdir build
$ cd build
$ ../configure
$ make all -j4
$ make install

4、復制linux-kernel-headers

$ tar -xvf linux-2.6.38.8.tar.bz2
$ cd linux-2.6.38.8
$ make include/linux/version.h
#  CHK     include/linux/version.h
#  UPD     include/linux/version.h
$ mkdir -p $TARGET_PREFIX/include
$ cp -r ./include/linux/ $TARGET_PREFIX/include
$ cp -r ./include/asm-generic/ $TARGET_PREFIX/include
$ cp -r ./arch/arm/include/asm/ $TARGET_PREFIX/include

二、編譯binutils

$ tar -xvf binutils-2.22.tar.bz2
$ cd binutils-2.22
$ mkdir build
$ cd build
$ ../configure --prefix=$PREFIX --target=$TARGET
$ make all -j4
$ make install

三、初步編譯gcc(不帶glibc支持)

$ tar -xvf gcc-4.6.3.tar.bz2

重新解壓mpfr-3.1.1.tar.bz2、mpc-1.0.1.tar.gz、gmp-5.1.0.tar.bz2,并改名復制至gcc-4.6.3中

$ rm -rf mpfr-3.1.1 mpc-1.0.1  gmp-5.1.0
$ tar -xvf gmp-5.1.0.tar.bz2
$ mv gmp-5.1.0 gmp
$ mv ./gmp ./gcc-4.6.3
$ tar -xvf mpfr-3.1.1.tar.bz2
$ mv mpfr-3.1.1 mpfr
$ mv ./mpfr ./gcc-4.6.3
$ tar -xvf mpc-1.0.1.tar.gz
$ mv mpc-1.0.1 mpc
$ mv ./mpc ./gcc-4.6.3
$ cd gcc-4.6.3
$ 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
$ make all-gcc -j4
$ make install-gcc
$ make all-target-libgcc -j4
$ make install-target-libgcc

四、編譯glibc

$ tar -xvf glibc-2.14.1.tar.xz
$ tar -xvf glibc-ports-2.14.1.tar.gz
$ mv glibc-ports-2.14.1 ports
$ mv ./ports/ ./glibc-2.14.1
$ tar -xvf glibc-linuxthreads-2.5.tar.bz2 --directory=./glibc-2.14.1
$ cd glibc-2.14.1
$ mkdir build
$ cd build
$ CC=$TARGET-gcc
$ ln -s /usr/local/arm-linux-gcc/4.6.3/lib/gcc/arm-linux-gnueabi/4.6.3/libgcc.a /usr/local/arm-linux-gcc/4.6.3/lib/gcc/arm-linux-gnueabi/4.6.3/libgcc_eh.a

創建config.cache配置文件

$ vim config.cache
    libc_cv_forced_unwind=yes
    libc_cv_c_cleanup=yes
    libc_cv_arm_tls=yes
    
$  ../configure --host=$TARGET --target=$TARGET --prefix=$TARGET_PREFIX --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin --with-headers=$TARGET_PREFIX/include
$ make all -j4
$ make install

五、重新編譯gcc

$ cd gcc-4.6.3/build/
$ rm -rf *
$ ../configure --prefix=$PREFIX --target=$TARGET --enable-shared --enable-languages=c,c++
$ make all -j4
$ make install

六、編譯gdb

$ tar -xvf gdb-7.4.1.tar.bz2 
$ ../configure --prefix=$PREFIX --target=$TARGET
$ make all -j4
$ make install

七、創建鏈接

$ cd $PREFIX/bin
$ ln -s arm-linux-gnueabi-addr2line arm-linux-addr2line
$ ln -s arm-linux-gnueabi-ar arm-linux-ar
$ ln -s arm-linux-gnueabi-as arm-linux-as
$ ln -s arm-linux-gnueabi-c++ arm-linux-c++
$ ln -s arm-linux-gnueabi-C++filt arm-linux-c++filt
$ ln -s arm-linux-gnueabi-cpp arm-linux-cpp
$ ln -s arm-linux-gnueabi-elfedit arm-linux-elfedit
$ ln -s arm-linux-gnueabi-g++ arm-linux-g++
$ ln -s arm-linux-gnueabi-gcc arm-linux-gcc
$ ln -s arm-linux-gnueabi-gcc-4.6.3 arm-linux-gcc-4.6.3
$ ln -s arm-linux-gnueabi-gcov arm-linux-gcov
$ ln -s arm-linux-gnueabi-gdb arm-linux-gdb
$ ln -s arm-linux-gnueabi-gdbtui arm-linux-gdbtui
$ ln -s arm-linux-gnueabi-gprof arm-linux-gprof
$ ln -s arm-linux-gnueabi-ld arm-linux-ld
$ ln -s arm-linux-gnueabi-ld.bfd arm-linux-ld.bfd
$ ln -s arm-linux-gnueabi-nm arm-linux-nm
$ ln -s arm-linux-gnueabi-objcopy arm-linux-objcopy
$ ln -s arm-linux-gnueabi-objdump arm-linux-objdump
$ ln -s arm-linux-gnueabi-ranlib arm-linux-ranlib
$ ln -s arm-linux-gnueabi-readelf arm-linux-readelf
$ ln -s arm-linux-gnueabi-run arm-linux-run
$ ln -s arm-linux-gnueabi-size arm-linux-size
$ ln -s arm-linux-gnueabi-strings arm-linux-strings
$ ln -s arm-linux-gnueabi-strip arm-linux-strip

最近想用gcc來dump一些信息出來,比如說文件依賴關系,ast。google了一下,有兩種方法:hack跟plugin。codeviz是通過修改gcc3.4.6來dump出函數調用關系,而VCG是gcc的一個插件,用來可以用來分析控制流圖,函數調用圖等諸多信息。但gcc是到4.5之后才支持plugin的機制,我機器版本太低,下了gcc4.7.1(各版本的地址http://ftp.gnu.org/gnu/gcc/),根據官方建議,新建一個目錄用于編譯,因gcc的make里面,沒有clean,不過對我們編譯其他開源項目同樣有用:ls的時候比較干凈:)。

下載依賴庫:

GNU Multiple Precision Library (GMP) version 4.3.2 (or later)
Necessary to build GCC. If a GMP source distribution is found in a subdirectory of your GCC sources named gmp, it will be built together with GCC. Alternatively, if GMP is already installed but it is not in your library search path, you will have to configure with the --with-gmp configure option. See also --with-gmp-lib and --with-gmp-include.
MPFR Library version 2.4.2 (or later)
Necessary to build GCC. It can be downloaded from http://www.mpfr.org/. If an MPFR source distribution is found in a subdirectory of your GCC sources named mpfr, it will be built together with GCC. Alternatively, if MPFR is already installed but it is not in your default library search path, the --with-mpfr configure option should be used. See also --with-mpfr-lib and --with-mpfr-include.
MPC Library version 0.8.1 (or later)
Necessary to build GCC. It can be downloaded from http://www.multiprecision.org/. If an MPC source distribution is found in a subdirectory of your GCC sources named mpc, it will be built together with GCC. Alternatively, if MPC is already installed but it is not in your default library search path, the --with-mpc configure option should be used. See also --with-mpc-lib and --with-mpc-include.
ftp://gcc.gnu.org/pub/gcc/infrastructure下載并按上述順序編譯。

設置環境變量LD_LIBRARY_PATH,包含上述3個庫下的lib目錄(重要!)否則會出現如cannot comput subfix(.o)等問題。

$ ../gcc-4.7.1/configure --prefix=/home/changweiwu/usr --with-gmp=/home/changweiwu/usr/ --with-mpfr=/home/changweiwu/usr --with-mpc=/home/changweiwu/usr/ --enable-languages=c,c++

以上在suse的機器上編譯通過,但在ubuntu下會有下述問題,需要進行設置頭文件、庫文件搜索路徑:

ISSUE#1
checking for suitable m4... configure: error: No usable m4 in $PATH or /usr/5bin (see config.log for reasons).
Solution:

$ sudo apt-get install m4

ISSUE#2
In file included from /usr/include/stdio.h:28:0,
from ../../../../gcc-4.7.0/libgcc/../gcc/tsystem.h:88,
from ../../../../gcc-4.7.0/libgcc/libgcc2.c:29:
/usr/include/features.h:324:26: fatal error: bits/predefs.h: No such file or directory
compilation terminated.
make[5]: *** [_muldi3.o] Error 1
Analysis:
Use 'locate bits/predefs.h' to find the path of this header. (in '/usr/include/x86_64-Linux-gnu')
Solution:
#export C_INCLUDE_PATH=/usr/include/i386-linux-gnu && export CPLUS_INCLUDE_PATH=$C_INCLUDE_PATH
ISSUE#3
In file included from /usr/include/features.h:389:0,
from /usr/include/stdio.h:28,
from ../../../../gcc-4.7.0/libgcc/../gcc/tsystem.h:88,
from ../../../../gcc-4.7.0/libgcc/libgcov.c:29:
/usr/include/i386-linux-gnu/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory
compilation terminated.
make[5]: *** [_gcov.o] Error 1
Analysis:
Related to libc multilib, disable it with '--disable-multilib' should work.
Solution:
add '--disable-multilib' and 'configure' again, then run 'make'.
ISSUE#4
/usr/bin/ld: cannot find crti.o: No such file or directory
collect2: error: ld returned 1 exit status
make[3]: *** [libgcc_s.so] Error 1
make[3]: *** Waiting for unfinished jobs....
Analysis:
Use 'locate crti.o' to find this file. (in '/usr/lib/i386-linux-gnu/crti.o') Set LIBRARY_PATH (LDFLAGS)
Solution:
#export LIBRARY_PATH=/usr/lib/i386-linux-gnu
make && make install

http://blog.csdn.net/logicouter/article/details/7776507

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,250評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,923評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,041評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,475評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,253評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,801評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,882評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,023評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,530評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,494評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,639評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,177評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,890評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,289評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,552評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,242評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,626評論 2 370

推薦閱讀更多精彩內容