9vx on x86_64

9vxがx86_64環境でも動くという話だったので、MacOS XVMWare Fusion上にUbuntu 9.04/amd64をインストールして、試してみた。MacOS X上での動かし方は、こことかに書いている。基本は一緒なので、注意点だけをメモしておこう。

vx32用のbinutilsgccが必要になるので、最初にコンパイル、インストールしておくこと。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のものを使う。