@@ -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
}
@@ -224,11 +225,7 @@ pub fn link_binary(
224
225
let remove_temps_from_module =
225
226
|module : & CompiledModule | maybe_remove_temps_from_module ( false , false , module) ;
226
227
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.
232
229
if let Some ( ref allocator_module) = codegen_results. allocator_module {
233
230
remove_temps_from_module ( allocator_module) ;
234
231
}
@@ -320,7 +317,7 @@ fn link_rlib<'a>(
320
317
RlibFlavor :: Normal => {
321
318
let ( metadata, metadata_position) =
322
319
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 ) ;
324
321
match metadata_position {
325
322
MetadataPosition :: First => {
326
323
// Most of the time metadata in rlib files is wrapped in a "dummy" object
@@ -388,7 +385,7 @@ fn link_rlib<'a>(
388
385
let src = read ( path)
389
386
. unwrap_or_else ( |e| sess. dcx ( ) . emit_fatal ( errors:: ReadFileError { message : e } ) ) ;
390
387
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 ( ) ) ;
392
389
packed_bundled_libs. push ( wrapper_file) ;
393
390
} else {
394
391
let path = find_native_static_library ( lib. name . as_str ( ) , lib. verbatim , sess) ;
@@ -692,6 +689,7 @@ fn link_natively(
692
689
crate_type : CrateType ,
693
690
out_filename : & Path ,
694
691
codegen_results : & CodegenResults ,
692
+ metadata : & EncodedMetadata ,
695
693
tmpdir : & Path ,
696
694
) {
697
695
info ! ( "preparing {:?} to {:?}" , crate_type, out_filename) ;
@@ -716,6 +714,7 @@ fn link_natively(
716
714
tmpdir,
717
715
temp_filename,
718
716
codegen_results,
717
+ metadata,
719
718
self_contained_components,
720
719
) ;
721
720
@@ -2142,17 +2141,25 @@ fn add_local_crate_allocator_objects(cmd: &mut dyn Linker, codegen_results: &Cod
2142
2141
/// Add object files containing metadata for the current crate.
2143
2142
fn add_local_crate_metadata_objects (
2144
2143
cmd : & mut dyn Linker ,
2144
+ sess : & Session ,
2145
+ archive_builder_builder : & dyn ArchiveBuilderBuilder ,
2145
2146
crate_type : CrateType ,
2147
+ tmpdir : & Path ,
2146
2148
codegen_results : & CodegenResults ,
2149
+ metadata : & EncodedMetadata ,
2147
2150
) {
2148
2151
// When linking a dynamic library, we put the metadata into a section of the
2149
2152
// 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) ;
2156
2163
}
2157
2164
}
2158
2165
@@ -2242,6 +2249,7 @@ fn linker_with_args(
2242
2249
tmpdir : & Path ,
2243
2250
out_filename : & Path ,
2244
2251
codegen_results : & CodegenResults ,
2252
+ metadata : & EncodedMetadata ,
2245
2253
self_contained_components : LinkSelfContainedComponents ,
2246
2254
) -> Command {
2247
2255
let self_contained_crt_objects = self_contained_components. is_crt_objects_enabled ( ) ;
@@ -2316,7 +2324,15 @@ fn linker_with_args(
2316
2324
// in this DAG so far because they can only depend on other native libraries
2317
2325
// and such dependencies are also required to be specified.
2318
2326
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
+ ) ;
2320
2336
add_local_crate_allocator_objects ( cmd, codegen_results) ;
2321
2337
2322
2338
// Avoid linking to dynamic libraries unless they satisfy some undefined symbols
0 commit comments