From 20a10ff9c922722da66d52caacee544c7e1ab03d Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Sat, 21 Sep 2013 19:48:12 -0700 Subject: Find the cratemap at runtime on windows. --- src/libstd/rt/crate_map.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'src/libstd/rt') 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, -- cgit 1.4.1-3-g733a5