about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-11-02 22:16:02 -0700
committerbors <bors@rust-lang.org>2013-11-02 22:16:02 -0700
commitb5c1b48048cc911c3caa07ada776239123a97b50 (patch)
tree8129865701c0d4d288cbc1453801db3e583910f9
parenta248e34fc7afdccf0f50b7b6b28dac86f1b93374 (diff)
parent0ce1b2f04d5b1a427f966ed70b09e95ae882947e (diff)
downloadrust-b5c1b48048cc911c3caa07ada776239123a97b50.tar.gz
rust-b5c1b48048cc911c3caa07ada776239123a97b50.zip
auto merge of #10199 : alexcrichton/rust/no-propagate, r=brson
This commit removes the propagation of `link_args` attributes across crates. The first commit message has the reasons as to why. Additionally, this starts statically linking some C/C++ helper libraries that we have to their respective crates instead of throwing then in librustrt and then having everything depend on librustrt.

The major downside of this movement is that we're losing the ability to control visible symbols. I couldn't figure out a way to internalize symbols from a static library during the linking process, so everyone who links to librustdoc will be able to use its sundown implementation (not exactly ideal). I'm not entirely sure how to fix this (beyond generating a list of all public symbols, including rust ones, and passing that to the linker), but we may have a much easier time with this once we start using llvm's linker toolchain.

There's certainly a lot more possibilities in where this can go, but I didn't want to go too deep just yet. The main idea here is to stop propagating linker arguments and then see how we're able to start statically linking libraries as a result.

r? @catamorphism, you're going to be working on linking soon, so feel free to completely throw this away for something else!
-rw-r--r--Makefile.in2
-rw-r--r--mk/rt.mk66
-rw-r--r--mk/target.mk12
-rw-r--r--mk/tests.mk7
-rw-r--r--mk/tools.mk4
-rw-r--r--src/librustc/back/link.rs10
-rw-r--r--src/librustc/lib/llvm.rs3
-rw-r--r--src/librustc/metadata/csearch.rs7
-rw-r--r--src/librustc/metadata/decoder.rs10
-rw-r--r--src/librustc/metadata/encoder.rs21
-rw-r--r--src/librustdoc/html/markdown.rs1
-rw-r--r--src/librustuv/uvll.rs12
-rw-r--r--src/rt/rustrt.def.in121
13 files changed, 85 insertions, 191 deletions
diff --git a/Makefile.in b/Makefile.in
index 2b27574f97e..65147b5e4eb 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -625,10 +625,10 @@ config.stamp: $(S)configure $(S)Makefile.in $(S)src/snapshots.txt
 # new definitions), make sure definitions always precede their uses,
 # especially for the dependency lists of recipes.
 
+include $(CFG_SRC_DIR)mk/rt.mk
 include $(CFG_SRC_DIR)mk/target.mk
 include $(CFG_SRC_DIR)mk/host.mk
 include $(CFG_SRC_DIR)mk/stage0.mk
-include $(CFG_SRC_DIR)mk/rt.mk
 include $(CFG_SRC_DIR)mk/rustllvm.mk
 include $(CFG_SRC_DIR)mk/tools.mk
 include $(CFG_SRC_DIR)mk/docs.mk
diff --git a/mk/rt.mk b/mk/rt.mk
index d8490230675..d51b09b56da 100644
--- a/mk/rt.mk
+++ b/mk/rt.mk
@@ -87,19 +87,11 @@ RUNTIME_CXXS_$(1)_$(2) := \
               rt/sync/rust_thread.cpp \
               rt/rust_builtin.cpp \
               rt/rust_upcall.cpp \
-              rt/rust_uv.cpp \
               rt/miniz.cpp \
               rt/rust_android_dummy.cpp \
               rt/rust_test_helpers.cpp
 
-RUNTIME_CS_$(1)_$(2) := rt/sundown/src/autolink.c \
-			rt/sundown/src/buffer.c \
-			rt/sundown/src/stack.c \
-			rt/sundown/src/markdown.c \
-			rt/sundown/html/houdini_href_e.c \
-			rt/sundown/html/houdini_html_e.c \
-			rt/sundown/html/html_smartypants.c \
-			rt/sundown/html/html.c
+RUNTIME_CS_$(1)_$(2) :=
 
 RUNTIME_S_$(1)_$(2) := rt/arch/$$(HOST_$(1))/_context.S \
 			rt/arch/$$(HOST_$(1))/record_sp.S
