构建 GCC 1.27(2019)
摘要
一篇博客文章描述了在现代 Ubuntu 系统上构建 GCC 1.27(一款 1988 年的编译器)的过程,详细说明了必要的补丁和步骤。
暂无内容
查看缓存全文
缓存时间: 2026/07/27 22:47
# 构建 GCC 1.27
来源:http://kristerw.blogspot.com/2019/01/building-gcc-127.html
GCC 1.27 于 1988 年发布,是第一个支持 x86 CPU 的 GCC 版本。我想,如果能在我台式机上运行它,应该会很有趣。
Mikhail Maltsev 曾为此写过一篇很棒的博客文章:“Building and using a 29-year-old compiler on a modern system (https://miyuki.github.io/2017/10/04/gcc-archaeology-1.html)”。我以 Mikhail 的工作为基础,但由于我是在 64 位 Ubuntu 系统上构建的,因此需要更新路径以及适用于 64 位操作系统的 `as`/`ld` 选项,而且古老的 GCC 无法理解系统头文件,这给我带来了更大的问题。我还启用了 DBX 调试格式,而不是 GDB 无法理解的 UNIX/32V SDB 格式。不过,我并没有对 Mikhail 的补丁做太大的修改。
令人惊叹的是,一切运行良好——现代汇编器、链接器和调试器毫无问题地处理了 GCC 1.27 生成的代码。而且像 `-O`、`-E`、`-S`、`-c`、`-g`、`-W`、`-pedantic` 和 `-fomit-frame-pointer` 这些命令选项,其作用与你使用现代 GCC 时的预期完全一致。所有选项都在手册页中有文档说明——你可以通过将 `gcc.1` 文件传递给 `man` 来格式化文本:
```
man -l gcc.1
```
### 如何在 Ubuntu 上构建 GCC 1.27
我按照以下步骤在 64 位 Ubuntu Desktop 16.04 上构建了该编译器。
#### 前提条件
GCC 1.27 是一个 32 位程序,因此我们需要安装 32 位编译器和运行时支持:
```
sudo apt install gcc-multilib
```
#### 下载并准备源代码
下载源代码和补丁,并应用补丁:
```
wget https://gcc.gnu.org/pub/gcc/old-releases/gcc-1/gcc-1.27.tar.bz2
wget https://gist.github.com/kristerw/b854b6d285e678452a44a6bcbf7ef86f/raw/gcc-1.27.patch
tar xf gcc-1.27.tar.bz2
cd gcc-1.27
patch -p1 < ../gcc-1.27.patch
```
#### 配置源代码
编译器通过建立指向正确配置文件的符号链接来进行配置:
```
ln -s config-i386v.h config.h
ln -s tm-i386v.h tm.h
ln -s i386.md md
ln -s output-i386.c aux-output.c
```
你可能希望通过更新 `Makefile` 中的 `bindir` 和 `libdir` 来更改编译器的安装位置。我将它们设置为:
```
bindir = /home/kristerw/compilers/gcc-1.27/bin
libdir = /home/kristerw/compilers/gcc-1.27/lib
```
#### 构建和安装
编译器分两个(或三个)阶段构建。首先,我们使用系统编译器进行构建:
```
make
```
然后,我们使用新构建的编译器再次构建:
```
make stage1
make CC=stage1/gcc CFLAGS="-O -Bstage1/ -Iinclude"
```
作为可选第三步,我们使用第二个编译器再次构建,并检查生成的二进制文件是否与第二个编译器的完全相同(如果不相同,则说明编译器自我编译时产生了错误):
```
make stage2
make CC=stage2/gcc CFLAGS="-O -Bstage2/ -Iinclude"
diff cpp stage2/cpp
diff gcc stage2/gcc
diff cc1 stage2/cc1
```
现在我们可以安装编译器了:
```
make install
```
相似文章
关于C扩展、可移植性和替代编译器
本文讨论了编写可移植C代码的实际挑战,这些挑战源于对非标准编译器扩展和glibc条件头文件的依赖,并通过构建C编译器的示例进行说明。
主机调优GCC以加快编译速度
这篇博客文章介绍了如何使用配置文件引导优化、LTO和-O3构建主机调优的GCC编译器,以实现更快的编译速度,并附有详细的说明和基准测试。
使用并行Claude团队构建C编译器
Anthropic研究员展示了如何使用16个并行Claude实例自主构建一个基于Rust的C编译器,该编译器能够编译Linux内核。文章详细介绍了这一多智能体自主编码实验的架构、成本和经验教训。
使用DMD自举GDC
作者描述了如何在FreeBSD上使用DMD编译器和一个小的包装程序自举GNU D编译器(GDC),挑战了GCC关于GDC必须使用GDC构建的说法。
GCC 16及以后版本中的BPF支持
何塞·马奇西(José Marchesi)和GCC-BPF团队提供了GCC 16中BPF支持的更新,突出了在与LLVM功能对等方面取得的进展,以及内核BPF自测通过率的提升。