9vx on x86_64
9vxがx86_64環境でも動くという話だったので、MacOS XのVMWare Fusion上にUbuntu 9.04/amd64をインストールして、試してみた。MacOS X上での動かし方は、こことかに書いている。基本は一緒なので、注意点だけをメモしておこう。
vx32用のbinutilsとgccが必要になるので、最初にコンパイル、インストールしておくこと。ubuntu 9.04のgccは4.3.3で、以前のバージョンと比較して、文法チェックが厳しくなっている。デフォルトは-Werror付きでコンパイルされると、いちいちワーニングをつぶしていく必要があるので、とりあえずconfigureオプションに--disable-werrorを指定して回避した。
vx32は0.12じゃなくて最新のソースコードが必要なので、Mercurialからチェックアウトする。
$ hg clone http://hg.pdos.csail.mit.edu/hg/vx32/ $ cd vx32/src $ make
コンパイルの際にMakefregのVX32_CCなどを変更する。あと、-O3でコンパイルすると、実行時にコアを吐いて死ぬので、-O2に最適化を抑えておくこと。差分は以下の通り。
$ hg diff diff -r a18e9872164b src/Makefrag --- a/src/Makefrag Wed Dec 10 03:29:15 2008 -0800 +++ b/src/Makefrag Wed Apr 29 16:59:20 2009 +0900 @@ -1,7 +1,7 @@ # Main top-level makefile fragment for the vx32 virtual machine. # Compiler flags common to both host and VX32 environment files. -COMMON_CFLAGS = -g -O3 -MD -std=gnu99 -I. $(CFLAGS) +COMMON_CFLAGS = -g -O2 -MD -std=gnu99 -I. $(CFLAGS) #COMMON_CFLAGS = -g -MD -std=gnu99 -I. $(CFLAGS) COMMON_LDFLAGS = -g -L. $(LDFLAGS) @@ -16,14 +16,14 @@ # If you build your own vx32-specific copies of the GNU # tools (see README), you can refer to them here. # On most x86 systems, though, the standard gcc is fine. -# VX32_CC := vx32-gcc -# VX32_LD := vx32-ld -# VX32_AR := vx32-ar -# VX32_OBJCOPY := vx32-objcopy -VX32_CC := gcc -m32 -VX32_LD := ld -melf_i386 -VX32_AR := ar -VX32_OBJCOPY := objcopy +VX32_CC := vx32-gcc +VX32_LD := vx32-ld +VX32_AR := vx32-ar +VX32_OBJCOPY := vx32-objcopy +# VX32_CC := gcc -m32 +# VX32_LD := ld -melf_i386 +# VX32_AR := ar +# VX32_OBJCOPY := objcopy VX32_CFLAGS := -nostdinc -Ilibvxc/include $(COMMON_CFLAGS) VX32_CFLAGS += $(shell $(VX32_CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
Plan9のバイナリは9vx 0.12のものを使う。