@@ -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 }
@@ -224,11 +225,7 @@ pub fn link_binary(
224225 let remove_temps_from_module =
225226 |module : & CompiledModule | maybe_remove_temps_from_module ( false , false , module) ;
226227
227- // Otherwise, always remove the metadata and allocator module temporaries.
228- if let Some ( ref metadata_module) = codegen_results. metadata_module {
229- remove_temps_from_module ( metadata_module) ;
230- }
231-
228+ // Otherwise, always remove the allocator module temporaries.
232229 if let Some ( ref allocator_module) = codegen_results. allocator_module {
233230 remove_temps_from_module ( allocator_module) ;
234231 }
@@ -320,7 +317,7 @@ fn link_rlib<'a>(
320317 RlibFlavor :: Normal => {
321318 let ( metadata, metadata_position) =
322319 create_wrapper_file ( sess, ".rmeta" . to_string ( ) , metadata. stub_or_full ( ) ) ;
323- let metadata = emit_wrapper_file ( sess, & metadata, tmpdir, METADATA_FILENAME ) ;
320+ let metadata = emit_wrapper_file ( sess, & metadata, tmpdir. as_ref ( ) , METADATA_FILENAME ) ;
324321 match metadata_position {
325322 MetadataPosition :: First => {
326323 // Most of the time metadata in rlib files is wrapped in a "dummy" object
@@ -388,7 +385,7 @@ fn link_rlib<'a>(
388385 let src = read ( path)
389386 . unwrap_or_else ( |e| sess. dcx ( ) . emit_fatal ( errors:: ReadFileError { message : e } ) ) ;
390387 let ( data, _) = create_wrapper_file ( sess, ".bundled_lib" . to_string ( ) , & src) ;
391- let wrapper_file = emit_wrapper_file ( sess, & data, tmpdir, filename. as_str ( ) ) ;
388+ let wrapper_file = emit_wrapper_file ( sess, & data, tmpdir. as_ref ( ) , filename. as_str ( ) ) ;
392389 packed_bundled_libs. push ( wrapper_file) ;
393390 } else {
394391 let path = find_native_static_library ( lib. name . as_str ( ) , lib. verbatim , sess) ;
@@ -692,6 +689,7 @@ fn link_natively(
692689 crate_type : CrateType ,
693690 out_filename : & Path ,
694691 codegen_results : & CodegenResults ,
692+ metadata : & EncodedMetadata ,
695693 tmpdir : & Path ,
696694) {
697695 info ! ( "preparing {:?} to {:?}" , crate_type, out_filename) ;
@@ -716,6 +714,7 @@ fn link_natively(
716714 tmpdir,
717715 temp_filename,
718716 codegen_results,
717+ metadata,
719718 self_contained_components,
720719 ) ;
721720
@@ -2142,17 +2141,25 @@ fn add_local_crate_allocator_objects(cmd: &mut dyn Linker, codegen_results: &Cod
21422141/// Add object files containing metadata for the current crate.
21432142fn add_local_crate_metadata_objects (
21442143 cmd : & mut dyn Linker ,
2144+ sess : & Session ,
2145+ archive_builder_builder : & dyn ArchiveBuilderBuilder ,
21452146 crate_type : CrateType ,
2147+ tmpdir : & Path ,
21462148 codegen_results : & CodegenResults ,
2149+ metadata : & EncodedMetadata ,
21472150) {
21482151 // When linking a dynamic library, we put the metadata into a section of the
21492152 // executable. This metadata is in a separate object file from the main
2150- // object file, so we link that in here.
2151- if matches ! ( crate_type, CrateType :: Dylib | CrateType :: ProcMacro )
2152- && let Some ( m) = & codegen_results. metadata_module
2153- && let Some ( obj) = & m. object
2154- {
2155- cmd. add_object ( obj) ;
2153+ // object file, so we create and link it in here.
2154+ if matches ! ( crate_type, CrateType :: Dylib | CrateType :: ProcMacro ) {
2155+ let data = archive_builder_builder. create_dylib_metadata_wrapper (
2156+ sess,
2157+ & metadata,
2158+ & codegen_results. crate_info . metadata_symbol ,
2159+ ) ;
2160+ let obj = emit_wrapper_file ( sess, & data, tmpdir, "rmeta.o" ) ;
2161+
2162+ cmd. add_object ( & obj) ;
21562163 }
21572164}
21582165
@@ -2242,6 +2249,7 @@ fn linker_with_args(
22422249 tmpdir : & Path ,
22432250 out_filename : & Path ,
22442251 codegen_results : & CodegenResults ,
2252+ metadata : & EncodedMetadata ,
22452253 self_contained_components : LinkSelfContainedComponents ,
22462254) -> Command {
22472255 let self_contained_crt_objects = self_contained_components. is_crt_objects_enabled ( ) ;
@@ -2316,7 +2324,15 @@ fn linker_with_args(
23162324 // in this DAG so far because they can only depend on other native libraries
23172325 // and such dependencies are also required to be specified.
23182326 add_local_crate_regular_objects ( cmd, codegen_results) ;
2319- add_local_crate_metadata_objects ( cmd, crate_type, codegen_results) ;
2327+ add_local_crate_metadata_objects (
2328+ cmd,
2329+ sess,
2330+ archive_builder_builder,
2331+ crate_type,
2332+ tmpdir,
2333+ codegen_results,
2334+ metadata,
2335+ ) ;
23202336 add_local_crate_allocator_objects ( cmd, codegen_results) ;
23212337
23222338 // Avoid linking to dynamic libraries unless they satisfy some undefined symbols
0 commit comments