diff options
Diffstat (limited to 'src/libstd/rt')
| -rw-r--r-- | src/libstd/rt/crate_map.rs | 23 |
1 files changed, 21 insertions, 2 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, |
