次のページ 前のページ 目次へ

2. インストール

2.1 バックグラウンド

ここに示す移行手順の目的は、a.out と ELF の双方をコンパイルして動 かすことのできるシステムを構築することです。そのためには双方のプログラ ムが適切な共有ライブラリを見つけられなければなりません。このためには、 他のいくつかのシステムがやっているように、単純に `/lib/usr/lib そしてコンパイル時に指定されたディレクトリを全て探す' という方法よりも多少なりとも賢い方法が必要です。

賢い方法の中心に位置するのがシステムの上に一つ、あるいは二つ、存在する 動的ローダです。a.out のプログラム用には /lib/ld.so、 ELF のプログラム用には /lib/ld-linux.so.1 がそれぞれ動的ロー ダになっています。コンパイラやリンカは出力するプログラムにライブラリへ の絶対パスを埋めこむことはしません。その代りに、ライブラリ名と適切な動 的ローダへの絶対パスを埋めこみます。そして、実行時に、(動的ローダが)適 切なライブラリに結びつけるわけです。ここに重要な秘密があります -- すな わち、あるプログラムが使っているライブラリが別のディレクトリに動かされ ても、プログラムを再コンパイルする必要はなくld.so (あるいはld-linux.so.1) に新しいディレクトリを探しに行くように 指示するだけで済みます。これが以下に述べるディレクトリを入れ替える操作 の骨子です。

上記から導かれる結論として、ld.so を削除したり移動させたりす れば、動的リンクを使っているプログラムは全て機能しなくなる、 ということがわかります。これは良くないことである、と一般に考えられてい ます。

ですから、基本的な計画としては、ELF 用の開発環境(コンパイラ、インクルー ドファイル、ライブラリ)を、今は a.out 用のものがある /usr/{bin,lib,include}に置き、a.out 関連のファイルは /usr/i486-linuxaout/{bin, lib, include} へ移すことにします。 /etc/ld.so.conf はライブラリが見つかるであろう場所全てのリス トになっており、ldconfig は ELF と a.out を見わける能力を持っ ています。

ライブラリの場所には多くの例外があります。

2.2 始める前に --- 注意すべきポイント

2.3 必要なものは、、、

必要なパッケージは、 ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ftp://sunsite.unc.edu/pub/Linux/GCC/ から入手可能です。両サイト とも多くの場所にミラーされていますので、可能なかぎり近くにあるミラーサ イト[訳注:日本ならば ftp://ftp.iij.ad.jp/pub/linux/sunsite/GCC/ftp://ftp.spin.ad.jp/pub/linux/sunsite.unc.edu/GCC/ など ] から探してください。その方があなたにとっても、みんなにとっても、結局速く 入手できることになります。

以下に示すパッケージ(リストにあがっているバージョンかより新しいもの)が 必要です。これらをダウンロードして、それぞれに付属している文書を読んで みてください:必要な文書はたいてい release.packagename とい う名前になっています。以下に示しているバージョンよりも新しいバージョン を入手した場合、必ずリリースノートに目を通してください。それら新しいバー ジョンではインストールの方法が変っているかも知れません。

プログラムは常にソースからコンパイルするという人でも、以下に示すプログ ラムはバイナリ版を入手してお使いになることを強くお勧めします。これらの プログラムのほとんどは a.out 版のシステムで ELF 形式を生成するようには 設定されておらず、a.out の環境でコンパイルしようとしても無駄です。

絶対に必要なもの

その他

上記以外にも、必須ではありませんが入手しておいた方がいいライブラリ やファイルがいくつかあります。以下に示すものは ELF で使うためにバージョ ンアップしなければならない類いのプログラムです。この文書の後半では、そ のままでも使えるものの、ELF 形式でコンパイルするには修正やバージョンアッ プが必要なプログラムを紹介します。ネットとの接続が遅い場合(例えばフロッ ピーの箱を抱えて 5 分間歩いているくらい時間のかかるような)、以下のファ イルは飛ばして、設定を終える前にこの文書の後半部にあるそれぞれのプログ ラムについての記述と合せてチェックしてください。

2.4 ファイルシステムの再調整

え〜っと、私が以下で「削除する」と言った場合、「バックアップを取っ てから削除する」と読みかえてください :-) まず、深呼吸して、、

エッセンス --- バイナリ・インストール

  1. a.out バイナリを移動するためのディレクトリを作成
    mkdir -p /usr/i486-linuxaout/bin
    mkdir -p /usr/i486-linuxaout/include
    mkdir -p /usr/i486-linuxaout/lib
    mkdir /lib-aout
    
  2. 動的リンカのパッケージ ld.so-1.7.14 をいつものソースコー ドを置いている場所で展開し、取り出された ld.so-1.7.14/instldso.sh スクリプトを読んでください。本当に標 準的なシステムをお使いなら、sh instldso.sh を実行してインストー ルすることができますが、何か非標準的なものを組みこんでいる場合、手動で インストールすることになります。「何か非標準的なもの」とは、
  3. /etc/ld.so.conf を修正して、 /usr/i486-linuxaout/lib を加え(必要ならば /lib-aout も加え)、/sbin/ldconfig -v を再実行して、新しいディレクトリ を探しにいくかチェックします。
  4. /usr/*/lib にある全ての a.out 形式の「ライブラリ」を /usr/i486-linuxaout/lib に移します。移すものは lib*.so*lib*.sa*lib*.a などの「ライブ ラリ」であって、その他のファイルを移す必要はありません。 /usr/lib/gcc-lib などもまだ動かしてはいけません。
  5. 次に /lib をチェックします。libc.so*libm.so*libdl.so* はそのままにしておきます。X のラ イブラリ(libX*.so.3*へのシンボリックリンクもそのままにしてお きましょう --- XView 等のプログラムがそれらのライブラリを使っ ているかも知れません。ld.so*ld-linux.so* など ld で始まっているファイルもそのままにしておきます。残りのライ ブラリについては(もしあれば): ルートパーティションに /usr が あれば、そこにあるファイルは /usr/i486-linuxaout/lib に移しま す。/usr が別パーティションにマウントされていれば、 /lib-aout に移します。これで ldconfig -v してみてく ださい。
  6. binutils をインストールする準備として、もし /usr/lib/ldscripts ディレクトリがあれば削除します(binutils が このディレクトリを新たに作ります)
  7. /usr/bin にある(ld86as86 以外の)全ての ldas のコピーを削除します。
  8. /usr/include 以下のディレクトリを削除します。標準的な システムでは、ここにあるファイルのいくつかはシステムの「核」となる機能 を担っており、libc と共に配布されています。それ以外にも、あなた自身が インストールしたり、使っているディストリビューションの作成者がインストー ルしたファイルもあるはずです。これらを整理するために、0 から作り直すこ とをお勧めします。まず既存の/usr/include/usr/include.oldに変更し、libc-5.2.18.bin.tar.gzをルー トディレクトリで展開します。
  9. binutils パッケージをインストールします。このためには tar - xvzf binutils-2.6.0.12.bin.tar.gz -C / がお勧めの方法です。
  10. gcc パッケージはルートディレクトリで展開する必要があります。gcc パッケージはいくつかのファイルを /usr/bin に、残りの多くのファ イルを /usr/lib/gcc-lib/i486-linux/2.7.2/usr/lib/gcc-lib/i486-linuxaout/2.7.2 にインストールします。 gcc をインストールするには、まず
    $ tar ztf gcc-2.7.2.bin.tar.gz
    
    として、何が入っているかをチェックしてください。残しておきたいファイル に上書きするようであれば(例えば Gnu ADA をインストールしていれば /usr/bin/gcc を残しておきたいでしょう)、まずそれらのファイル を安全な所に移します。その上で、
    # tar -zxf gcc-2.7.2.bin.tar.gz -C /
    
    とします。この時点で、gcc -v して gcc のバージョンを確かめた り、テスト用のプログラムをコンパイルして、きちんと動いているかチェック してください。
    $ gcc -v
    Reading specs from /usr/lib/gcc-lib/i486-linux/2.7.2/specs
    gcc version 2.7.2
    $ gcc -v -b i486-linuxaout
    Reading specs from /usr/lib/gcc-lib/i486-linuxaout/2.7.2/specs
    gcc version 2.7.2
    $ ld -V
    ld version 2.6 (with BFD 2.6.0.2)
      Supported emulations:
       elf_i386 
       i386linux 
       i386coff 
    
    次に伝統的な ``Hello, world'' プログラムを試してください。そのプログラ ムを gccgcc -b i486-linuxaout で、コンパイルし、 a.out と ELFのコンパイラが正しく設定されているか確認してみましょう。 終りましたかって?もう少し頑張って。まだいくつかのライブラリが残ってい ます。また、シンボリックリンクをごちゃごちゃ張らないといけません。頑張っ て、、

    シンボリックリンク

  11. いくつかのプログラム(特にいくつかの X 関連プログラム)は /lib/cpp を使います。/lib/cpp は Linux では /usr/lib/gcc-lib/i486-linuxversion/cppにあり ます。ここまでの段階で /lib の下にあるシンボリックリンクは全 て削除しているはずなので、リンクを張り直す必要があります。
    # cd /lib
    # ln -s /usr/lib/gcc-lib/i486-linux/2.7.2/cpp .
    
  12. /usr/include 以下を /usr/include.old 以下に移 すと、カーネルのソースコードへのシンボリックリンクが失なわれるので、
    # cd /usr/include
    # ln -s ../src/linux/include/linux .
    # ln -s ../src/linux/include/asm .
    
    としてリンクを張り直してください。 (ここではカーネルのソースコードは /usr/src/linux にあると仮定 しています。そうでない場合、適切な場所を指定してください)
  13. FSSTND の連中は、ここでも utmpwtmp ファイ ルを /var/adm から /var/run/var/log に それぞれ移すことにしました。必要に応じて /var/log/var/adm を作り、utmpwtmp の現在位置へ リンクを張るようにしてください。私は以下の ls -l に示すような 配置にしました。
    $ ls -ld /var/adm /var/log /var/run /var/log/*tmp /var/run/*tmp
    lrwxrwxrwx   1 root     root            3 May 24 05:53 /var/adm -> log/
    drwxr-xr-x   9 root     root         1024 Aug 13 23:17 /var/log/
    lrwxrwxrwx   1 root     root           11 Aug 13 23:17 /var/log/utmp -> ../run/utmp
    -rw-r--r--   1 root     root       451472 Aug 13 23:00 /var/log/wtmp
    drwxr-xr-x   2 root     root         1024 Aug 13 23:17 /var/run/
    -rw-r--r--   1 root     root          448 Aug 13 23:00 /var/run/utmp
    
    FSSTND の全体については sunsite にあ る LDP のアーカイブなどにある文書をご覧ください。

    おめでとう!

    ここまでで(多少なりとも)完全に機能する ELF の開発環境が完成したはずで す。一歩下って、しばらく静かに喜びをかみしめましょう。

    重要なソースコードのパッケージ

  14. ncurses のインストールはかなり時間のかかる仕事です。もっ とも、その大部分の時間はコンパイルしながらネットニュースを読むことに費 すことができますが。tar ファイルを展開したら INSTALL ファイル を、自分が「Linux 何たらシステム」のディストリビューションの作成/まと め役である、と思って読んでみましょう。すなわち、コンパイルの際には、多 分、以下のようなコマンドラインで設定する必要がある、ということです。
    $ ./configure --with-normal --with-shared --disable-termcap --enable-overwrite --prefix=/usr
    
    デフォルトになっているターミナルの種類にも注意しましょう。1.3 と 2.0 のカーネルでは、起動時のデフォルトのターミナルは linux になっ ています。場合によっては /etc/inittab を修正して consolegetty にしなければならないかも知れません。 ルートパーティションのあるハードディスクに /usr/lib/terminfo が無い場合、ncurses の `fallback' 機能でごまかす必要があるでしょう。こ の機能は上述の INSTALL ファイルに説明してあり、単純ですが、退 屈な仕事になります(ライブラリを 2 度作成する必要があります)。fallback として linuxvt100 を使えばいい場合、幸いなことに 既存の fallback.cに置き替え可能な fallback.cftp.uk.linux.org に用意されています。 ncurses をインストールした後、/usr/lib 以下で多少面倒な仕事を する必要があります。これは不定形な作業なので、手でやるのが最も簡単です。 バージョン番号が多少不一致になっていることに注意してください。これは醜 いですが、健康に害があるわけではありません。
    1. /usr/lib/libncurses.so.1.9.9e/lib に移し、 シングルユーザーモードでも curses プログラムが動けるようにします。ルー トパーティション に /usr/lib がある場合、特にこの作業は不要で すが、やっておいても害はありません。
    2. /lib ディレクトリで libncurses.so.1.9.9e から /libncurses.so.3.0 へリンクを張ります。
    3. その他、/lib/libncurses.so.3.0 から /usr/lib/libncurses.so/usr/lib/libcurses.so/usr/lib/libtermcap.so へのリンクも必要かも知れません。
    考えるのがメンドウな人向けに簡単に言うと、以下のような作業になります。
    # cd /lib
    # mv /usr/lib/libncurses.so.1.9.9e .
    # ln -s libncurses.so.1.9.9e libncurses.so.3.0 
    # cd /usr/lib
    # ln -s /lib/libncurses.so.3.0 libncurses.so
    # ln -s /lib/libncurses.so.3.0 libcurses.so
    # ln -s /lib/libncurses.so.3.0 libtermcap.so
    
  15. gdbm のインストール。ソースコード用のディレクトリでソー スコードを展開し、gdbm.patch をあて、READMEINSTALL ファイルに目を通します。 構築の手順は以下のようなものになるはずです。
    $ tar zxf gdbm-1.7.3.tar.gz
    $ patch -p0 < gdbm.patch
    $ cd gdbm-1.7.3
    $ ./configure --prefix=/usr
    $ make 
    $ make progs
    $ su
    # make install
    # make install-compat
    # cd /usr/lib
    # ln -s libgdbm.so.1 libgdbm.so
    # ln -s libgdbm.so.1 libgdbm.so.2
    # ldconfig
    
    最後の 2 つは古いバージョンとの互換性を保つためです。最近のディスト リビューションでは libgdbm.so.2 というバージョンになっていま すが、これは libdgbm.so.1 と全く同じコードで、バージョン番号 だけが歴史的な理由から間違えて付けられているものです。

    オプションのソースコードパッケージ

    一般に、それぞれのパッケージに付属の指示にしたがってインストールすれば 大丈夫なので、ここで繰り返すことはしません。ただし、例外が 2 つあり、

  16. GNU 風の termcap が必要な場合(厳密に言うと必須ではあり ませんが、実際には XFree86 のバイナリが必要とするので、ほぼ必須でしょ う)、ソースコードから構築する必要がありますが、必要な作業は以下に示す 程度です。
    $ tar zxf termcap-2.0.8.tar.gz
    $ cd termcap-2.0.8
    $ make
    $ su
    # cp libtermcap.so.2.0.8 /usr/lib
    # ldconfig
    
    決して make install は実行しないように。make install すると ncurses のプログラムを一部上書きしてしまいます。こ のライブラリを使うようにコンパイルされた既存のバイナリを使うのではなく、 新たにこのライブラリを使ってプログラムをコンパイルする場合、ヘッダーファ イルとスタティック・ライブラリをどこか別の場所に用意して -I-L フラグを使ってコンパイル時にその場所を明示するようにし てください。この部分は他の部分に比べて記述が曖昧だと思われるかも知れま せんが、それには理由があります。すなわち、よほどの理由がないかぎり、 termcap を使い続けることはお勧めできないからです。
  17. libdb は以下のように作成します。
    $ tar zxf db.1.85.tar.gz
    $ patch -p0 <db.patch
    $ cd db.1.85/PORT/linux
    $ make
    $ su
    # mkdir /usr/include/db
    # ldconfig
    # cp libdb.so.1.85.3 /usr/lib ; ( cd /usr/lib && ln -s libdb.so.1 libdb.so )
    # cp ../../include/*.h /usr/include/db
    
    注意点としては

