@@ -849,26 +849,34 @@ impl CrateInfo {
849
849
850
850
// Handle circular dependencies in the standard library.
851
851
// See comment before `add_linked_symbol_object` function for the details.
852
- let missing_weak_lang_items: FxHashSet < & Symbol > = info
853
- . used_crates
854
- . iter ( )
855
- . flat_map ( |cnum| {
856
- tcx. missing_lang_items ( * cnum)
857
- . iter ( )
858
- . filter ( |l| lang_items:: required ( tcx, * * l) )
859
- . filter_map ( |item| WEAK_ITEMS_SYMBOLS . get ( item) )
860
- } )
861
- . collect ( ) ;
862
- info. linked_symbols
863
- . iter_mut ( )
864
- . filter ( |( crate_type, _) | !matches ! ( crate_type, CrateType :: Rlib | CrateType :: Staticlib ) )
865
- . for_each ( |( _, linked_symbols) | {
866
- linked_symbols. extend (
867
- missing_weak_lang_items
852
+ // With msvc-like linkers it's both unnecessary (they support circular dependencies),
853
+ // and causes linking issues (when weak lang item symbols are "privatized" by LTO).
854
+ let target = & tcx. sess . target ;
855
+ if !target. is_like_msvc {
856
+ let missing_weak_lang_items: FxHashSet < & Symbol > = info
857
+ . used_crates
858
+ . iter ( )
859
+ . flat_map ( |cnum| {
860
+ tcx. missing_lang_items ( * cnum)
868
861
. iter ( )
869
- . map ( |item| ( item. to_string ( ) , SymbolExportKind :: Text ) ) ,
870
- )
871
- } ) ;
862
+ . filter ( |l| lang_items:: required ( tcx, * * l) )
863
+ . filter_map ( |item| WEAK_ITEMS_SYMBOLS . get ( item) )
864
+ } )
865
+ . collect ( ) ;
866
+ let prefix = if target. is_like_windows && target. arch == "x86" { "_" } else { "" } ;
867
+ info. linked_symbols
868
+ . iter_mut ( )
869
+ . filter ( |( crate_type, _) | {
870
+ !matches ! ( crate_type, CrateType :: Rlib | CrateType :: Staticlib )
871
+ } )
872
+ . for_each ( |( _, linked_symbols) | {
873
+ linked_symbols. extend (
874
+ missing_weak_lang_items
875
+ . iter ( )
876
+ . map ( |item| ( format ! ( "{prefix}{item}" ) , SymbolExportKind :: Text ) ) ,
877
+ )
878
+ } ) ;
879
+ }
872
880
873
881
let embed_visualizers = tcx. sess . crate_types ( ) . iter ( ) . any ( |& crate_type| match crate_type {
874
882
CrateType :: Executable | CrateType :: Dylib | CrateType :: Cdylib => {
@@ -888,7 +896,7 @@ impl CrateInfo {
888
896
}
889
897
} ) ;
890
898
891
- if tcx . sess . target . is_like_msvc && embed_visualizers {
899
+ if target. is_like_msvc && embed_visualizers {
892
900
info. natvis_debugger_visualizers =
893
901
collect_debugger_visualizers_transitive ( tcx, DebuggerVisualizerType :: Natvis ) ;
894
902
}
0 commit comments