現在利用している GCC のバージョンはシェルプロンプトから gcc
-v
と入力することでわかります。またこのコマンドによって現在のセットアッ
プが ELF か a.out かもわかります。私のシステムでは以下のようになります。
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
出力のうち注意すべきキーワードは以下のようなものです。
i486
この gcc が 486 プロセッサ向けにビルドされたことを示しています。読者の システムでは 386 や 586 が表示されるかもしれません。これらのシステム のどれかでコンパイルされたバイナリは他のどのチップでも実行させるこ とが出来ます。 486 gcc でコンパイルされたプログラムでは、 486 チップで 高速に動作するようなコードがあちこちに埋め込まれています。このことによっ て 386 下での実行時の性能に有害な影響が出ることはありませんが、バイナ リのサイズは少々大きくなります。
box
これはまったく重要ではありませんで、他のものに置き変わっている
(slackware
やdebian
など)ことや、そもそもまったく現れない
こともあります(つまり全体で i486-linux
のようになります)。
もし自分自身で gcc をビルドする場合には、好きな値をセットして格好良く
見せることもできます(私はそうしてます :-)
)。
linux
これは linuxelf
や linuxaout
となることもあ
り、更に面倒なことには gcc のバージョンによってこれらの意味あいが変わっ
ています。
linux
は 2.7.0 以降のバージョンなら ELF、その前の場合は
a.out を意味します。linuxaout
は a.out 対応です。このエントリは linux
の
内容が 2.7.0 以降で a.out から ELF に変更されたことにより導入
されました。したがって 2.7.0 より前のバージョンではこのエントリが現れ
ることはありません。
linuxelf
というのは古い書式です。これが現れるのはほとんどの
場合 ELF バイナリを出力するように設定された 2.6.3 の gcc です。ところ
で gcc 2.6.3 は ELF コードを作成するにあたってバグがあることが知られて
います。したがってこの表示が現れた場合はアップグレードをお薦めします。
2.7.2
バージョン番号です。
したがって私は ELF コードを出力する 2.7.2 版の gcc を使っていることに なります。そうだったのか!
gcc のインストールの時によそ見をしていた場合や、バイナリパッケージ の一部として gcc をインストールした場合、ファイルシステムのどこを探せ ば gcc があるのかを知りたいことがあるかもしれません。以下重要なものを 示します。
/usr/lib/gcc-lib/
target/
version/
とそのサブディレクトリにはコンパイラ本体の大部分が置かれています。コン
パイラ本体のプログラムとバージョンに特有のライブラリ、インクルードファ
イルがあります。
/usr/bin/gcc
はコンパイラのドライバです。コマンドライ
ンからはこれが実行されます。複数のバージョンのコンパイラが上記のような
ディレクトリに別々にインストールされている場合、このプログラムでバージョ
ンを使い分けることが出来ます。デフォルトのバージョンを表示するには
gcc -v
とします。他のバージョンを用いる場合には gcc -V
version とします。以下に例を示します。
# gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
# gcc -V 2.6.3 -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.6.3/specs
gcc driver version 2.7.2 executing gcc version 2.6.3
/usr/
target/(bin|lib|include)/
。複
数のターゲットシステム(例えば a.out と ELF、あるいは各種のクロスコン
パイラなど)に応じて gcc を複数インストールした場合、Linux 以外向
けのライブラリや binutils (as
、 ld
など)、ヘッダファイルな
どはこのディレクトリ下に置かれます。一種類の gcc しかインストールして
い場合でも、まあ要するにここに関連ファイルが置かれるわけです。ここ
にない場合は /usr/(bin|lib|include)
にあります。
/lib
や /usr/lib
などは native なシステムのた
めのライブラリが置かれるディレクトリです。コンパイラ以外のアプリケーショ
ンの中には、ここに /lib/cpp
が置かれることを想定しているものが
あります(特に X でよく使われます)。ない場合は
/usr/lib/gcc-lib/
target/
version/
からコピーしてくるかシンボリックリンクを張りましょう。
利用者各自が /usr/local/include
にインストールするものを
除くと、 Linux で主に利用されるヘッダファイルは以下の 3 つになります。
/usr/include/
とそのサブディレクトリにあるヘッダファイ
ルのほとんどは H. J. Lu が提供している libc バイナリパッケージのもので
す。「ほとんど」と書いたのは、他にもここにヘッダファイルを置くパッケー
ジがあるからです。例えば curses
や dbm
などがそうです。古い
libc パッケージは curses と dbm もいっしょになっていましたが、最新のも
のでは別パッケージになっています。
/usr/include/linux
と /usr/include/asm
ディレ
クトリのファイル(これらは <linux/*.h>
、
<asm/*.h>
のようにインクルードされます)。これらのディ
レクトリはカーネルソースツリーのうちの linux/include/linux
ディ
レクトリおよび linux/include/asm
へのシンボリックリンクとなっ
ています。少々複雑なプログラムを開発する場合はインストールしておく必要
があります。これらはカーネルのコンパイルのためだけのものではないのです。
カーネルソースを展開するだけではだめで、 make config
を実行す
る必要があります。このコマンドによってはじめて作成される
<autoconf.h>
は多くのファイルによって参照されていますし、
カーネルのバージョンによっては asm
ディレクトリがシンボリックリン
クになっていて、 make config
のときにのみリンクが作成されるように
なっています。
したがってカーネルソースを /usr/src/linux
以下に展開した後の
作業は次のようになります。
$ cd /usr/src/linux
$ su
# make config
[質問に答えます。この後に続けてカーネルを作るのでない限り
ここでの答を気にする必要はあまりありません。]
# cd /usr/include
# ln -s ../src/linux/include/linux .
# ln -s ../src/linux/include/asm .
<float.h>
や <limits.h>
、
<varargs.h>
、 <stdarg.h>
、 <stddef.h>
といったファイルはコンパイラのバージョンによって内容が変わっています。
したがってこれらは
/usr/lib/gcc-lib/i486-box-linux/2.7.2/include/
か、あるいは似
たような名前の場所に置かれています。
gcc のソースコードがあればその中の INSTALL ファイルの指示に従うだ
けでできるはずです。コンパイルを行うコンピュータの種類が XXX
でし
たら configure --target=i486-linux --host=XXX
として make
す
れば、すべてやってくれるはずです。ただし実際のコンパイルには Linux 特
有のヘッダファイル、カーネルのヘッダファイルが必要になりますし、クロス
アセンブラ、クロスリンカのソースを
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/
から入手してそれぞれビルドする必要があります。
うーん。 "emx" パッケージとか "go" エクステン ダなどを使うと可能になるそうです。 ftp://sunsite.unc.edu/pub/Linux/devel/msdos を見てみて下さい。
私はこれらを試したことがないので、性能について保証することはできません。