@@ -940,7 +940,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker,
940940 Linkage :: IncludedFromDylib => { }
941941 Linkage :: Static => {
942942 add_static_crate ( cmd, sess, tmpdir, crate_type,
943- & src. rlib . unwrap ( ) . 0 )
943+ & src. rlib . unwrap ( ) . 0 , sess . cstore . is_no_builtins ( cnum ) )
944944 }
945945 Linkage :: Dynamic => {
946946 add_dynamic_crate ( cmd, sess, & src. dylib . unwrap ( ) . 0 )
@@ -964,12 +964,16 @@ fn add_upstream_rust_crates(cmd: &mut Linker,
964964 // * For LTO, we remove upstream object files.
965965 // * For dylibs we remove metadata and bytecode from upstream rlibs
966966 //
967- // When performing LTO, all of the bytecode from the upstream libraries has
968- // already been included in our object file output. As a result we need to
969- // remove the object files in the upstream libraries so the linker doesn't
970- // try to include them twice (or whine about duplicate symbols). We must
971- // continue to include the rest of the rlib, however, as it may contain
972- // static native libraries which must be linked in.
967+ // When performing LTO, almost(*) all of the bytecode from the upstream
968+ // libraries has already been included in our object file output. As a
969+ // result we need to remove the object files in the upstream libraries so
970+ // the linker doesn't try to include them twice (or whine about duplicate
971+ // symbols). We must continue to include the rest of the rlib, however, as
972+ // it may contain static native libraries which must be linked in.
973+ //
974+ // (*) Crates marked with `#![no_builtins]` don't participate in LTO and
975+ // their bytecode wasn't included. The object files in those libraries must
976+ // still be passed to the linker.
973977 //
974978 // When making a dynamic library, linkers by default don't include any
975979 // object files in an archive if they're not necessary to resolve the link.
@@ -989,7 +993,8 @@ fn add_upstream_rust_crates(cmd: &mut Linker,
989993 sess : & Session ,
990994 tmpdir : & Path ,
991995 crate_type : config:: CrateType ,
992- cratepath : & Path ) {
996+ cratepath : & Path ,
997+ is_a_no_builtins_crate : bool ) {
993998 if !sess. lto ( ) && crate_type != config:: CrateTypeDylib {
994999 cmd. link_rlib ( & fix_windows_verbatim_for_gcc ( cratepath) ) ;
9951000 return
@@ -1013,7 +1018,8 @@ fn add_upstream_rust_crates(cmd: &mut Linker,
10131018 }
10141019 let canonical = f. replace ( "-" , "_" ) ;
10151020 let canonical_name = name. replace ( "-" , "_" ) ;
1016- if sess. lto ( ) && canonical. starts_with ( & canonical_name) &&
1021+ if sess. lto ( ) && !is_a_no_builtins_crate &&
1022+ canonical. starts_with ( & canonical_name) &&
10171023 canonical. ends_with ( ".o" ) {
10181024 let num = & f[ name. len ( ) ..f. len ( ) - 2 ] ;
10191025 if num. len ( ) > 0 && num[ 1 ..] . parse :: < u32 > ( ) . is_ok ( ) {
0 commit comments