Network Users' Group ``wheel'' / Dai ISHIJIMA's Page / SL Zaurus関連 /
script

初版: 2003/01/11
最終更新日: 2003/01/20


FreeBSDでSL Zaurusのクロスコンパイラを使う
〜 script 〜



◇script

「ターミナル」でのコマンド実行例をウェブページで紹介するには、 Fn+SHIFT+Cでキャプチャしたスクリーンショットもいいですが、 他のUNIX系OS同様にscriptコマンドが使えると便利です。 残念ながらSLザウルスには、このscriptコマンドがないようです。 そこで、FreeBSDのソースからscriptコマンドをコンパイルしてみました。


◇コンパイル

まず、FreeBSDのソースツリーから、ソース (script.c) を 適当なディレクトリにコピーして、何も考えずにコンパイルしてみました。
	% /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc script.c
	script.c:57: libutil.h: No such file or directory
「libutil.hがあれへんで」というエラーが出てコンパイルできません。 どこかにファイルがないものかと、SLザウルスの中身を漁ってみたり、
	% find /compat/linux -name libutil.h -print
と、Linuxエミュレータやクロスコンパイラのツリーのしたを探っても やっぱりありません。しょーがないので、FreeBSDのlibutil.hをパクって そのままコピーします。
	% cp /usr/include/libutil.h .
ここで再度コンパイルを試してみると、
	% /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -I. script.c
	script.c:74: parse error before `__dead2'
	script.c:74: warning: data definition has no type or storage class
	script.c:264: warning: type mismatch with previous implicit declaration
	script.c:259: warning: previous implicit declaration of `done'
	script.c:264: warning: `done' was previously implicitly declared to return `int'
とエラーになります。 ってことで、ソースをちょっといじってみました (script.patch)。 すると、
	% /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -I. script.c
	/tmp/ccUbfJ46.o: In function `main':
	/tmp/ccUbfJ46.o(.text+0x22c): undefined reference to `openpty'
	/tmp/ccUbfJ46.o: In function `doshell':
	/tmp/ccUbfJ46.o(.text+0x930): undefined reference to `login_tty'
	collect2: ld returned 1 exit status
今度はコンパイルはできるものの、 関数が足りないので実行形式を作るところまではいきません。

ここで足りないといわれている関数 (openptylogin_tty) は、 libutilライブラリに入っているものなので (マニュアルページopenpty(3)などを参照してください)、 これを探してみると、

	% find /compat/linux/ -name 'libutil.*' -print
	/compat/linux/lib/libutil.so.1
	/compat/linux/opt/Embedix/tools/arm-linux/lib/libutil.a
	/compat/linux/opt/Embedix/tools/arm-linux/lib/libutil.so
	/compat/linux/opt/Embedix/tools/arm-linux/lib/libutil.so.1
のようにライブラリが見つかりました。

ということで、最終的に次のようにコンパイルしました。

	% /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -o script
		-I. -L/opt/Embedix/tools/arm-linux/lib script.c -lutil
ところでできあがったファイルは、
	% ls -l script
	-rwxr-xr-x  1 dai  wheel  20176 Jan 11 23:19 script
	% file script
	script: ELF 32-bit LSB executable, ARM, version 1 (ARM),
		dynamically linked (uses shared libs), not stripped
のように、約20kバイトの大きさですが、fileコマンドによると 「ストリップされてない」と出ます。そこで、 stripコマンドでシンボルテーブルを削除します。
	% /compat/linux/opt/Embedix/tools/bin/arm-linux-strip  script
	dai@linguine:../script.test % ls -l script
	-rwxr-xr-x  1 dai  wheel  7904 Jan 11 23:23 script
すると、サイズが8kバイトほどに縮みます。 当社比40%というか(笑)。 ストレージにあまり余裕のないSLザウルスには、 こういう小技も重要かもしれませんね。

これでなんとかscriptをコンパイルできました。 ちなみに実行形式は ここ (script-bin-slzaurus.tgz) です。 無事に動くんでしょうか?(笑) いえ、実は微妙に動きません(爆)。

よく調べてませんが、Slackwareのscriptのソースからコンパイルしたのは うまく動いているようです。 ちなみにこちらの実行形式は ここ (script-slack-bin-slzaurus.tgz) です。 ソースに対するパッチは ここ (script-slack.patch) です。 コンパイルは

	% /compat/linux/opt/Embedix/tools/bin/arm-linux-gcc -o script -DHAVE_openpty script.c -lutil
で行いました。