@@ -108,10 +100,7 @@ RT_BUILD_DIR_$(1)_$(2) := $$(RT_OUTPUT_DIR_$(1))/stage$(2)
 
 RUNTIME_DEF_$(1)_$(2) := $$(RT_OUTPUT_DIR_$(1))/rustrt$$(CFG_DEF_SUFFIX_$(1))
 RUNTIME_INCS_$(1)_$(2) := -I $$(S)src/rt -I $$(S)src/rt/isaac -I $$(S)src/rt/uthash \
-                     -I $$(S)src/rt/arch/$$(HOST_$(1)) \
-                     -I $$(S)src/rt/sundown/src \
-                     -I $$(S)src/rt/sundown/html \
-                     -I $$(S)src/libuv/include
+                     -I $$(S)src/rt/arch/$$(HOST_$(1))
 RUNTIME_OBJS_$(1)_$(2) := $$(RUNTIME_CXXS_$(1)_$(2):rt/%.cpp=$$(RT_BUILD_DIR_$(1)_$(2))/%.o) \
                      $$(RUNTIME_CS_$(1)_$(2):rt/%.c=$$(RT_BUILD_DIR_$(1)_$(2))/%.o) \
                      $$(RUNTIME_S_$(1)_$(2):rt/%.S=$$(RT_BUILD_DIR_$(1)_$(2))/%.o)
@@ -140,10 +129,9 @@ $$(RT_BUILD_DIR_$(1)_$(2))/arch/$$(HOST_$(1))/libmorestack.a: $$(MORESTACK_OBJS_
 	$$(Q)$(AR_$(1)) rcs $$@ $$^
 
 $$(RT_BUILD_DIR_$(1)_$(2))/$(CFG_RUNTIME_$(1)): $$(RUNTIME_OBJS_$(1)_$(2)) $$(MKFILE_DEPS) \
-                        $$(RUNTIME_DEF_$(1)_$(2)) $$(LIBUV_LIB_$(1))
+                        $$(RUNTIME_DEF_$(1)_$(2))
 	@$$(call E, link: $$@)
 	$$(Q)$$(call CFG_LINK_CXX_$(1),$$@, $$(RUNTIME_OBJS_$(1)_$(2)) \
-	    $$(LIBUV_LIB_$(1)) \
 	    $$(CFG_LIBUV_LINK_FLAGS_$(1)),$$(RUNTIME_DEF_$(1)_$(2)),$$(CFG_RUNTIME_$(1)))
 
 # These could go in rt.mk or rustllvm.mk, they're needed for both.
@@ -242,6 +230,54 @@ $$(LIBUV_LIB_$(1)): $$(LIBUV_DEPS) $$(LIBUV_MAKEFILE_$(1))
 		NO_LOAD="$$(LIBUV_NO_LOAD)" \
 		V=$$(VERBOSE)
 endif
+
+# libuv support functionality (extra C/C++ that we need to use libuv)
+
+UV_SUPPORT_NAME_$(1) := $$(call CFG_STATIC_LIB_NAME_$(1),uv_support)
+UV_SUPPORT_DIR_$(1) := $$(RT_OUTPUT_DIR_$(1))/uv_support
+UV_SUPPORT_LIB_$(1) := $$(UV_SUPPORT_DIR_$(1))/$$(UV_SUPPORT_NAME_$(1))
+UV_SUPPORT_CS_$(1) := rt/rust_uv.cpp
+UV_SUPPORT_OBJS_$(1) := $$(UV_SUPPORT_CS_$(1):rt/%.cpp=$$(UV_SUPPORT_DIR_$(1))/%.o)
+
+$$(UV_SUPPORT_DIR_$(1))/%.o: rt/%.cpp
+	@$$(call E, compile: $$@)
+	@mkdir -p $$(@D)
+	$$(Q)$$(call CFG_COMPILE_CXX_$(1), $$@, \
+		-I $$(S)src/libuv/include \
+                 $$(RUNTIME_CFLAGS_$(1))) $$<
+
+$$(UV_SUPPORT_LIB_$(1)): $$(UV_SUPPORT_OBJS_$(1))
+	@$$(call E, link: $$@)
+	$$(Q)$$(AR_$(1)) rcs $$@ $$^
+
+# sundown markdown library (used by librustdoc)
+
+SUNDOWN_NAME_$(1) := $$(call CFG_STATIC_LIB_NAME_$(1),sundown)
+SUNDOWN_DIR_$(1) := $$(RT_OUTPUT_DIR_$(1))/sundown
+SUNDOWN_LIB_$(1) := $$(SUNDOWN_DIR_$(1))/$$(SUNDOWN_NAME_$(1))
+
+SUNDOWN_CS_$(1) := rt/sundown/src/autolink.c \
+			rt/sundown/src/buffer.c \
+			rt/sundown/src/stack.c \
+			rt/sundown/src/markdown.c \
+			rt/sundown/html/houdini_href_e.c \
+			rt/sundown/html/houdini_html_e.c \
+			rt/sundown/html/html_smartypants.c \
+			rt/sundown/html/html.c
+
+SUNDOWN_OBJS_$(1) := $$(SUNDOWN_CS_$(1):rt/%.c=$$(SUNDOWN_DIR_$(1))/%.o)
+
+$$(SUNDOWN_DIR_$(1))/%.o: rt/%.c
+	@$$(call E, compile: $$@)
+	@mkdir -p $$(@D)
+	$$(Q)$$(call CFG_COMPILE_C_$(1), $$@, \
+		-I $$(S)src/rt/sundown/src -I $$(S)src/rt/sundown/html \
+                 $$(RUNTIME_CFLAGS_$(1))) $$<
+
+$$(SUNDOWN_LIB_$(1)): $$(SUNDOWN_OBJS_$(1))
+	@$$(call E, link: $$@)
+	$$(Q)$$(AR_$(1)) rcs $$@ $$^
+
 endef
 
 # Instantiate template for all stages/targets
diff --git a/mk/target.mk b/mk/target.mk
index ac95b2f5c66..f7d8ec83a5a 100644
--- a/mk/target.mk
+++ b/mk/target.mk
@@ -77,10 +77,15 @@ $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTUV_$(2)): \
 		$$(LIBRUSTUV_CRATE) $$(LIBRUSTUV_INPUTS) \
 	        $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB_$(2)) \
 		$$(TSREQ$(1)_T_$(2)_H_$(3)) \
