diff --git a/Makefile.in b/Makefile.in
index bb9bcef4077..129b46a81a0 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -99,8 +99,7 @@ ifdef CFG_UNIXY
   CFG_PATH_MUNGE := true
   CFG_EXE_SUFFIX :=
   CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_LIBDIR)
-  CFG_RUN_TARG=\
-      $(CFG_LDENV)=$(dir $(firstword $(1))):$(CFG_LDPATH) $(1)
+  CFG_RUN_TARG=$(CFG_LDENV)=$(CFG_LDPATH) $(1)
   CFG_RUN_TEST=\
       $(CFG_LDENV)=$(dir $(firstword $(1))):$(CFG_LDPATH) \
       $(CFG_VALGRIND) $(1)
@@ -140,7 +139,7 @@ CFG_RUNTIME :=$(call CFG_LIB_NAME,rustrt)
 CFG_RUSTLLVM :=$(call CFG_LIB_NAME,rustllvm)
 CFG_STDLIB :=$(call CFG_LIB_NAME,std)
 
-CFG_LLC_CFLAGS := -march=x86
+CFG_LLC_CFLAGS := -march=x86 -relocation-model=pic
 
 ifdef CFG_GCC
   CFG_INFO := $(info cfg: using gcc)
@@ -438,21 +437,33 @@ boot/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
 	@$(call E, compile: $@)
 	$(BOOT) -shared -o $@ $<
 
-stage0/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
-                      stage0/rustc$(X) $(MKFILES)
+stage0/std.bc: $(STDLIB_CRATE) $(STDLIB_INPUTS) stage0/rustc$(X) $(MKFILES)
 	@$(call E, compile: $@)
 	$(STAGE0) -shared -o $@ $<
 
-stage1/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
-                      stage1/rustc$(X) $(MKFILES)
+stage0/$(CFG_STDLIB): stage0/std.o stage0/glue.o
+	@$(call E, link: $@)
+	$(Q)gcc $(CFG_GCC_CFLAGS) stage0/glue.o $(CFG_GCC_LINK_FLAGS) -o $@ $< \
+		-Lstage0 -Lrt -lrustrt
+
+stage1/std.bc: $(STDLIB_CRATE) $(STDLIB_INPUTS) stage1/rustc$(X) $(MKFILES)
 	@$(call E, compile: $@)
 	$(STAGE1) -shared -o $@ $<
 
-stage2/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
-                      stage2/rustc$(X) $(MKFILES)
+stage1/$(CFG_STDLIB): stage1/std.o stage1/glue.o
+	@$(call E, link: $@)
+	$(Q)gcc $(CFG_GCC_CFLAGS) stage1/glue.o $(CFG_GCC_LINK_FLAGS) -o $@ $< \
+		-Lstage1 -Lrt -lrustrt
+
+stage2/std.bc: $(STDLIB_CRATE) $(STDLIB_INPUTS) stage2/rustc$(X) $(MKFILES)
 	@$(call E, compile: $@)
 	$(STAGE2) -shared -o $@ $<
 
+stage2/$(CFG_STDLIB): stage2/std.o stage2/glue.o
+	@$(call E, link: $@)
+	$(Q)gcc $(CFG_GCC_CFLAGS) stage2/glue.o $(CFG_GCC_LINK_FLAGS) -o $@ $< \
+		-Lstage2 -Lrt -lrustrt
+
 
 
 stage0/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) \
@@ -475,17 +486,17 @@ stage2/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) \
 
 
 
-stage0/glue.bc: stage0/rustc$(X) stage0/$(CFG_STDLIB) \
+stage0/glue.bc: stage0/rustc$(X) boot/$(CFG_STDLIB) \
                 rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
 	@$(call E, generate: $@)
 	$(STAGE0) -o $@ -glue
 
-stage1/glue.bc: stage1/rustc$(X) stage1/$(CFG_STDLIB) \
+stage1/glue.bc: stage1/rustc$(X) stage0/$(CFG_STDLIB) \
                 rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
 	@$(call E, generate: $@)
 	$(STAGE1) -o $@ -glue
 
-stage2/glue.bc: stage2/rustc$(X) stage2/$(CFG_STDLIB) \
+stage2/glue.bc: stage2/rustc$(X) stage1/$(CFG_STDLIB) \
                 rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
 	@$(call E, generate: $@)
 	$(STAGE2) -o $@ -glue
diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in
index d917aa937a1..f8ac1ed46ef 100644
--- a/src/rt/rustrt.def.in
+++ b/src/rt/rustrt.def.in
@@ -13,6 +13,7 @@ rand_free
 rand_new
 rand_next
 refcount
+rust_dirent_filename
 rust_file_is_dir
 rust_get_stdin
 rust_get_stdout