以上で ELF 形式のプログラムをコンパイルして動かすのに必要な作業は全て すみました。お好みならここで読むのをやめても結構です。
美的観点(neatness)やメモリの使用を最小限にするために、既存のプログラム を ELF 形式で再コンパイルしたくなるかも知れません。ほとんどのエンドユー ザー向けのプログラムはごく簡単にコンパイルできます;しかし、いくつかの プログラムでは a.out 環境に強く依存しているため、以下のようなエラーを 出すことがあります。
_)の使いかたの違い:a.out 形式の実行ファ
イルでは、外部の関数や変数のラベルには _ が頭に付いていました;
一方、ELF 形式の実行ファイルにはアンダスコアが付きません。これは手書き
のアセンブラコードを混ぜて使わないかぎり、特に問題にはなりません:
_foo 形式のラベルをすべて foo に変換するか、あるいは
(両方の環境でコンパイル可能にしたければ) EXTERNAL というマクロを
定義して EXTERNAL(foo) という形にします。ここで EXTERNAL い
うマクロは (__ELF__ が定義されていれば) そのまま引数を返し、さも
なくば _ を前につけて引数を返すようなものです。
以上を踏まえて、以下に示す 2 つのリストを作成しました。前者(アップグレー ド)は既に公式リリースが ELF に対応しているソフト(すなわち ELF 用にコンパ イルするためには新しいバージョンを手に入れればいいもの)で、後者(パッチ) は第三者が出している ELF 用のパッチが必要なソフトです。
ftp.metronet.com か
ftp.wpi.edu から入手できます。
cal プログラムは動き
ません。2.4 以降のもの(
version 2.4
)にアップグレードしてください。
make config 時)に ``Kernel support for ELF
binaries'' に `Y' と答えれば可能です)、(b)カーネルを ELF 形式でコンパ
イルできるかどうか。(b)については一般的には `no' です。ですから、カー
ネルのコンパイル時には a.out 形式を使うように Makefile に修正を加える
必要があります。Makefile のCC と LD の定義を以下のよ
うにしてください。
LD =ld -m i386linux
CC =gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include
(b) に対する別の解として、H J Lu のパッチを当てれば、カーネルを ELF 形
式でコンパイルするこのも可能です(このパッチで ELF 形式のプログラムに
core dump させることも可能になります)。このパッチはごく近い将来に 1.3
のカーネルに取りこまれるはずですが、ps とそれに関連するユーティリ
ティ用に psupdate プログラムが namelist をサポートするように hack
する必要があります。
[訳注:上でも書きましたが、1.3.7 以降のカーネルでは ELF 化パッチ
が公式リリースに取りこまれました。カーネルを ELF で作成するか否かは
make config 時に指定できます]
--- SVGATextMode-0.7.orig/XFREE/os-support/assyntax.h Sun Feb 26 18:58:15 1995
+++ SVGATextMode-0.7/XFREE/os-support/assyntax.h Thu Mar 30 07:52:03 1995
@@ -211,7 +211,7 @@
#endif /* ACK_ASSEMBLER */
-#if (defined(SYSV) || defined(SVR4)) && !defined(ACK_ASSEMBLER)
+#if (defined (__ELF__) || defined(SYSV) || defined(SVR4)) && !defined(ACK_ASSEMBLER)
#define GLNAME(a) a
#else
#define GLNAME(a) CONCAT(_,a)