1999年7月5日に、NetBSD currentのi386 portは実行ファイルの形式を a.outからELFに変更しました。ELFへの移行はコンパイル済みのsnap shotを 入手して行うのが良いとされています。
これに反して、ソース・ベースでの以降を行ってみました。以前に書いた 「NetBSD 1.3.2からcurrentへの移行」の ページの記述と同じか、ちょっと手順を増やす程度で可能でした。
なお、移行を行ったNetBSD currentは、1999年7月13日の時点で、 シェルにはsh(1)と互換なシェルを使用した記述をしています。
さらに1999年8月1日版にて、サイド実行した結果で更新しました。
NetBSDのWebにNetBSD ELF FAQというページがあります。 ここに、Updating a system from a.out to ELFというのが、現在の公式な方法と言えます。
/etc/mk.conf
に、
OBJECT_FMT=a.out
と書いておけば良いことになってます。
(但し、私自身試してませんし、今後はあまりメンテされるとも思えません。)
前もっての準備作業です。
# cd / # mkdir /emul または、 # mkdir /usr/emul (どこか空きのあるファイルシステム) # ln -s /usr/emul /emul とした後で、 # mkdir /emul/aout # tar vcf - `find usr -xdev -name '*.so.*' -print` | \ (cd /emul/aout; tar xfBp -)
# chflags -R schg /emul/aout
a.outも実行できる、ELFをサポートしたカーネルを作成します。
# cd /usr/src/usr.sbin/config # make depend # make # make install
options COMPAT_AOUT # binary compat for NetBSD a.out binariesを入れておきます。
# cd sys/arch/i386/conf # config MYKERNEL (自分で使ってるconfigのファイル) # cd ../compile/MYKERNEL # make depend # make # mv /netbsd /netbsd.old; mv netbsd / # reboot
ユーザ・ランドの更新のための準備で、 まずELFを作成できるELFベースにコンパイラ等を更新します。
# DESTDIR=/../. # export DESTDIR
# OBJECT_FMT=ELF # export OBJECT_FMT
# cd /usr/src # make obj
# cd /usr/src/share/mk # make install
# cd /usr/src # make includes
# rm /../usr/lib/lib*_p.a /../usr/lib/lib*_pic.a私は削除する代わりに、
# mv /../usr/lib/lib*_p.a /../usr/lib/lib*_pic.a /var/tmpとしました。
# BOOTSTRAP_ELF=1 # export BOOTSTRAP_ELF
# cd /usr/src/gnu/lib/libbfd # make cleandir # make bfd.h
# cd /usr/src/gnu/usr.bin # for i in binutils gas.new ld.new egcs ; \ do \ (cd $i ; \ make cleandir ; \ make depend ; \ make ; \ OBJECT_FMT=a.out make ); \ done
# for i in binutils gas.new ld.new egcs; \ do \ (cd $i; make install); \ doneこれでa.out形式のプログラムによる、 ELFを生成可能なコンパイル環境ができました。
ダイナミック・リンクされたELFの実行形式には、実行時のリンク・エディタ
ld.so(1)
が必要です。ELF形式をインストールした時点で動作不能と
なってしまうため、予めインストールしておく必要があります。
ld.so(1)
の作成に必要なため、予め標準Cライブラリの一部を
作成します。
# cd /usr/src/lib/libc # make cleandir # make depend # make libc_pic.a
# cd /usr/src/lib/csu # make cleandir # make depend # make # make install
ld.so(1)
を更新します。
# cd /usr/src/libexec/ld.elf_so # make cleandir # make depend # make # make install
やっと、NetBSD currentの追っかけでは毎度のユーザランドの更新を行います。
# cd /usr/src # make cleandir (/etc/mk.confにUPDATE=yesしてなければ不要) # make build
カーネルを完全にELF形式にします。
# cd sys/arch/i386/conf # config MYKERNEL (自分で使ってるconfigのファイル) # cd ../compile/MYKERNEL # make depend # make # mv /netbsd /netbsd.old; mv netbsd / # reboot
標準のソース・ツリーに含まれないプログラムを、 ELF形式にするために再コンパイルしてください。但し、必ず必要なわけではありません。
自分で実行した結果を忠実に再現したつもりですが、シンタックスの誤りや、 やってみたらうまくいかなかったといった場合には、報告して頂けると幸いです。
Copyright 1999, 2000, 2001, 2002, 2003
Takahiro Kambe. All rights reserved.