+		$$(LIBUV_LIB_$(2)) \
+		$$(UV_SUPPORT_LIB_$(2)) \
 		| $$(TLIB$(1)_T_$(2)_H_$(3))/
 	@$$(call E, compile_and_link: $$@)
 	$$(call REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBRUSTUV_GLOB_$(2)),$$(notdir $$@))
-	$$(STAGE$(1)_T_$(2)_H_$(3)) $$(WFLAGS_ST$(1)) --out-dir $$(@D) $$< && touch $$@
+	$$(STAGE$(1)_T_$(2)_H_$(3)) $$(WFLAGS_ST$(1)) \
+		-L $$(UV_SUPPORT_DIR_$(2)) \
+		-L $$(dir $$(LIBUV_LIB_$(2))) \
+		--out-dir $$(@D) $$< && touch $$@
 	$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBRUSTUV_GLOB_$(2)),$$(notdir $$@))
 
 $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBSYNTAX_$(3)): \
@@ -117,13 +122,16 @@ $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTC_$(3)):		\
 	$$(STAGE$(1)_T_$(2)_H_$(3)) $$(WFLAGS_ST$(1)) --out-dir $$(@D) $$< && touch $$@
 	$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBRUSTC_GLOB_$(2)),$$(notdir $$@))
 
+# NOTE: after the next snapshot remove these '-L' flags
 $$(TBIN$(1)_T_$(2)_H_$(3))/rustc$$(X_$(3)):			\
 		$$(DRIVER_CRATE)				\
 		$$(TSREQ$(1)_T_$(2)_H_$(3)) \
 		$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTC_$(3)) \
 		| $$(TBIN$(1)_T_$(2)_H_$(3))/
 	@$$(call E, compile_and_link: $$@)
