@@ -46,7 +46,7 @@ use std::cell::OnceCell;
4646use std:: collections:: BTreeSet ;
4747use std:: ffi:: OsString ;
4848use std:: fs:: { read, File , OpenOptions } ;
49- use std:: io:: { BufWriter , Write } ;
49+ use std:: io:: { prelude :: * , BufWriter , SeekFrom , Write } ;
5050use std:: ops:: Deref ;
5151use std:: path:: { Path , PathBuf } ;
5252use std:: process:: { ExitStatus , Output , Stdio } ;
@@ -310,6 +310,9 @@ fn link_rlib<'a>(
310310 let ( metadata, metadata_position) =
311311 create_wrapper_file ( sess, b".rmeta" . to_vec ( ) , codegen_results. metadata . raw_data ( ) ) ;
312312 let metadata = emit_wrapper_file ( sess, & metadata, tmpdir, METADATA_FILENAME ) ;
313+ if sess. target . arch == "sbf" {
314+ patch_synthetic_object_file ( sess, & metadata) ;
315+ }
313316 match metadata_position {
314317 MetadataPosition :: First => {
315318 // Most of the time metadata in rlib files is wrapped in a "dummy" object
@@ -1941,9 +1944,23 @@ fn add_linked_symbol_object(
19411944 if let Err ( error) = result {
19421945 sess. emit_fatal ( errors:: FailedToWrite { path, error } ) ;
19431946 }
1947+ if sess. target . arch == "sbf" {
1948+ patch_synthetic_object_file ( sess, & path) ;
1949+ }
19441950 cmd. add_object ( & path) ;
19451951}
19461952
1953+ fn patch_synthetic_object_file ( sess : & Session , path : & PathBuf ) {
1954+ const EM_SBF : [ u8 ; 2 ] = [ 0x07 , 0x01 ] ;
1955+ if let Ok ( mut sf) = fs:: OpenOptions :: new ( ) . write ( true ) . open ( path) {
1956+ if let Ok ( _) = sf. seek ( SeekFrom :: Start ( 0x12 ) ) {
1957+ sf. write ( & EM_SBF ) . unwrap ( ) ;
1958+ }
1959+ } else {
1960+ sess. fatal ( & format ! ( "failed to patch {}" , path. display( ) ) ) ;
1961+ }
1962+ }
1963+
19471964/// Add object files containing code from the current crate.
19481965fn add_local_crate_regular_objects ( cmd : & mut dyn Linker , codegen_results : & CodegenResults ) {
19491966 for obj in codegen_results. modules . iter ( ) . filter_map ( |m| m. object . as_ref ( ) ) {
0 commit comments