@@ -167,6 +167,7 @@ pub fn link_binary(
167
167
crate_type,
168
168
& out_filename,
169
169
& codegen_results,
170
+ & metadata,
170
171
path. as_ref ( ) ,
171
172
) ;
172
173
}
@@ -230,11 +231,7 @@ pub fn link_binary(
230
231
let remove_temps_from_module =
231
232
|module : & CompiledModule | maybe_remove_temps_from_module ( false , false , module) ;
232
233
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.
238
235
if let Some ( ref allocator_module) = codegen_results. allocator_module {
239
236
remove_temps_from_module ( allocator_module) ;
240
237
}
@@ -326,7 +323,7 @@ fn link_rlib<'a>(
326
323
RlibFlavor :: Normal => {
327
324
let ( metadata, metadata_position) =
328
325
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 ) ;
330
327
match metadata_position {
331
328
MetadataPosition :: First => {
332
329
// Most of the time metadata in rlib files is wrapped in a "dummy" object
@@ -394,7 +391,7 @@ fn link_rlib<'a>(
394
391
let src = read ( path)
395
392
. unwrap_or_else ( |e| sess. dcx ( ) . emit_fatal ( errors:: ReadFileError { message : e } ) ) ;
396
393
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 ( ) ) ;
398
395
packed_bundled_libs. push ( wrapper_file) ;
399
396
} else {
400
397
let path = find_native_static_library ( lib. name . as_str ( ) , lib. verbatim , sess) ;
@@ -698,6 +695,7 @@ fn link_natively(
698
695
crate_type : CrateType ,
699
696
out_filename : & Path ,
700
697
codegen_results : & CodegenResults ,
698
+ metadata : & EncodedMetadata ,
701
699
tmpdir : & Path ,
702
700
) {
703
701
info ! ( "preparing {:?} to {:?}" , crate_type, out_filename) ;
@@ -722,6 +720,7 @@ fn link_natively(
722
720
tmpdir,
723
721
temp_filename,
724
722
codegen_results,
723
+ metadata,
725
724
self_contained_components,
726
725
) ;
727
726
@@ -2098,17 +2097,25 @@ fn add_local_crate_allocator_objects(cmd: &mut dyn Linker, codegen_results: &Cod
2098
2097
/// Add object files containing metadata for the current crate.
2099
2098
fn add_local_crate_metadata_objects (
2100
2099
cmd : & mut dyn Linker ,
2100
+ sess : & Session ,
2101
+ archive_builder_builder : & dyn ArchiveBuilderBuilder ,
2101
2102
crate_type : CrateType ,
2103
+ tmpdir : & Path ,
2102
2104
codegen_results : & CodegenResults ,
2105
+ metadata : & EncodedMetadata ,
2103
2106
) {
2104
2107
// When linking a dynamic library, we put the metadata into a section of the
2105
2108
// 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) ;
2112
2119
}
2113
2120
}
2114
2121
@@ -2198,6 +2205,7 @@ fn linker_with_args(
2198
2205
tmpdir : & Path ,
2199
2206
out_filename : & Path ,
2200
2207
codegen_results : & CodegenResults ,
2208
+ metadata : & EncodedMetadata ,
2201
2209
self_contained_components : LinkSelfContainedComponents ,
2202
2210
) -> Command {
2203
2211
let self_contained_crt_objects = self_contained_components. is_crt_objects_enabled ( ) ;
@@ -2272,7 +2280,15 @@ fn linker_with_args(
2272
2280
// in this DAG so far because they can only depend on other native libraries
2273
2281
// and such dependencies are also required to be specified.
2274
2282
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
+ ) ;
2276
2292
add_local_crate_allocator_objects ( cmd, codegen_results) ;
2277
2293
2278
2294
// Avoid linking to dynamic libraries unless they satisfy some undefined symbols
0 commit comments