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

转载于:https://my.oschina.net/u/3686604/blog/1538505

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值