diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2016-09-12 21:24:40 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2016-09-12 21:52:02 -0700 |
| commit | 2140c4ba36301a71f43f4d488c45bc8ca27bf386 (patch) | |
| tree | 49d28dd816bbef714cf59e457113a06bf447fe92 | |
| parent | 521ffe9dbe8ed03ea8b2efdfe2b2bc1d6e1d7847 (diff) | |
| download | rust-2140c4ba36301a71f43f4d488c45bc8ca27bf386.tar.gz rust-2140c4ba36301a71f43f4d488c45bc8ca27bf386.zip | |
rustc: Always link compiler-builtins last
All crates depend on compiler-builtins, so we need to always include the crate last.
| -rw-r--r-- | src/librustc_trans/back/link.rs | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index 3ba12ddba29..3433b866691 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -926,17 +926,19 @@ fn add_upstream_rust_crates(cmd: &mut Linker, // crates. let deps = sess.cstore.used_crates(LinkagePreference::RequireDynamic); + let mut compiler_builtins = None; + for &(cnum, _) in &deps { // We may not pass all crates through to the linker. Some crates may // appear statically in an existing dylib, meaning we'll pick up all the // symbols from the dylib. let src = sess.cstore.used_crate_source(cnum); match data[cnum as usize - 1] { - // We must always link the `compiler_builtins` crate statically. Even if it was already - // "included" in a dylib (e.g. `libstd` when `-C prefer-dynamic` is used) + // compiler-builtins are always placed last to ensure that they're + // linked correctly. _ if sess.cstore.is_compiler_builtins(cnum) => { - add_static_crate(cmd, sess, tmpdir, crate_type, - &src.rlib.unwrap().0, sess.cstore.is_no_builtins(cnum)) + assert!(compiler_builtins.is_none()); + compiler_builtins = Some(cnum); } Linkage::NotLinked | Linkage::IncludedFromDylib => {} @@ -950,6 +952,15 @@ fn add_upstream_rust_crates(cmd: &mut Linker, } } + // We must always link the `compiler_builtins` crate statically. Even if it + // was already "included" in a dylib (e.g. `libstd` when `-C prefer-dynamic` + // is used) + if let Some(cnum) = compiler_builtins { + let src = sess.cstore.used_crate_source(cnum); + add_static_crate(cmd, sess, tmpdir, crate_type, + &src.rlib.unwrap().0, sess.cstore.is_no_builtins(cnum)); + } + // Converts a library file-stem into a cc -l argument fn unlib<'a>(config: &config::Config, stem: &'a str) -> &'a str { if stem.starts_with("lib") && !config.target.options.is_like_windows { |
