@@ -46,7 +46,7 @@ use std::cell::OnceCell;
46
46
use std:: collections:: BTreeSet ;
47
47
use std:: ffi:: OsString ;
48
48
use std:: fs:: { read, File , OpenOptions } ;
49
- use std:: io:: { BufWriter , Write } ;
49
+ use std:: io:: { prelude :: * , BufWriter , SeekFrom , Write } ;
50
50
use std:: ops:: Deref ;
51
51
use std:: path:: { Path , PathBuf } ;
52
52
use std:: process:: { ExitStatus , Output , Stdio } ;
@@ -310,6 +310,9 @@ fn link_rlib<'a>(
310
310
let ( metadata, metadata_position) =
311
311
create_wrapper_file ( sess, b".rmeta" . to_vec ( ) , codegen_results. metadata . raw_data ( ) ) ;
312
312
let metadata = emit_wrapper_file ( sess, & metadata, tmpdir, METADATA_FILENAME ) ;
313
+ if sess. target . arch == "sbf" {
314
+ patch_synthetic_object_file ( sess, & metadata) ;
315
+ }
313
316
match metadata_position {
314
317
MetadataPosition :: First => {
315
318
// Most of the time metadata in rlib files is wrapped in a "dummy" object
@@ -1941,9 +1944,23 @@ fn add_linked_symbol_object(
1941
1944
if let Err ( error) = result {
1942
1945
sess. emit_fatal ( errors:: FailedToWrite { path, error } ) ;
1943
1946
}
1947
+ if sess. target . arch == "sbf" {
1948
+ patch_synthetic_object_file ( sess, & path) ;
1949
+ }
1944
1950
cmd. add_object ( & path) ;
1945
1951
}
1946
1952
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
+
1947
1964
/// Add object files containing code from the current crate.
1948
1965
fn add_local_crate_regular_objects ( cmd : & mut dyn Linker , codegen_results : & CodegenResults ) {
1949
1966
for obj in codegen_results. modules . iter ( ) . filter_map ( |m| m. object . as_ref ( ) ) {
0 commit comments