diff options
| author | Luqman Aden <me@luqman.ca> | 2013-09-21 19:48:12 -0700 |
|---|---|---|
| committer | Luqman Aden <laden@csclub.uwaterloo.ca> | 2013-09-23 18:26:16 -0400 |
| commit | 20a10ff9c922722da66d52caacee544c7e1ab03d (patch) | |
| tree | af654166e0a3851262248d1ff5557a5345e561d6 /src/libstd | |
| parent | 2d22c0c8e4b32d563abf2aaf5630b089b3564f27 (diff) | |
| download | rust-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.rs | 23 | ||||
| -rw-r--r-- | src/libstd/unstable/dynamic_lib.rs | 4 |
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; |
