在 CentOS 上构建 gcc-4.3.6

起因:在看《深入理解Java虚拟机 JVM高级特性与最佳实践(第2版)》这本书的时候,需要构建 OpenJDK7u6b21,虽然之前成功构建了 OpenJDK8,但由于与书中版本不符,目录结构不一致,导致无法顺利按照书中内容进行 JVM 调试,所以决定严格按照书中版本进行构建。于是用 Mercurial 拉了 OpenJDK7u6b21 源文件,根据源文件中 README-builds.html 中的要求,需要用到 gcc-4.3。根据以往的经验,如果不严格按照文档中各个工具的版本进行操作,之后多半会出现各种问题,而我系统上的 gcc 是 4.8.5 版本的,于是决定重新安装 gcc-4.3,在安装过程中遇到不少问题,这里归总一下分享出来,愿帮助到更多人

用 yum 或者其他自动化方式安装的 gcc 都不是 4.3 版本的,所以只能用源码来构建

我的操作系统:阿里云上的 CentOS

1. 安装 wget

yum install wget

2. 安装 gcc。因为构建 gcc-4.3 过程中要用到 gcc 自己,所以先用自动化的方式安装一个其他版本的 gcc

yum install gcc

3. 安装 bzip2。为了解压 .bz2 类型的文件

yum -y install bzip2

4. 编译安装 gcc 需要的依赖 gmp-6.1.0、mpfr-3.1.4、mpc-1.0.3,这些包的版本也是按照网站文档上对应版本来的

4.1 安装 gmp-6.1.0。依次执行以下命令,没有 /download 目录就先创建一个

cd /download/
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2
tar -jxvf gmp-6.1.0.tar.bz2
cd gmp-6.1.0/
./configure --prefix=/usr/
sudo make
make check
sudo make install

4.2 安装 mpfr-3.1.4。命令行添加的环境变量 LD_LIBRARY_PATH 只会在本次 session 中有效,必须在同一个 session 中安装 mpfr,因为 mpfr 会用到这个环境变量

export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
cd /download/
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2
tar -jxvf mpfr-3.1.4.tar.bz2
cd mpfr-3.1.4/
./configure --prefix=/usr/ --with-gmp-include=/usr/include --with-gmp-lib=/usr/lib
sudo make
make check
sudo make install

4.3 安装 mpc-1.0.3

cd /download/
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz
tar -zxvf mpc-1.0.3.tar.gz
cd mpc-1.0.3/
./configure --prefix=/usr/
sudo make
make check
sudo make install

5. 安装 texinfo-4.13。查看 texinfo 版本是不是 4.13,如果版本高了在构建 gcc 时可能会报错。建议如果版本不是 4.13 就卸载后重新安装吧,等到构建 gcc 报错时再解决就麻烦了,那时候你也无法第一时间想到是 texinfo 版本的问题

5.1 安装 ncurses-5.7。查看 ncurses 版本是不是 5.7,如果版本高了在构建 texinfo-4.13 时可能会报错。同样,如果版本不是 5.7 都建议重新安装

5.1.1 安装 glibc-static。构建 ncurses-5.7 时需要 glibc-static

yum install glibc-static

5.1.2 卸载、下载、构建并安装  ncurses-5.7

yum remove ncurses
cd /download/
wget http://ftp.gnu.org/gnu/ncurses/ncurses-5.7.tar.gz
tar -zxvf ncurses-5.7.tar.gz
./configure --without-cxx-binding
sudo make
sudo make install

5.2 卸载、下载、构建并安装  texinfo-4.13

yum remove texinfo
cd /download/
wget http://ftp.gnu.org/gnu/texinfo/texinfo-4.13a.tar.gz
tar -zxvf texinfo-4.13a.tar.gz
cd texinfo-4.13/
./configure --prefix=/usr/
sudo make
make check
sudo make install

6. 下载并解压 gcc-4.3.6。gcc-4.3.6 是我找到的 gcc-4.3 中最高的版本,依次执行下面的命令下载并解压

cd /download/
wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.3.6/gcc-4.3.6.tar.gz
tar -zxvf gcc-4.3.6.tar.gz

7. 修改 bug。建议先修改了再构建,构建时间很长,要每次等到构建报错再修改会浪费很多时间。修改文件一律用 vi 编辑器编辑,一个字母一个字母输入,避免粘贴复制一些隐藏符号导致构建出错,后面的注释不要输入

7.1 修改 gcc/config/i386/linux-unwind.h 

// 这是旧文件中的代码片段,1、2 处是需要改的地方
struct rt_sigframe {
    int sig;
    struct siginfo *pinfo;// 1
    void *puc;
    struct siginfo info;// 2
} *rt_ = context->cfa;

// 这是修改后的代码片段,new 1、new 2 处是改过之后的代码
struct rt_sigframe {
    int sig;
    siginfo_t *pinfo;// new 1
    void *puc;
    siginfo_t info;// new 2
    struct ucontext uc;
} *rt_ = context->cfa;

7.2 修改 prims.cc 

// 这是旧文件中的代码片段
#ifndef DISABLE_GETENV_PROPERTIES
#include <ctype.h>
#include <java-props.h>
#define PROCESS_GCJ_PROPERTIES process_gcj_properties()

// 这是修改后的代码片段,增加了 3 行
#ifndef DISABLE_GETENV_PROPERTIES
#ifdef __GLIBC__
#define __NO_CTYPE 1
#endif
#include <ctype.h>
#include <java-props.h>
#define PROCESS_GCJ_PROPERTIES process_gcj_properties()

8. 构建 gcc4.3.6

 再次设置下环境变量,以防万一(这里不确定是否有必要)

export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH

进入 /download/gcc-4.3.6/ 目录,然后创建并进入 gcc-build-4.3.6 目录 

cd /download/gcc-4.3.6/
mkdir gcc-build-4.3.6
cd gcc-build-4.3.6/

对 gcc 用切换版本的方式保留多版本的 gcc 出了很多问题,暂时没有找到解决办法,所以下面用 --prefix=/usr/ 直接覆盖掉原来的版本

../configure --prefix=/usr/ --with-gmp-include=/usr/include --with-gmp-lib=/usr/lib --with-mpfr-include=/usr/include --with-mpfr-lib=/usr/lib
sudo make
make check

安装前先把原来版本的 gcc 移动一下位置

mkdir /usr/bin/gcc-4.8.5/
mv /usr/bin/gcc /usr/bin/gcc-4.8.5/gcc

安装 gcc-4.3.6 

cd /download/gcc-4.3.6/gcc-build-4.3.6/
sudo make install

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值