@@ -167,6 +167,7 @@ pub fn link_binary(
167167 crate_type,
168168 & out_filename,
169169 & codegen_results,
170+ & metadata,
170171 path. as_ref ( ) ,
171172 ) ;
172173 }
@@ -230,11 +231,7 @@ pub fn link_binary(
230231 let remove_temps_from_module =
231232 |module : & CompiledModule | maybe_remove_temps_from_module ( false , false , module) ;
232233
233- // Otherwise, always remove the metadata and allocator module temporaries.
234- if let Some ( ref metadata_module) = codegen_results. metadata_module {
235- remove_temps_from_module ( metadata_module) ;
236- }
237-
234+ // Otherwise, always remove the allocator module temporaries.
238235 if let Some ( ref allocator_module) = codegen_results. allocator_module {
239236 remove_temps_from_module ( allocator_module) ;
240237 }
@@ -326,7 +323,7 @@ fn link_rlib<'a>(
326323 RlibFlavor :: Normal => {
327324 let ( metadata, metadata_position) =
328325 create_wrapper_file ( sess, ".rmeta" . to_string ( ) , metadata. stub_or_full ( ) ) ;
329- let metadata = emit_wrapper_file ( sess, & metadata, tmpdir, METADATA_FILENAME ) ;
326+ let metadata = emit_wrapper_file ( sess, & metadata, tmpdir. as_ref ( ) , METADATA_FILENAME ) ;
330327 match metadata_position {
331328 MetadataPosition :: First => {
332329 // Most of the time metadata in rlib files is wrapped in a "dummy" object
@@ -394,7 +391,7 @@ fn link_rlib<'a>(
394391 let src = read ( path)
395392 . unwrap_or_else ( |e| sess. dcx ( ) . emit_fatal ( errors:: ReadFileError { message : e } ) ) ;
396393 let ( data, _) = create_wrapper_file ( sess, ".bundled_lib" . to_string ( ) , & src) ;
397- let wrapper_file = emit_wrapper_file ( sess, & data, tmpdir, filename. as_str ( ) ) ;
394+ let wrapper_file = emit_wrapper_file ( sess, & data, tmpdir. as_ref ( ) , filename. as_str ( ) ) ;
398395 packed_bundled_libs. push ( wrapper_file) ;
399396 } else {
400397 let path = find_native_static_library ( lib. name . as_str ( ) , lib. verbatim , sess) ;
@@ -698,6 +695,7 @@ fn link_natively(
698695 crate_type : CrateType ,
699696 out_filename : & Path ,
700697 codegen_results : & CodegenResults ,
698+ metadata : & EncodedMetadata ,
701699 tmpdir : & Path ,
702700) {
703701 info ! ( "preparing {:?} to {:?}" , crate_type, out_filename) ;
@@ -722,6 +720,7 @@ fn link_natively(
722720 tmpdir,
723721 temp_filename,
724722 codegen_results,
723+ metadata,
725724 self_contained_components,
726725 ) ;
727726
@@ -2098,17 +2097,25 @@ fn add_local_crate_allocator_objects(cmd: &mut dyn Linker, codegen_results: &Cod
20982097/// Add object files containing metadata for the current crate.
20992098fn add_local_crate_metadata_objects (
21002099 cmd : & mut dyn Linker ,
2100+ sess : & Session ,
2101+ archive_builder_builder : & dyn ArchiveBuilderBuilder ,
21012102 crate_type : CrateType ,
2103+ tmpdir : & Path ,
21022104 codegen_results : & CodegenResults ,
2105+ metadata : & EncodedMetadata ,
21032106) {
21042107 // When linking a dynamic library, we put the metadata into a section of the
21052108 // executable. This metadata is in a separate object file from the main
2106- // object file, so we link that in here.
2107- if matches ! ( crate_type, CrateType :: Dylib | CrateType :: ProcMacro )
2108- && let Some ( m) = & codegen_results. metadata_module
2109- && let Some ( obj) = & m. object
2110- {
2111- cmd. add_object ( obj) ;
2109+ // object file, so we create and link it in here.
2110+ if matches ! ( crate_type, CrateType :: Dylib | CrateType :: ProcMacro ) {
2111+ let data = archive_builder_builder. create_dylib_metadata_wrapper (
2112+ sess,
2113+ & metadata,
2114+ & codegen_results. crate_info . metadata_symbol ,
2115+ ) ;
2116+ let obj = emit_wrapper_file ( sess, & data, tmpdir, "rmeta.o" ) ;
2117+
2118+ cmd. add_object ( & obj) ;
21122119 }
21132120}
21142121
@@ -2198,6 +2205,7 @@ fn linker_with_args(
21982205 tmpdir : & Path ,
21992206 out_filename : & Path ,
22002207 codegen_results : & CodegenResults ,
2208+ metadata : & EncodedMetadata ,
22012209 self_contained_components : LinkSelfContainedComponents ,
22022210) -> Command {
22032211 let self_contained_crt_objects = self_contained_components. is_crt_objects_enabled ( ) ;
@@ -2272,7 +2280,15 @@ fn linker_with_args(
22722280 // in this DAG so far because they can only depend on other native libraries
22732281 // and such dependencies are also required to be specified.
22742282 add_local_crate_regular_objects ( cmd, codegen_results) ;
2275- add_local_crate_metadata_objects ( cmd, crate_type, codegen_results) ;
2283+ add_local_crate_metadata_objects (
2284+ cmd,
2285+ sess,
2286+ archive_builder_builder,
2287+ crate_type,
2288+ tmpdir,
2289+ codegen_results,
2290+ metadata,
2291+ ) ;
22762292 add_local_crate_allocator_objects ( cmd, codegen_results) ;
22772293
22782294 // Avoid linking to dynamic libraries unless they satisfy some undefined symbols
0 commit comments