-	$$(STAGE$(1)_T_$(2)_H_$(3)) --cfg rustc -o $$@ $$<
+	$$(STAGE$(1)_T_$(2)_H_$(3)) --cfg rustc -o $$@ $$< \
+		-L $$(UV_SUPPORT_DIR_$(2)) \
+		-L $$(dir $$(LIBUV_LIB_$(2)))
 ifdef CFG_ENABLE_PAX_FLAGS
 	@$$(call E, apply PaX flags: $$@)
 	@"$(CFG_PAXCTL)" -cm "$$@"
diff --git a/mk/tests.mk b/mk/tests.mk
index 02242897d35..eabb5f535e6 100644
--- a/mk/tests.mk
+++ b/mk/tests.mk
@@ -358,7 +358,9 @@ $(3)/stage$(1)/test/rustuvtest-$(2)$$(X_$(2)):			\
 		$$(LIBRUSTUV_CRATE) $$(LIBRUSTUV_INPUTS)	\
 		$$(STDTESTDEP_$(1)_$(2)_$(3))
 	@$$(call E, compile_and_link: $$@)
-	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test
+	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test \
+		-L $$(UV_SUPPORT_DIR_$(2)) \
+		-L $$(dir $$(LIBUV_LIB_$(2)))
 
 $(3)/stage$(1)/test/syntaxtest-$(2)$$(X_$(2)):			\
 		$$(LIBSYNTAX_CRATE) $$(LIBSYNTAX_INPUTS)	\
@@ -392,7 +394,8 @@ $(3)/stage$(1)/test/rustdoctest-$(2)$$(X_$(2)):					\
 		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBSYNTAX_$(2)) \
 		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBRUSTC_$(2))
 	@$$(call E, compile_and_link: $$@)
-	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test
+	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test \
+		-L $$(SUNDOWN_DIR_$(2))
 
 endef
 
diff --git a/mk/tools.mk b/mk/tools.mk
index ed4ae10e3e2..fb2e0b6367c 100644
--- a/mk/tools.mk
+++ b/mk/tools.mk
@@ -57,10 +57,12 @@ $$(TLIB$(1)_T_$(4)_H_$(3))/$(CFG_LIBRUSTDOC_$(4)):		\
 		$$(RUSTDOC_LIB) $$(RUSTDOC_INPUTS)			\
 		$$(SREQ$(1)_T_$(4)_H_$(3))			\
 		$$(TLIB$(1)_T_$(4)_H_$(3))/$(CFG_LIBRUSTC_$(4)) \
+		$$(SUNDOWN_LIB_$(4)) \
 		| $$(TLIB$(1)_T_$(4)_H_$(3))/
 	@$$(call E, compile_and_link: $$@)
 	$$(call REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBRUSTDOC_GLOB_$(4)),$$(notdir $$@))
-	$$(STAGE$(1)_T_$(4)_H_$(3)) $$(WFLAGS_ST$(1)) --out-dir $$(@D) $$< && touch $$@
+	$$(STAGE$(1)_T_$(4)_H_$(3)) $$(WFLAGS_ST$(1)) \
+		-L $$(SUNDOWN_DIR_$(4)) --out-dir $$(@D) $$< && touch $$@
 	$$(call LIST_ALL_OLD_GLOB_MATCHES_EXCEPT,$$(dir $$@),$(LIBRUSTDOC_GLOB_$(4)),$$(notdir $$@))
 
 $$(TBIN$(1)_T_$(4)_H_$(3))/rustdoc$$(X_$(4)):			\
diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs
index 1b9cb10f1dc..815ec943c49 100644
--- a/src/librustc/back/link.rs
+++ b/src/librustc/back/link.rs
@@ -16,7 +16,7 @@ use lib::llvm::llvm;
 use lib::llvm::ModuleRef;
 use lib;
 use metadata::common::LinkMeta;
-use metadata::{encoder, csearch, cstore, filesearch};
+use metadata::{encoder, cstore, filesearch};
 use middle::trans::context::CrateContext;
 use middle::trans::common::gensym_name;
 use middle::ty;
