diff --git a/buildrump.sh b/buildrump.sh
index 9cc5457..620dbf1 100755
--- a/buildrump.sh
+++ b/buildrump.sh
@@ -191,8 +191,8 @@ probear ()
 {
 
 	# Check for GNU/BSD ar
-	if ! ${AR} -V 2>/dev/null | egrep '(GNU|BSD) ar' > /dev/null ; then
-		die Need GNU or BSD ar "(`type ${AR}`)"
+	if ! ${TOOLS_AR} -V 2>/dev/null | egrep '(GNU|BSD) ar' > /dev/null ; then
+		die Need GNU or BSD ar "(`type ${TOOLS_AR}`)"
 	fi
 }
 
@@ -223,7 +223,7 @@ doesitbuild ()
 
 	warnflags="-Wmissing-prototypes -Wstrict-prototypes -Wimplicit -Werror"
 	printf "${theprog}" \
-	    | ${CC} ${warnflags} ${EXTRA_LDFLAGS} ${EXTRA_CFLAGS}	\
+	    | ${TOOLS_CC} ${warnflags} ${EXTRA_LDFLAGS} ${EXTRA_CFLAGS} -x c - -o /dev/null $* \
 		-x c - -o /dev/null $* > /dev/null 2>&1
 }
 
@@ -242,13 +242,7 @@ checkcheckout ()
 
 checkcompiler ()
 {
-
-	if ! ${KERNONLY}; then
-		doesitbuild 'int main(void) {return 0;}\n' \
-		    ${EXTRA_RUMPUSER} ${EXTRA_RUMPCOMMON}
-		[ $? -eq 0 ] || ${TITANMODE} || \
-		    die 'Probe cannot build a binary'
-	fi
+	return
 }
 
 probe_rumpuserbits ()
@@ -548,7 +542,8 @@ makemake ()
 	stage=$2
 	cmd=$3
 
-	env CFLAGS= HOST_LDFLAGS=-L${OBJDIR} ./build.sh \
+	env CC=${BUILD_CC} AR=${BUILD_AR} NM=${BUILD_NM} OBJCOPY=${BUILD_OBJCOPY} \
+	    CFLAGS= BUILD_LDFLAGS=-L${OBJDIR} ./build.sh \
 	    -m ${MACHINE} -u \
 	    -D ${stage} -w ${wrapper} \
 	    -T ${BRTOOLDIR} -j ${JNUM} \
@@ -708,10 +703,27 @@ evaltoolchain ()
 		rm -f ${OBJDIR}/canrun
 	fi
 
+	# check for crossbuild with tools running on host
+	: ${BUILD_CC:=}
+	[ ${BUILD_CC} ] && HYBRIDBUILD=true
+
+	if ${HYBRIDBUILD}; then
+		: ${TOOLS_CC:=${BUILD_CC}}
+		: ${TOOLS_AR:=${BUILD_AR}}
+		: ${TOOLS_NM:=${BUILD_NM}}
+		: ${TOOLS_OBJCOPY:=${BUILD_OBJCOPY}}
+	else
+		: ${TOOLS_CC:=${CC}}
+		: ${TOOLS_AR:=${AR}}
+		: ${TOOLS_NM:=${NM}}
+		: ${TOOLS_OBJCOPY:=${OBJCOPY}}
+	fi
+
+
 	# Check for variant of compiler.
 	# XXX: why can't all cc's that are gcc actually tell me
 	#      that they're gcc with cc --version?!?
-	ccver=$(${CC} --version)
+	ccver=$(${TOOLS_CC} --version)
 	if echo ${ccver} | grep -q 'Free Software Foundation'; then
 		CC_FLAVOR=gcc
 	elif echo ${ccver} | grep -q clang; then
@@ -721,33 +733,21 @@ evaltoolchain ()
 		CC_FLAVOR=pcc
 		PCC='-V HAVE_PCC=1'
 	else
-		die Unsupported \${CC} "(`type ${CC}`)"
+		die Unsupported \${TOOLS_CC} "(`type ${TOOLS_CC}`)"
 	fi
 
