プログラミング
GCC 1.27 (2019) のビルド
Building GCC 1.27 (2019) (kristerw.blogspot.com)
要約
この記事は、1988年にリリースされた古いコンパイラGCC 1.27を、現代の64ビットUbuntuシステム上でビルドし、動作させるプロセスを詳述しています。筆者は、64ビット環境への対応や、古いGCCと現代のシステムヘッダーとの互換性の問題に対処し、DBXデバッグフォーマットを有効化しました。記事では、Ubuntu上でGCC 1.27をビルドするための詳細な手順(前提条件、ソースコードのダウンロードとパッチ適用、設定、段階的なビルド、インストール)も提供されています。
全文翻訳
2019年1月26日土曜日 GCC 1.27のビルド
GCC 1.27は1988年にリリースされ、x86 CPUをサポートする最初のGCCバージョンです。これを私のデスクトップコンピュータで動作させるのは面白いだろうと思いました。Mikhail Maltsevは以前、「Building and using a 29-year-old compiler on a modern system」という素晴らしいブログ記事を書きました。私はMikhailの作業を出発点としましたが、64ビットUbuntuシステム上でビルドしていたため、64ビットOSで実行するためにパスとas/ldオプションを更新する必要がありました。また、古いGCCがシステムヘッダーを理解しないという、より大きな問題もありました。GDBが理解できないUNIX/32V SDBフォーマットの代わりにDBXデバッグフォーマットも有効にしました。しかし、Mikhailのパッチに大きな変更を加える必要はありませんでした。驚くほどうまく動作します。現代のアセンブラ、リンカ、デバッガは、GCC 1.27が生成したコードを問題なく扱います。また、-O、-E、-S、-c、-g、-W、-pedantic、-fomit-frame-pointerのようなコマンドオプションは、現代のGCCを使用する際に期待する通りの動作をします。すべてのオプションはマニュアルページに記載されています。manコマンドにgcc.1ファイルを渡すことでテキストをフォーマットできます。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
ビルドとインストール
コンパイラは2段階(または3段階)でビルドされます。まず、システムコンパイラを使用してビルドを開始します。
make
次に、新しくビルドされたコンパイラを使用して再度ビルドします。
make stage1
make CC=stage1/gcc CFLAGS="-O -Bstage1/ -Iinclude"
3番目のオプションのステップとして、2番目のコンパイラを使用して再度ビルドし、生成されたバイナリが2番目のコンパイラと同一であることを確認します(そうでない場合、コンパイラは自身を誤ってコンパイルしたことになります)。
make stage2
make CC=stage2/gcc CFLAGS="-O -Bstage2/ -Iinclude"
diff cpp stage2/cpp
diff gcc stage2/gcc
diff cc1 stage2/cc1
これでコンパイラをインストールする準備ができました。
make install
Krister Walfridssonによって投稿 2019年1月26日土曜日
メールで送信
このブログに投稿
Facebookに共有
Pinterestに共有
ラベル: C, GCC
コメント1件:
Jason Stevens 2019年5月5日 4:06 AM
私は何よりもまずDoomをビルドするためにgcc 1.27を使用しています。固定小数点演算のためにASMバージョンを使用する必要がありました。なぜなら、long long型がないからです。いずれにせよ、64ビットバージョンのためにgcc 1.27を32ビット命令とレジスタにコンパイルするように変換するのはどれくらい難しいだろうかと疑問に思っています。ただし、ライブラリとインターフェースするにはシンキングが必要になります。
返信削除返信コメントを追加
さらに読み込む...
注: このブログのメンバーのみコメントを投稿できます。
新しい投稿古い投稿ホーム購読:コメントを投稿 (Atom)