Skip to content

Commit 3c1b275

Browse files
dmakarovLucasSte
authored andcommitted
[SOL] Temporarily patch BPF ELF file header with SBF machine code
1 parent 57fde63 commit 3c1b275

File tree

1 file changed

+18
-1
lines changed
  • compiler/rustc_codegen_ssa/src/back

1 file changed

+18
-1
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ use std::cell::OnceCell;
4646
use std::collections::BTreeSet;
4747
use std::ffi::OsString;
4848
use std::fs::{read, File, OpenOptions};
49-
use std::io::{BufWriter, Write};
49+
use std::io::{prelude::*, BufWriter, SeekFrom, Write};
5050
use std::ops::Deref;
5151
use std::path::{Path, PathBuf};
5252
use 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.
19481965
fn 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

Comments
 (0)