2.5 どういう風になるのか(ディレクトリ構成のアウトライン)

以下に示すものは今までにインストールしてきたファイルのかなりおおま かな概観です。トラブルシューティングや削除すべきものを決める際にご利用 ください。

/lib

/usr/lib

/usr/lib/ldscripts

/usr/i486-linux/bin

/usr/i486-linuxaout/bin

/usr/i486-linux/lib

/usr/i486-linuxaout/lib

/usr/lib/gcc-lib/i486-linux/2.7.2

/usr/lib/gcc-lib/i486-linuxaout/2.7.2

2.6 よくあるエラー ――― あわてないで!

(以下の内容の大部分は親切なメールでいただいたものです)

何か間違ったものを動かして、何も動かなくなってしまった!

その場合でも shell は動いているはずなので、多少工夫すれば shell の組み こみ機能だけでかなりの仕事をこなすことが可能です。echo *ls の代わりに使え、echo >>filename はファイル に書き足すのに使えます。ldconfig も静的にリンクされていること をお忘れなく。例えば、libc.so.4 を間違って lib-aout ディレクトリに移してしまった場合、echo "/lib-aout" >>/etc/ld.so.conf ; ldconfig -vすれば、復旧します。 /lib/ld.so を動かしてしまった場合、 静的にリンクされた ln が あれば、sln /sillyplace/ld.so /lib/ld.soすることで、多分復旧 するでしょう。

