about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorLuqman Aden <me@luqman.ca>2013-09-21 19:48:12 -0700
committerLuqman Aden <laden@csclub.uwaterloo.ca>2013-09-23 18:26:16 -0400
commit20a10ff9c922722da66d52caacee544c7e1ab03d (patch)
treeaf654166e0a3851262248d1ff5557a5345e561d6 /src/libstd
parent2d22c0c8e4b32d563abf2aaf5630b089b3564f27 (diff)
downloadrust-20a10ff9c922722da66d52caacee544c7e1ab03d.tar.gz
rust-20a10ff9c922722da66d52caacee544c7e1ab03d.zip
Find the cratemap at runtime on windows.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/rt/crate_map.rs23
-rw-r--r--src/libstd/unstable/dynamic_lib.rs4
2 files changed, 23 insertions, 4 deletions
diff --git a/src/libstd/rt/crate_map.rs b/src/libstd/rt/crate_map.rs
index e4c3763be96..f73aa1fad67 100644
--- a/src/libstd/rt/crate_map.rs
+++ b/src/libstd/rt/crate_map.rs
@@ -23,8 +23,8 @@ use container::MutableSet;
 #[link_args = "-undefined dynamic_lookup"]
 extern {}
 
+#[cfg(not(stage0), not(windows))]
 extern {
-    #[cfg(not(stage0))]
     #[weak_linkage]
     #[link_name = "_rust_crate_map_toplevel"]
     static CRATE_MAP: CrateMap;
@@ -48,11 +48,30 @@ struct CrateMap {
     children: [*CrateMap, ..1]
 }
 
-#[cfg(not(stage0))]
+#[cfg(not(stage0), not(windows))]
 pub fn get_crate_map() -> *CrateMap {
     &'static CRATE_MAP as *CrateMap
 }
 
+#[cfg(not(stage0), windows)]
+#[fixed_stack_segment]
+#[inline(never)]
+pub fn get_crate_map() -> *CrateMap {
+    use c_str::ToCStr;
+    use unstable::dynamic_lib::dl;
+
+    let sym = unsafe {
+        let module = dl::open_internal();
+        let sym = do "__rust_crate_map_toplevel".with_c_str |buf| {
+            dl::symbol(module, buf)
+        };
+        dl::close(module);
+        sym
+    };
+
+    sym as *CrateMap
+}
+
 unsafe fn version(crate_map: *CrateMap) -> i32 {
     match (*crate_map).version {
         1 => return 1,
diff --git a/src/libstd/unstable/dynamic_lib.rs b/src/libstd/unstable/dynamic_lib.rs
index 4c92d9c2e36..41ff79bc884 100644
--- a/src/libstd/unstable/dynamic_lib.rs
+++ b/src/libstd/unstable/dynamic_lib.rs
@@ -138,7 +138,7 @@ mod test {
 #[cfg(target_os = "android")]
 #[cfg(target_os = "macos")]
 #[cfg(target_os = "freebsd")]
-mod dl {
+pub mod dl {
     use c_str::ToCStr;
     use libc;
     use path;
@@ -207,7 +207,7 @@ mod dl {
 }
 
 #[cfg(target_os = "win32")]
-mod dl {
+pub mod dl {
     use os;
     use libc;
     use path;