The Man Who Fell From The Wrong Side Of The Sky:2013年12月26日分

[最新版] [一覧] [前月] [今月] [翌月]

2013/12/26(Thu)

[386BSD(の子孫)ソースコードシリーズ (334)][な阪関無] sys/cdefs.hとは何ですか? (その15)

予告どおり Advent Calendar の季節が終わったので 人生 Abend Calendar 再開なり。

@ a.out フォーマットを理解する(準備編)

アッハイ、今時の gcc(1) で

$ cat >test.c
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
	puts("Hello, hello, hello, how low?");
	exit(EXIT_SUCCESS);
}
^D
$ gcc -### test.c
...
gcc version 4.5.3 (NetBSD nb2 20110806)
...
$ ls a.out
a.out
$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for NetBSD 6.1, not stripped
$

とかやっても a.out は a.out(5) ではなく elf(5) なのでちゃんと a.out(5) でコンパイルできる環境を用意する必要があります、アーヤヤコシ。

ただし

ちゅーことで古い NetBSD 入れるのが一番簡単ですやね。ELF 化されるのは 1.5 *1 なので、それ以前の環境を準備することにします。

@ 古い NetBSD 環境を用意する

yes(1) 様も大いにご立腹の「古い皮袋に新しいワインを注ぐ( マタイによる福音書 9章 17節)」行為で喜ぶのが N 界隈ですので *2、古い NetBSD が動く環境をなんて呟いた瞬間に 粗大ゴミ貴重なマシン(物理)が床抜ける勢いで届くので注意しましょう。

まぁ別に貴重なマシン(物理)でも 貴重なマシン(仮想)でも何でもいいんですが、ワイは無難に VMware を使います、Workstation10 / Player6 上で動作する NetBSD(i386) は 1.3 以降です *3

これより以前のバージョンの NetBSD/i386 を動かしたい場合は VMware ではなく Bochs の440BXエミュ(bx_generic)では動作するようです。 NetBSD-archive で公開されてない0.8と0.9が動くかは知らんですが、その辺も386BSDも動いてるようだし大丈夫でしょ(適当)。

ちなみに 1.2 以前のインストーラーは systinst(8) が存在しないちゅーか、bootable kernel-copy floppyを使ってのほぼ手作業でのインストールすな。 ワイもやったことありまへん。

そんでですね、若いのでついついバイナリの中身覗くのにGNU binutilsの objdump(1) とか便利なもん使おうとしてしまいますが NetBSD-1.3 にはそんなものはありません。

ELF化される直前の 1.4 だとbinutilsもフルセットで入ってobjdump(1)使えるし、このチラシの裏ネタもちょうど 1.4 から 1.5 への移行期の話だし、この辺入れとくのが無難かな *4

1.4ではこんなかんじ

$ gcc -v
Using builin specs.
gcc version egcs-2.91.60 19981201 (egcs-1.1.1 release)

$ as --version
GNU assembler 2.9.1
...

おっとld(1)ってバージョン表示する方法無いのか、GNU ld 2.9 だそうで。

@ 次回

実際にNetBSD-1.4を使ってa.out(5)の解説をしていく予定、もうobsoleteなもんだしあまり長い文章書きたくないなぁ。


*1:FreeBSD が 3.0 で ELF 化されてからだいぶ後になってからっすな、なお OpenBSD
*2:まぁ今や新しいワインか?すらも疑問ですが(ぉ
*3:NetBSD-1.3 のリリースは1998年1月、VMware がエミュレートする Intel 440BX の登場が1998年4月なのでそんなもんですかね、ABIT BP6にCeleron 300Aをdualで載せてオーバークロックで450動作?知らない世界だなぁ…
*4:あと1.3は非常に不安定で、ディスク負荷が高い状態だと頻繁にkernel panicするしね。


[ホームへ] [ページトップへ]