Ubuntu 16.04 LTS (64位)中 安装多版本GCC(GCC3.4.6)

前言:在学习操作系统时,应该会碰到编译 linux0.11 内核的情况。但是它要求的是 gcc 3.4.x。版本太高的 gcc 不支持,那么,我们需要在 linux 发行版自带的 gcc 的基础上再装一个版本的 gcc。


准备:

首先,我们需要去官网下载 。在右侧的 Download 栏里可见。
我下载的是 gcc-3.4.6.tar.gz。
(Mirrors 中选择合适的镜像站点,在releases/ 目录下)

dpkg -l | grep libc6

保证有输出。

还有许多需要库,我电脑上可能装的比较全。所以没有一些错误提示。

解压到安装:

解压

tar zxvf gcc-3.4.6.tar.gz

并在同目录下建一个 gcc_build 目录

cd 到 gcc_build 目录下

编辑 gcc-3.4.6/gcc/collect2.c
将在第1500行左右的

        redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT);

修改为:

         redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT,0777);

然后配置,具体内容不多做介绍。
* –prefix=/usr/local/gcc-3.4.6 安装目录
* -disable-checking 生成的编译器在编译过程中不做额外检查,也可以使用–enable-checking=xxx来增加一些检查
* –enable-languages 说明你要让你的gcc支持那些语言
* –disable-multilib 不生成编译为其他平台可执行代码的交叉编译器

../gcc-3.4.6/configure --prefix=/usr/local/gcc-3.4.6 --disable-multilib --disable-checking --enable-languages=c,c++

不清楚你的电脑的实际各种情况。所以就开始编译吧。可能碰到的问题会在下面列出来。

make

一般情况下不会很顺利的编译成功,好事多磨嘛。
编译过程中可能碰到的问题:
Error:

/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/3.4.6/../../../../lib/crt1.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/3.4.6/../../../../lib/crti.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/3.4.6/crtbegin.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/3.4.6/crtend.o' is incompatible with i386 output

S:

./configure 加上一条 --disable-multilib

这是我最后碰到的一个问题。。。哎~


Error:

/usr/bin/ld: cannot find crti.o: No such file or directory

S:

export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/

记住,在同一终端里输入哦。


Error:

../../gcc-3.4.6/gcc/unwind-dw2.c: In function `uw_frame_state_for':
../../gcc-3.4.6/gcc/unwind-dw2.c:1031: error: field `info' has incomplete type

S:

struct rt_sigframe {            \
  int sig;              \
  struct siginfo *pinfo;          \
  void *puc;              \
  struct siginfo info;            \
  struct ucontext uc;           \
} *rt_ = (CONTEXT)->cfa;          \
sc_ = (struct sigcontext *) &rt_->uc.uc_mcontext;   \

这个应该在 gcc/config/i386/(linux.h,linux64.h) 中
把 struct siginfo 替换成 siginfo_t 。有两个。
原来的struct siginfo结构体不存在了,已经被siginfo_t代替了。


你可能感兴趣的:(操作系统)