2.4.22-1.2199.nptl カーネルと rpm.sh-linux.org の gcc-3.4.3/glibc-2.3.3
用 RPM を使った minimal root の作り方
http://rpm.sh-linux.org/ にある gcc-3.4.3/glibc-2.3.3用 RPM は Fedora
Core 2 と同じ構成を仮定した SH4 用の native な RPM パッケージ群になっている。
FC2 なので 2.6.9 カーネル用ではあるがカーネルに依存するパッケージは glibc 以外
は例外的なもののはずなのでそこだけ作り直せばこの多量のパッケージが LANDISK の
2.4.22-1.2199.nptl カーネルでも使える(はず)。 ただただ杉岡さんに感謝。
以下それを実際にやってみた顛末。
カーネルに小さなパッチが必要でこれもあてて作る。 なお少し残念なことに pread/
pwrite などが original のカーネルと互換性がなくなってしまうため、このパッチ
をあてたカーネル上で動かない original のバイナリもあった(smbd とか)。
rpm が使える host で作業用ディレクトリを作り、そこで root権限で作業。 十分
注意する。 まず
rpm2cpio filesystem-2.2.4-1.sh4.rpm | cpio -id
rpm2cpio setup-2.5.33-1.noarch.rpm | cpio -id
とするとカレントにファイルやディレクトリができる。 次に
tar -xjvf glibc-2.3.3-minimal-2.4.22-1.2199.nptl.tar.bz2
で最低限のライブラリなどを展開する。
再び rpm2cpio ???.rpm | cpio -id というパターンで
bash-2.05b-38.sh4.rpm
beecrypt-3.1.0-3.sh4.rpm
bzip2-1.0.2-12.1.sh4.rpm
bzip2-libs-1.0.2-12.1.sh4.rpm
chkconfig-1.3.9-1.1.sh4.rpm
coreutils-5.2.1-7.sh4.rpm
cpio-2.5-6.sh4.rpm
cracklib-2.7-27.1.sh4.rpm
cracklib-dicts-2.7-27.1.sh4.rpm
cyrus-sasl-2.1.18-2.sh4.rpm
cyrus-sasl-md5-2.1.18-2.sh4.rpm
db4-4.2.52-3.1.sh4.rpm
dev-3.3.13-1.sh4.rpm
diffutils-2.8.1-11.sh4.rpm
e2fsprogs-1.35-7.1.sh4.rpm
elfutils-0.95-2.sh4.rpm
elfutils-libelf-0.95-2.sh4.rpm
ethtool-1.8-3.1.sh4.rpm
filesystem-2.2.4-1.sh4.rpm
findutils-4.1.7-25.sh4.rpm
gawk-3.1.3-7.sh4.rpm
gdbm-1.8.0-22.1.sh4.rpm
glib-1.2.10-12.1.1.sh4.rpm
glib2-2.4.0-1.sh4.rpm
grep-2.5.1-26.sh4.rpm
info-4.7-4.sh4.rpm
initscripts-7.55.1-1.sh4.rpm
iproute-2.4.7-14.sh4.rpm
iputils-20020927-13.sh4.rpm
krb5-libs-1.3.4-6.sh4.rpm
less-382-3.sh4.rpm
libacl-2.2.7-5.sh4.rpm
libattr-2.4.1-4.sh4.rpm
libcap-1.10-18.1.sh4.rpm
libselinux-1.11.4-1.sh4.rpm
libstdc++-3.4.3-1.sh4.rpm
libtermcap-2.0.8-38.sh4.rpm
libuser-0.51.7-7.1.1.sh4.rpm
m4-1.4.1-15.sh4.rpm
mingetty-1.07-2.sh4.rpm
mktemp-1.5-18.sh4.rpm
modutils-2.4.27-1.sh4.rpm
mount-2.11y-31.1.sh4.rpm
ncurses-5.4-5.sh4.rpm
net-tools-1.60-20.sh4.rpm
ntp-4.2.0-7.sh4.rpm
openldap-2.1.29-1.sh4.rpm
openssh-3.6.1p2-33.30.1.sh4.rpm
openssh-clients-3.6.1p2-33.30.1.sh4.rpm
openssh-server-3.6.1p2-33.30.1.sh4.rpm
openssl-0.9.7a-35.sh4.rpm
pam-0.77-40.sh4.rpm
passwd-0.68-8.1.sh4.rpm
pcre-4.5-2.sh4.rpm
popt-1.9.1-11.sh4.rpm
portmap-4.0-59.sh4.rpm
procps-3.2.0-1.1.sh4.rpm
psmisc-21.4-2.sh4.rpm
readline-4.3-10.1.sh4.rpm
rpm-4.3.2-11.sh4.rpm
rpm-libs-4.3.2-8.sh4.rpm
sed-4.0.8-4.sh4.rpm
setserial-2.17-15.sh4.rpm
setup-2.5.33-1.noarch.rpm
shadow-utils-4.0.3-21.sh4.rpm
sysklogd-1.4.1-16.sh4.rpm
SysVinit-2.85-25.sh4.rpm
tar-1.13.25-14.sh4.rpm
tcp_wrappers-7.6-36.sh4.rpm
telnet-server-0.17-28.sh4.rpm
termcap-11.0.1-18.1.noarch.rpm
tzdata-2004e-1.fc2.noarch.rpm
util-linux-2.12-18.sh4.rpm
vim-minimal-6.2.457-1.sh4.rpm
which-2.16-2.sh4.rpm
words-2-18.noarch.rpm
xinetd-2.3.13-2.sh4.rpm
zlib-1.2.1.1-2.1.sh4.rpm
を展開しそれを target の root に移す。 本質的な依存関係ではなくて形式的な
依存関係で適当に拾っているので上の .rpm にはいらないものもかなりあると思う。
target が立ち上がるように頑張る。 etc/rc.sysinit とかいろいろ直したかも。
/etc/securetty に ttySC1 を追加した覚えも。
この段階ではいらないかもしれないが eth0 を動かしたかったので /lib/modules/
2.4.22-1.2199.nptl の下も用意した。
/etc/sysconfig/networking/devices/ifcfg-eth0 とかも書いた。 とりあえず
static IP。
とにかくも動けば rpm が使えるはず。
rpm --initdb で RPM のデータベースを初期化。
basesystem-8.0-3.noarch.rpm
filesystem-2.2.4-1.sh4.rpm
setup-2.5.33-1.noarch.rpm
を rpm --nodeps --justdb -ivh で RPM のデータベースに追加。
glibc-2.3.3-27.12.sh4.rpm
glibc-common-2.3.3-27.12.sh4.rpm
libgcc-3.4.3-1.sh4.rpm
SysVinit-2.85-25.sh4.rpm
も rpm --nodeps --justdb -ivh で RPM のデータベースに追加。
# なおこの glibc-*.rpm は kernel 2.6 用なので決して本当に install しては
# いけない。
あとは適当に(再)install または データベースのみに追加して行き、設定まわりを
いじる。
だいたいのバイナリはそのまま動くが若干の例外があった。
make-3.79.1-17.sh4.rpm を install したところ make が
make: symbol lookup error: /lib/libc.so.6: undefined symbol: __fpscr_values
と文句をいう。 これは以前、各 shared ライブラリに __fpscr_values というデータ
シンボルが含まれていたのを各 executable に一つだけ含まれるように ABI の修正が
あったものがこの rpm に入っている make についてはうまくいっていないかららしい。
make の場合は SRPM から作り直すのが正攻法。 これができないような場合(例えば
ledcont のようなソースのないバイナリの場合)には __fpscr_values というデータ
のみを含む shared ライブラリを preload して動かす手もある。
.data
.align 2
.type __fpscr_values,@object
.global __fpscr_values
__fpscr_values:
.long 0
.long 0x80000
を fpscrtab.S として
sh4-linux-gcc -shared -nodefaultlibs -Wl,--soname=libfpscrtab.so.0 -o libfpscrtab.so fpscrtab.S
といった感じで libfpscrtab.so (*1) を作りこれをターゲットの /lib/libfpscrtab.so.1
とし ln -s libfpscrtab.so.1 /lib/libfpscrtab.so と symbolic link を張る。
使うときには例えば
LD_PRELOAD=/lib/libfpscrtab.so /usr/local/sbin/ledcont pwrhw
という感じで使う。
(*1) fa88d64c933b7bb1cf367b5492e6a89e