bad address

ELF 形式のプログラムを動かそうとすると、いつもbad address エ ラーになる場合、多分、カーネルの 1.3.xx <3 の バージョンをお使いなのでしょうが、そのバージョンを使ってはいけません。 それらは多分、最悪のバージョンの一つです。2.0 へバージョンアップするか 1.2.13 にバージョンを落しましょう。似たような環境でカーネルパニックが 発生すると報告している人たちもいますが、私は詳しく調べていません。なぜ なら、開発版のバージョンを使いたいとも思わないし、使う必要があるとも感 じないので、最新版の追っかけはしていないからです。

gcc: installation problem, cannot exec something: No such file or directory

a.out 形式でコンパイルしようとして(something の部分はたいてい の場合 cppcc1 のはずです)、このエラーが生じる場 合、実際に cppcc1 に問題があるか、

$ gcc -b -i486-linuxaout

のように入力したのでしょう。実際には

$ gcc -b i486-linuxaout

と入力しなければなりません。`i486'の部分はダッシュではじまらないことに 注意してください。

make: *** No targets specified and no makefile found. Stop.

このエラーが出る場合、make にパッチをあてて再コンパイルしてい ないか、古いバージョンの make がシステムのどこかに残っている のでしょう。

no such file or directory: /usr/bin/gcc

実際にそのファイルが存在するのにこういうエラーが出る(gcc 以外のプログ ラムでもこうなるかも知れません)。この場合、ELF の動的ローダー /lib/ld-linux.so.1 をインストールしていないか、何らかの理由で ローダーが読めない状態になっているのでしょう。先に述べたインストールス テップの 2 を読んで /lib/ld-linux.so.1 を正しくインストールし てください。

not a ZMAGIC file, skipping

このエラーは ldconfig が出しています。古いバージョンの ld.so のパッケージをお使いのようなので、新しいものを入手してください。もう一 度、インストールのステップ 2 を読んでください。

_setutent: Can't open utmp file

このメッセージは xterm を起動した時に 3 行ずつ出力されることがよくあり ます。インストール手順の最後のあたりにある FSSTND の長文の説明を読んで ください。


次のページ 前のページ 目次へ