@@ -46,7 +46,7 @@ use itertools::Itertools;
46
46
use std:: collections:: BTreeSet ;
47
47
use std:: ffi:: { OsStr , 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 } ;
@@ -311,6 +311,9 @@ fn link_rlib<'a>(
311
311
codegen_results. metadata . raw_data ( ) ,
312
312
) ;
313
313
let metadata = emit_wrapper_file ( sess, & metadata, tmpdir, METADATA_FILENAME ) ;
314
+ if sess. target . arch == "sbf" {
315
+ patch_synthetic_object_file ( sess, & metadata) ;
316
+ }
314
317
match metadata_position {
315
318
MetadataPosition :: First => {
316
319
// Most of the time metadata in rlib files is wrapped in a "dummy" object
@@ -2013,9 +2016,23 @@ fn add_linked_symbol_object(
2013
2016
if let Err ( error) = result {
2014
2017
sess. dcx ( ) . emit_fatal ( errors:: FailedToWrite { path, error } ) ;
2015
2018
}
2019
+ if sess. target . arch == "sbf" {
2020
+ patch_synthetic_object_file ( sess, & path) ;
2021
+ }
2016
2022
cmd. add_object ( & path) ;
2017
2023
}
2018
2024
2025
+ fn patch_synthetic_object_file ( sess : & Session , path : & PathBuf ) {
2026
+ const EM_SBF : [ u8 ; 2 ] = [ 0x07 , 0x01 ] ;
2027
+ if let Ok ( mut sf) = fs:: OpenOptions :: new ( ) . write ( true ) . open ( path) {
2028
+ if let Ok ( _) = sf. seek ( SeekFrom :: Start ( 0x12 ) ) {
2029
+ sf. write ( & EM_SBF ) . unwrap ( ) ;
2030
+ }
2031
+ } else {
2032
+ sess. fatal ( & format ! ( "failed to patch {}" , path. display( ) ) ) ;
2033
+ }
2034
+ }
2035
+
2019
2036
/// Add object files containing code from the current crate.
2020
2037
fn add_local_crate_regular_objects ( cmd : & mut dyn Linker , codegen_results : & CodegenResults ) {
2021
2038
for obj in codegen_results. modules . iter ( ) . filter_map ( |m| m. object . as_ref ( ) ) {
0 commit comments