@@ -26,7 +26,7 @@ use rustc_lint_defs::builtin::LINKER_INFO;
2626use rustc_macros:: Diagnostic ;
2727use rustc_metadata:: fs:: { METADATA_FILENAME , copy_to_stdout, emit_wrapper_file} ;
2828use rustc_metadata:: {
29- EncodedMetadata , NativeLibSearchFallback , find_native_static_library,
29+ EncodedMetadata , NativeLibSearchFallback , find_bundled_library , find_native_static_library,
3030 walk_native_lib_search_dirs,
3131} ;
3232use rustc_middle:: bug;
@@ -329,8 +329,25 @@ fn link_rlib<'a>(
329329 . map ( |obj| obj. file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) . to_string ( ) )
330330 . collect ( ) ;
331331
332+ let native_lib_filenames: Vec < Option < Symbol > > = crate_info
333+ . used_libraries
334+ . iter ( )
335+ . map ( |lib| {
336+ find_bundled_library (
337+ lib. name ,
338+ Some ( lib. verbatim ) ,
339+ lib. kind ,
340+ lib. cfg . is_some ( ) ,
341+ sess,
342+ & crate_info. crate_types ,
343+ )
344+ } )
345+ . collect ( ) ;
346+
332347 let metadata_link_file = if matches ! ( flavor, RlibFlavor :: Normal ) {
333- let metadata_link = rmeta_link:: RmetaLink { rust_object_files } ;
348+ let native_lib_filenames: Vec < Option < String > > =
349+ native_lib_filenames. iter ( ) . map ( |f| f. map ( |s| s. to_string ( ) ) ) . collect ( ) ;
350+ let metadata_link = rmeta_link:: RmetaLink { rust_object_files, native_lib_filenames } ;
334351 let metadata_link_data = metadata_link. encode ( ) ;
335352 let ( wrapper, _) =
336353 create_wrapper_file ( sess, rmeta_link:: SECTION . to_string ( ) , & metadata_link_data) ;
@@ -413,12 +430,12 @@ fn link_rlib<'a>(
413430 // feature then we'll need to figure out how to record what objects were
414431 // loaded from the libraries found here and then encode that into the
415432 // metadata of the rlib we're generating somehow.
416- for lib in crate_info. used_libraries . iter ( ) {
433+ for ( i , lib) in crate_info. used_libraries . iter ( ) . enumerate ( ) {
417434 let NativeLibKind :: Static { bundle : None | Some ( true ) , .. } = lib. kind else {
418435 continue ;
419436 } ;
420437 if flavor == RlibFlavor :: Normal
421- && let Some ( filename) = lib . filename
438+ && let Some ( filename) = native_lib_filenames [ i ]
422439 {
423440 let path = find_native_static_library ( filename. as_str ( ) , true , sess) ;
424441 let src = read ( path)
@@ -532,11 +549,21 @@ fn link_staticlib(
532549 let lto = are_upstream_rust_objects_already_included ( sess)
533550 && !ignored_for_lto ( sess, crate_info, cnum) ;
534551
535- let native_libs = crate_info. native_libraries [ & cnum] . iter ( ) ;
536- let relevant = native_libs. clone ( ) . filter ( |lib| relevant_lib ( sess, lib) ) ;
537- let relevant_libs: FxIndexSet < _ > = relevant. filter_map ( |lib| lib. filename ) . collect ( ) ;
552+ let native_libs = & crate_info. native_libraries [ & cnum] ;
553+ let bundled_filenames =
554+ rmeta_link_cache. native_lib_filenames ( & sess. target , path, native_libs) ;
555+ let relevant_libs: FxIndexSet < _ > = native_libs
556+ . iter ( )
557+ . enumerate ( )
558+ . filter ( |( _, lib) | relevant_lib ( sess, lib) )
559+ . filter_map ( |( i, _) | bundled_filenames. get ( i) . copied ( ) . flatten ( ) )
560+ . collect ( ) ;
538561
539- let bundled_libs: FxIndexSet < _ > = native_libs. filter_map ( |lib| lib. filename ) . collect ( ) ;
562+ let bundled_libs: FxIndexSet < _ > = native_libs
563+ . iter ( )
564+ . enumerate ( )
565+ . filter_map ( |( i, _) | bundled_filenames. get ( i) . copied ( ) . flatten ( ) )
566+ . collect ( ) ;
540567 ab. add_archive (
541568 path,
542569 AddArchiveKind :: Rlib ( rmeta_link_cache, & |fname : & str , entry_kind| {
@@ -2739,6 +2766,7 @@ fn linker_with_args(
27392766 cmd,
27402767 sess,
27412768 archive_builder_builder,
2769+ rmeta_link_cache,
27422770 crate_info,
27432771 tmpdir,
27442772 link_output_kind,
@@ -2761,6 +2789,7 @@ fn linker_with_args(
27612789 cmd,
27622790 sess,
27632791 archive_builder_builder,
2792+ rmeta_link_cache,
27642793 crate_info,
27652794 tmpdir,
27662795 link_output_kind,
@@ -3060,6 +3089,7 @@ fn add_native_libs_from_crate(
30603089 cmd : & mut dyn Linker ,
30613090 sess : & Session ,
30623091 archive_builder_builder : & dyn ArchiveBuilderBuilder ,
3092+ rmeta_link_cache : & mut RmetaLinkCache ,
30633093 crate_info : & CrateInfo ,
30643094 tmpdir : & Path ,
30653095 bundled_libs : & FxIndexSet < Symbol > ,
@@ -3083,13 +3113,38 @@ fn add_native_libs_from_crate(
30833113 . unwrap_or_else ( |e| sess. dcx ( ) . emit_fatal ( e) ) ;
30843114 }
30853115
3086- let native_libs = match cnum {
3087- LOCAL_CRATE => & crate_info. used_libraries ,
3088- _ => & crate_info. native_libraries [ & cnum] ,
3116+ let ( native_libs, bundled_filenames) : ( & Vec < NativeLib > , Vec < Option < Symbol > > ) = match cnum {
3117+ LOCAL_CRATE => {
3118+ let libs = & crate_info. used_libraries ;
3119+ let filenames = libs
3120+ . iter ( )
3121+ . map ( |lib| {
3122+ find_bundled_library (
3123+ lib. name ,
3124+ Some ( lib. verbatim ) ,
3125+ lib. kind ,
3126+ lib. cfg . is_some ( ) ,
3127+ sess,
3128+ & crate_info. crate_types ,
3129+ )
3130+ } )
3131+ . collect ( ) ;
3132+ ( libs, filenames)
3133+ }
3134+ _ => {
3135+ let native_libs = & crate_info. native_libraries [ & cnum] ;
3136+ let filenames =
3137+ if let Some ( rlib_path) = crate_info. used_crate_source [ & cnum] . rlib . as_ref ( ) {
3138+ rmeta_link_cache. native_lib_filenames ( & sess. target , rlib_path, native_libs)
3139+ } else {
3140+ Vec :: new ( )
3141+ } ;
3142+ ( native_libs, filenames)
3143+ }
30893144 } ;
30903145
30913146 let mut last = ( None , NativeLibKind :: Unspecified , false ) ;
3092- for lib in native_libs {
3147+ for ( i , lib) in native_libs. iter ( ) . enumerate ( ) {
30933148 if !relevant_lib ( sess, lib) {
30943149 continue ;
30953150 }
@@ -3109,7 +3164,7 @@ fn add_native_libs_from_crate(
31093164 let bundle = bundle. unwrap_or ( true ) ;
31103165 let whole_archive = whole_archive == Some ( true ) ;
31113166 if bundle && cnum != LOCAL_CRATE {
3112- if let Some ( filename) = lib . filename {
3167+ if let Some ( filename) = bundled_filenames . get ( i ) . copied ( ) . flatten ( ) {
31133168 // If rlib contains native libs as archives, they are unpacked to tmpdir.
31143169 let path = tmpdir. join ( filename. as_str ( ) ) ;
31153170 cmd. link_staticlib_by_path ( & path, whole_archive) ;
@@ -3161,6 +3216,7 @@ fn add_local_native_libraries(
31613216 cmd : & mut dyn Linker ,
31623217 sess : & Session ,
31633218 archive_builder_builder : & dyn ArchiveBuilderBuilder ,
3219+ rmeta_link_cache : & mut RmetaLinkCache ,
31643220 crate_info : & CrateInfo ,
31653221 tmpdir : & Path ,
31663222 link_output_kind : LinkOutputKind ,
@@ -3172,6 +3228,7 @@ fn add_local_native_libraries(
31723228 cmd,
31733229 sess,
31743230 archive_builder_builder,
3231+ rmeta_link_cache,
31753232 crate_info,
31763233 tmpdir,
31773234 & Default :: default ( ) ,
@@ -3231,10 +3288,17 @@ fn add_upstream_rust_crates(
32313288 match linkage {
32323289 Linkage :: Static | Linkage :: IncludedFromDylib | Linkage :: NotLinked => {
32333290 if link_static_crate {
3234- bundled_libs = crate_info. native_libraries [ & cnum]
3235- . iter ( )
3236- . filter_map ( |lib| lib. filename )
3237- . collect ( ) ;
3291+ if let Some ( rlib_path) = crate_info. used_crate_source [ & cnum] . rlib . as_ref ( ) {
3292+ bundled_libs = rmeta_link_cache
3293+ . native_lib_filenames (
3294+ & sess. target ,
3295+ rlib_path,
3296+ & crate_info. native_libraries [ & cnum] ,
3297+ )
3298+ . into_iter ( )
3299+ . flatten ( )
3300+ . collect ( ) ;
3301+ }
32383302 add_static_crate (
32393303 cmd,
32403304 sess,
@@ -3268,6 +3332,7 @@ fn add_upstream_rust_crates(
32683332 cmd,
32693333 sess,
32703334 archive_builder_builder,
3335+ rmeta_link_cache,
32713336 crate_info,
32723337 tmpdir,
32733338 & bundled_libs,
@@ -3283,6 +3348,7 @@ fn add_upstream_native_libraries(
32833348 cmd : & mut dyn Linker ,
32843349 sess : & Session ,
32853350 archive_builder_builder : & dyn ArchiveBuilderBuilder ,
3351+ rmeta_link_cache : & mut RmetaLinkCache ,
32863352 crate_info : & CrateInfo ,
32873353 tmpdir : & Path ,
32883354 link_output_kind : LinkOutputKind ,
@@ -3306,6 +3372,7 @@ fn add_upstream_native_libraries(
33063372 cmd,
33073373 sess,
33083374 archive_builder_builder,
3375+ rmeta_link_cache,
33093376 crate_info,
33103377 tmpdir,
33113378 & Default :: default ( ) ,
0 commit comments