@@ -1043,14 +1043,6 @@ pub fn link_args(sess: Session,
     let ula = cstore::get_used_link_args(cstore);
     for arg in ula.iter() { args.push(arg.to_owned()); }
 
-    // Add all the link args for external crates.
-    do cstore::iter_crate_data(cstore) |crate_num, _| {
-        let link_args = csearch::get_link_args_for_crate(cstore, crate_num);
-        for link_arg in link_args.move_iter() {
-            args.push(link_arg);
-        }
-    }
-
     // # Extern library linking
 
     // User-supplied library search paths (-L on the cammand line) These are
diff --git a/src/librustc/lib/llvm.rs b/src/librustc/lib/llvm.rs
index 4eb8a0b8fa6..e152d009050 100644
--- a/src/librustc/lib/llvm.rs
+++ b/src/librustc/lib/llvm.rs
@@ -304,8 +304,7 @@ pub mod llvm {
     use super::debuginfo::*;
     use std::libc::{c_char, c_int, c_longlong, c_ushort, c_uint, c_ulonglong};
 
-    #[link_args = "-Lrustllvm -lrustllvm"]
-    #[link_name = "rustllvm"]
+    #[link_args = "-lrustllvm"]
     extern {
         /* Create and destroy contexts. */
         pub fn LLVMContextCreate() -> ContextRef;
diff --git a/src/librustc/metadata/csearch.rs b/src/librustc/metadata/csearch.rs
index 617051c217f..48fe21b3343 100644
--- a/src/librustc/metadata/csearch.rs
+++ b/src/librustc/metadata/csearch.rs
@@ -261,13 +261,6 @@ pub fn get_item_visibility(cstore: @mut cstore::CStore,
     decoder::get_item_visibility(cdata, def_id.node)
 }
 
-pub fn get_link_args_for_crate(cstore: @mut cstore::CStore,
-                               crate_num: ast::CrateNum)
-                            -> ~[~str] {
-    let cdata = cstore::get_crate_data(cstore, crate_num);
-    decoder::get_link_args_for_crate(cdata)
-}
-
 pub fn each_impl(cstore: @mut cstore::CStore,
                  crate_num: ast::CrateNum,
                  callback: &fn(ast::DefId)) {
diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs
index aca41f5f4cb..56abaa27cce 100644
--- a/src/librustc/metadata/decoder.rs
+++ b/src/librustc/metadata/decoder.rs
@@ -1456,16 +1456,6 @@ pub fn translate_def_id(cdata: Cmd, did: ast::DefId) -> ast::DefId {
     }
 }
 
-pub fn get_link_args_for_crate(cdata: Cmd) -> ~[~str] {
-    let link_args = reader::get_doc(reader::Doc(cdata.data), tag_link_args);
-    let mut result = ~[];
-    do reader::tagged_docs(link_args, tag_link_args_arg) |arg_doc| {
-        result.push(arg_doc.as_str());
-        true
-    };
-    result
-}
-
 pub fn each_impl(cdata: Cmd, callback: &fn(ast::DefId)) {
     let impls_doc = reader::get_doc(reader::Doc(cdata.data), tag_impls);
     let _ = do reader::tagged_docs(impls_doc, tag_impls_impl) |impl_doc| {
diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs
index 86c4ca0158f..1ad7e416342 100644
--- a/src/librustc/metadata/encoder.rs
+++ b/src/librustc/metadata/encoder.rs
@@ -75,7 +75,6 @@ struct Stats {
     attr_bytes: u64,
     dep_bytes: u64,
     lang_item_bytes: u64,
-    link_args_bytes: u64,
     impl_bytes: u64,
     misc_bytes: u64,
     item_bytes: u64,
@@ -1610,19 +1609,6 @@ fn encode_lang_items(ecx: &EncodeContext, ebml_w: &mut writer::Encoder) {
     ebml_w.end_tag();   // tag_lang_items
 }
 
-fn encode_link_args(ecx: &EncodeContext, ebml_w: &mut writer::Encoder) {
-    ebml_w.start_tag(tag_link_args);
-
-    let link_args = cstore::get_used_link_args(ecx.cstore);
-    for link_arg in link_args.iter() {
-        ebml_w.start_tag(tag_link_args_arg);
-        ebml_w.writer.write(link_arg.as_bytes());
-        ebml_w.end_tag();
-    }
-
-    ebml_w.end_tag();
-}
-
 struct ImplVisitor<'self> {
     ecx: &'self EncodeContext<'self>,
     ebml_w: &'self mut writer::Encoder,
@@ -1740,7 +1726,6 @@ pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] {
         attr_bytes: 0,
         dep_bytes: 0,
         lang_item_bytes: 0,
-        link_args_bytes: 0,
         impl_bytes: 0,
         misc_bytes: 0,
         item_bytes: 0,
@@ -1797,11 +1782,6 @@ pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] {
     encode_lang_items(&ecx, &mut ebml_w);
     ecx.stats.lang_item_bytes = wr.tell() - i;
 
-    // Encode the link args.
-    i = wr.tell();
-    encode_link_args(&ecx, &mut ebml_w);
-    ecx.stats.link_args_bytes = wr.tell() - i;
-
     // Encode the def IDs of impls, for coherence checking.
     i = wr.tell();
     encode_impls(&ecx, crate, &mut ebml_w);
@@ -1838,7 +1818,6 @@ pub fn encode_metadata(parms: EncodeParams, crate: &Crate) -> ~[u8] {
         println!(" attribute bytes: {}", ecx.stats.attr_bytes);
         println!("       dep bytes: {}", ecx.stats.dep_bytes);
         println!(" lang item bytes: {}", ecx.stats.lang_item_bytes);
-        println!(" link args bytes: {}", ecx.stats.link_args_bytes);
         println!("      impl bytes: {}", ecx.stats.impl_bytes);
         println!("      misc bytes: {}", ecx.stats.misc_bytes);
         println!("      item bytes: {}", ecx.stats.item_bytes);
diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs
index f4a61e87993..fbe7a965615 100644
--- a/src/librustdoc/html/markdown.rs
+++ b/src/librustdoc/html/markdown.rs
@@ -69,6 +69,7 @@ struct buf {
 }
 
 // sundown FFI
+#[link_args = "-lsundown"]
 extern {
     fn sdhtml_renderer(callbacks: *sd_callbacks,
                        options_ptr: *html_renderopt,
diff --git a/src/librustuv/uvll.rs b/src/librustuv/uvll.rs
index f80178cfa4c..9e86ab11286 100644
--- a/src/librustuv/uvll.rs
+++ b/src/librustuv/uvll.rs
@@ -1003,6 +1003,8 @@ pub struct uv_err_data {
     err_msg: ~str,
 }
 
+// uv_support is the result of compiling rust_uv.cpp
+#[link_args = "-luv_support -luv"]
 extern {
 
     fn rust_uv_handle_size(type_: uintptr_t) -> size_t;
@@ -1172,3 +1174,13 @@ extern {
                             signum: c_int) -> c_int;
     fn rust_uv_signal_stop(handle: *uv_signal_t) -> c_int;
 }
+
+// libuv requires various system libraries to successfully link on some
+// platforms
+#[cfg(target_os = "linux")]
+#[link_args = "-lpthread"]
+extern {}
+
+#[cfg(target_os = "win32")]
+#[link_args = "-lWs2_32 -lpsapi -liphlpapi"]
+extern {}
diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in
index 60e4d3abd7a..275966583d9 100644
--- a/src/rt/rustrt.def.in
+++ b/src/rt/rustrt.def.in
@@ -26,92 +26,6 @@ rust_win32_rand_gen
 rust_win32_rand_release
 upcall_rust_personality
 upcall_reset_stack_limit
-rust_uv_loop_new
-rust_uv_loop_delete
-rust_uv_walk
-rust_uv_loop_set_data
-rust_uv_run
-rust_uv_close
-rust_uv_async_send
-rust_uv_async_init
-rust_uv_timer_init
-rust_uv_timer_start
-rust_uv_timer_stop
-rust_uv_tcp_init
-rust_uv_buf_init
-rust_uv_strerror
-rust_uv_err_name
-rust_uv_ip4_addr
-rust_uv_ip4_name
-rust_uv_ip6_addr
-rust_uv_ip6_name
-rust_uv_tcp_connect
-rust_uv_tcp_bind
-rust_uv_tcp_connect6
-rust_uv_tcp_bind6
-rust_uv_tcp_getsockname
-rust_uv_tcp_nodelay
-rust_uv_tcp_keepalive
-rust_uv_tcp_simultaneous_accepts
-rust_uv_udp_init
-rust_uv_udp_bind
-rust_uv_udp_bind6
-rust_uv_udp_send
-rust_uv_udp_send6
-rust_uv_udp_recv_start
-rust_uv_udp_recv_stop
-rust_uv_get_udp_handle_from_send_req
-rust_uv_udp_getsockname
-rust_uv_udp_set_membership
-rust_uv_udp_set_multicast_loop
-rust_uv_udp_set_multicast_ttl
-rust_uv_udp_set_ttl
-rust_uv_udp_set_broadcast
-rust_uv_is_ipv4_sockaddr
-rust_uv_is_ipv6_sockaddr
-rust_uv_malloc_sockaddr_storage
-rust_uv_free_sockaddr_storage
-rust_uv_listen
-rust_uv_accept
-rust_uv_write
-rust_uv_read_start
-rust_uv_read_stop
-rust_uv_is_ipv4_addrinfo
-rust_uv_is_ipv6_addrinfo
-rust_uv_get_next_addrinfo
-rust_uv_addrinfo_as_sockaddr_in
-rust_uv_addrinfo_as_sockaddr_in6
-rust_uv_get_stream_handle_from_connect_req
-rust_uv_get_stream_handle_from_write_req
-rust_uv_get_loop_for_uv_handle
-rust_uv_get_data_for_uv_loop
-rust_uv_set_data_for_uv_loop
-rust_uv_get_data_for_uv_handle
-rust_uv_set_data_for_uv_handle
-rust_uv_get_data_for_req
-rust_uv_set_data_for_req
-rust_uv_get_base_from_buf
-rust_uv_get_len_from_buf
-rust_uv_getaddrinfo
-rust_uv_freeaddrinfo
-rust_uv_idle_init
-rust_uv_idle_start
-rust_uv_idle_stop
-rust_uv_fs_open
-rust_uv_fs_unlink
-rust_uv_fs_write
-rust_uv_fs_read
-rust_uv_fs_close
-rust_uv_get_result_from_fs_req
-rust_uv_get_ptr_from_fs_req
-rust_uv_get_loop_from_fs_req
-rust_uv_fs_stat
-rust_uv_fs_fstat
-rust_uv_fs_req_cleanup
-rust_uv_populate_uv_stat
-rust_uv_fs_mkdir
-rust_uv_fs_rmdir
-rust_uv_fs_readdir
 rust_dbg_lock_create
 rust_dbg_lock_destroy
 rust_dbg_lock_lock
@@ -128,9 +42,6 @@ rust_signal_little_lock
 rust_wait_little_lock
 tdefl_compress_mem_to_heap
 tinfl_decompress_mem_to_heap
-rust_uv_ip4_port
-rust_uv_ip6_port
-rust_uv_tcp_getpeername
 rust_raw_thread_start
 rust_raw_thread_join
 rust_raw_thread_delete
@@ -150,14 +61,6 @@ rust_dbg_extern_return_TwoU32s
 rust_dbg_extern_return_TwoU64s
 rust_dbg_extern_identity_double
 rust_dbg_extern_identity_u8
-rust_uv_handle_size
-rust_uv_req_size
-rust_uv_handle_type_max
-rust_uv_req_type_max
-rust_uv_ip4_addrp
-rust_uv_ip6_addrp
-rust_uv_free_ip4_addr
-rust_uv_free_ip6_addr
 rust_initialize_rt_tls_key
 rust_dbg_next_port
 rust_try
@@ -172,29 +75,5 @@ rust_get_global_args_ptr
 rust_take_global_args_lock
 rust_drop_global_args_lock
 rust_get_test_int
-rust_uv_get_loop_from_getaddrinfo_req
-rust_uv_spawn
-rust_uv_process_kill
-rust_set_stdio_container_flags
-rust_set_stdio_container_fd
-rust_set_stdio_container_stream
-rust_uv_process_pid
-rust_uv_pipe_init
-rust_uv_signal_init
-rust_uv_signal_start
-rust_uv_signal_stop
-sdhtml_renderer
-sd_markdown_new
-sd_markdown_render
-sd_markdown_free
-bufrelease
-bufnew
 rust_take_dlerror_lock
 rust_drop_dlerror_lock
-rust_uv_pipe_open
-rust_uv_pipe_bind
-rust_uv_pipe_connect
-rust_uv_tty_init
-rust_uv_tty_set_mode
-rust_uv_tty_get_winsize
-rust_uv_guess_handle