-	# Check the arch we're building for so as to work out the necessary
-	# NetBSD machine code we need to use.  First try -dumpmachine,
-	# and if that works, be happy with it.  Not all compilers support
-	# it (e.g. older versions of clang), so if that doesn't work,
-	# try parsing the output of -v
-	if ! CC_TARGET=$(${CC} -dumpmachine 2>/dev/null) ; then
-		# first check "${CC} -v" ... just in case it fails, we want a
-		# sensible return value instead of it being lost in the pipeline
-		# (this is easier than adjusting IFS)
-		if ${CC} -v >/dev/null 2>&1 ; then
-			# then actually process the output of ${CC} -v
-			CC_TARGET=$(LC_ALL=C ${CC} -v 2>&1 \
-			    | sed -n 's/^Target: //p' )
-			[ -z "${CC_TARGET}" ] \
-			    && die failed to probe target of \"${CC}\"
-		else
-			# this might be pcc
-			${CC} -v 2>&1 | grep pcc > /dev/null || \
-			    die \"${CC} -v failed\". Check \"${CC}\"
-			CC_TARGET=$(${CC} -v 2>&1 \
-			    | sed -n -e 's/^pcc.*for //' -e 's/,.*//p' )
-		fi
+	MACH_ARCH=$(echo ${CC_TARGET} | sed 's/.*-\(.*\)-.*/\1/' )
+	echo "MACH_ARCH cc ${MACH_ARCH}"
+
+
+	if [ "${MACH_ARCH}" = 'x86' ] ; then
+		CC_TARGET=genode-x86
+		MACH_ARCH=x86_64
+	elif [ "${MACH_ARCH}" = 'arm' ] ; then
+		CC_TARGET=genode-arm
+	else
+		die Unsupported architectur ${MACH_ARCH}
 	fi
-	MACH_ARCH=$(echo ${CC_TARGET} | sed 's/-.*//' )
 
 	# Set names of tools we're going to use.  try to guess them
 	# for common scenarios
@@ -767,6 +767,9 @@ evaltoolchain ()
 	done
 
 	case ${CC_TARGET} in
+	"genode")
+		RUMPKERN_UNDEF='-U__FreeBSD__'
+		;;
 	*-linux*)
 		RUMPKERN_UNDEF='-Ulinux -U__linux -U__linux__ -U__gnu_linux__'
 		cppdefines _BIG_ENDIAN \
@@ -793,10 +796,10 @@ evaltoolchain ()
 		${TITANMODE} || die ELF required as target object format
 	fi
 
-	if cppdefines __LP64__; then
-		THIRTYTWO=false
-	else
+	if ${TARGET_IS_32BIT}; then
 		THIRTYTWO=true
+	else
+		THIRTYTWO=false
 	fi
 
 	# The compiler cannot do %zd/u warnings if the NetBSD kernel
@@ -857,6 +860,9 @@ evalplatform ()
 		echo '>> Mach-O object format used by OS X is not yet supported'
 		target_supported=false
 		;;
+	genode-*)
+		TARGET=genode
+		;;
 	*)
 		target_supported=false
 		;;
@@ -867,8 +873,8 @@ evalplatform ()
 	fi
 
 	# does target support __thread.  if yes, optimize curlwp
-	doesitbuild '__thread int lanka; int main(void) {return lanka;}\n'
-	[ $? -eq 0 ] && RUMP_CURLWP=__thread
+#	doesitbuild '__thread int lanka; int main(void) {return lanka;}\n'
+#	[ $? -eq 0 ] && RUMP_CURLWP=__thread
 }
 
 # ARM targets require a few extra checks
@@ -880,8 +886,8 @@ probearm ()
 		MACHINE="evbearm-el"
 		MACH_ARCH="arm"
 	else
-		MACHINE="evbearm-eb"
-		MACH_ARCH="armeb"
+		MACHINE="evbearm"
+		MACH_ARCH="arm"
 	fi
 
 	TOOLABI="elf-eabi"
@@ -893,6 +899,11 @@ probearm ()
 	if cppdefines __VFP_FP__; then
 		MKSOFTFLOAT=no
 	fi
+
+	EXTRA_CFLAGS='-march=armv7-a'
+	EXTRA_AFLAGS='-march=armv7-a'
+	EXTRA_LDFLAGS='-nostdlib'
+	appendvar EXTRA_CWARNFLAGS -Wno-format
 }
 
 # aarch64 requires a few checks
@@ -962,6 +973,9 @@ evalmachine ()
 			MACHINE="i386"
 			MACH_ARCH="i486"
 			TOOLABI="elf"
+			appendvar EXTRA_CFLAGS -m32
+			appendvar EXTRA_LDFLAGS -m32
+			appendvar EXTRA_AFLAGS -m32
 		else
 			MACHINE="amd64"
 			MACH_ARCH="x86_64"
@@ -1044,13 +1058,17 @@ parseargs ()
 	debugginess=0
 	KERNONLY=false
 	NATIVENETBSD=false
+	TARGET_IS_32BIT=false
 	OBJDIR=./obj
 	DESTDIR=./rump
 	SRCDIR=./src
 	JNUM=4
 
-	while getopts 'd:DhHj:kNo:qrs:T:V:F:' opt; do
+	while getopts '3:d:DhHj:kNo:qrs:T:V:F:' opt; do
 		case "$opt" in
+		3)
+			TARGET_IS_32BIT=true
+			;;
 		d)
 			DESTDIR=${OPTARG}
 			;;
