@@ -309,6 +309,9 @@ fn link_rlib<'a>(
309
309
codegen_results. metadata . raw_data ( ) ,
310
310
) ;
311
311
let metadata = emit_wrapper_file ( sess, & metadata, tmpdir, METADATA_FILENAME ) ;
312
+ if sess. target . arch == "sbf" {
313
+ patch_synthetic_object_file ( sess, & metadata) ;
314
+ }
312
315
match metadata_position {
313
316
MetadataPosition :: First => {
314
317
// Most of the time metadata in rlib files is wrapped in a "dummy" object
@@ -2110,9 +2113,23 @@ fn add_linked_symbol_object(
2110
2113
if let Err ( error) = result {
2111
2114
sess. dcx ( ) . emit_fatal ( errors:: FailedToWrite { path, error } ) ;
2112
2115
}
2116
+ if sess. target . arch == "sbf" {
2117
+ patch_synthetic_object_file ( sess, & path) ;
2118
+ }
2113
2119
cmd. add_object ( & path) ;
2114
2120
}
2115
2121
2122
+ fn patch_synthetic_object_file ( sess : & Session , path : & PathBuf ) {
2123
+ const EM_SBF : [ u8 ; 2 ] = [ 0x07 , 0x01 ] ;
2124
+ if let Ok ( mut sf) = fs:: OpenOptions :: new ( ) . write ( true ) . open ( path) {
2125
+ if let Ok ( _) = sf. seek ( SeekFrom :: Start ( 0x12 ) ) {
2126
+ sf. write ( & EM_SBF ) . unwrap ( ) ;
2127
+ }
2128
+ } else {
2129
+ sess. fatal ( & format ! ( "failed to patch {}" , path. display( ) ) ) ;
2130
+ }
2131
+ }
2132
+
2116
2133
/// Add object files containing code from the current crate.
2117
2134
fn add_local_crate_regular_objects ( cmd : & mut dyn Linker , codegen_results : & CodegenResults ) {
2118
2135
for obj in codegen_results. modules . iter ( ) . filter_map ( |m| m. object . as_ref ( ) ) {
0 commit comments