Skip to content

Commit bafbbd7

Browse files
authored
elf: fix conversion script (#394)
1 parent 6b22c37 commit bafbbd7

File tree

1 file changed

+23
-69
lines changed

1 file changed

+23
-69
lines changed

src/bin/convert_elf.rs

Lines changed: 23 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -2,103 +2,57 @@ use flatbuffers::FlatBufferBuilder;
22
use prost::Message;
33
use solfuzz_agave::context_generated as fbs_ctx;
44
use solfuzz_agave::elf_generated as fbs_elf;
5-
use solfuzz_agave::metadata_generated as fbs_meta;
65
use solfuzz_agave::proto as pb;
7-
use solfuzz_agave::utils::fd_hash::fd_hash_u64_without_seed;
8-
use solfuzz_agave::utils::fd_hash::fd_hash_without_seed;
96
use std::env;
107
use std::fs;
118
use std::io;
129
use std::path::PathBuf;
1310

14-
fn convert_fixture_proto_to_flatbuf(input: &pb::ElfLoaderFixture) -> Vec<u8> {
11+
fn convert_ctx_proto_to_flatbuf(input: &pb::ElfLoaderCtx) -> Vec<u8> {
1512
let mut fbb = FlatBufferBuilder::new();
1613

17-
// metadata
18-
let metadata_off = input.metadata.as_ref().map(|m| {
19-
let ent = fbb.create_string(&m.fn_entrypoint);
20-
fbs_meta::FixtureMetadata::create(
21-
&mut fbb,
22-
&fbs_meta::FixtureMetadataArgs {
23-
fn_entrypoint: Some(ent),
24-
},
25-
)
26-
});
27-
2814
// input ctx
29-
let input_off = input.input.as_ref().map(|ctx| {
30-
let features_off = {
31-
let ctx_features = ctx.features.clone().unwrap_or_default();
32-
let vec_off = if ctx_features.features.is_empty() {
33-
fbb.create_vector::<u64>(&[])
34-
} else {
35-
fbb.create_vector(&ctx_features.features)
36-
};
37-
fbs_ctx::FeatureSet::create(
38-
&mut fbb,
39-
&fbs_ctx::FeatureSetArgs {
40-
features: Some(vec_off),
41-
},
42-
)
43-
};
44-
let elf_off = ctx.elf.as_ref().map(|elf| fbb.create_vector(&elf.data));
45-
fbs_elf::ELFLoaderCtx::create(
15+
let features_off = input.features.as_ref().map(|features| {
16+
let vec_off = fbb.create_vector(&features.features);
17+
fbs_ctx::FeatureSet::create(
4618
&mut fbb,
47-
&fbs_elf::ELFLoaderCtxArgs {
48-
elf_data: elf_off,
49-
features: Some(features_off),
50-
deploy_checks: ctx.deploy_checks,
19+
&fbs_ctx::FeatureSetArgs {
20+
features: Some(vec_off),
5121
},
5222
)
5323
});
5424

55-
// output effects
56-
let output_off = input.output.as_ref().map(|eff| {
57-
let (rodata_hash, calldests_hash) = if eff.error != 0 {
58-
(0, 0)
59-
} else {
60-
(fd_hash_without_seed(&eff.rodata), unsafe {
61-
fd_hash_u64_without_seed(&eff.calldests)
62-
})
63-
};
64-
fbs_elf::ELFLoaderEffects::create(
65-
&mut fbb,
66-
&fbs_elf::ELFLoaderEffectsArgs {
67-
rodata_hash: Some(&fbs_ctx::XXHash::new(&rodata_hash.to_le_bytes())),
68-
text_cnt: eff.text_cnt,
69-
text_off: eff.text_off,
70-
entry_pc: eff.entry_pc,
71-
calldests_hash: Some(&fbs_ctx::XXHash::new(&calldests_hash.to_le_bytes())),
72-
err_code: eff.error as u8,
73-
},
74-
)
75-
});
25+
let elf_off = input
26+
.elf
27+
.as_ref()
28+
.map(|elf| fbb.create_vector(elf.data.as_slice()));
7629

77-
let fixture_off = fbs_elf::ELFLoaderFixture::create(
30+
let ctx_off = fbs_elf::ELFLoaderCtx::create(
7831
&mut fbb,
79-
&fbs_elf::ELFLoaderFixtureArgs {
80-
metadata: metadata_off,
81-
input: input_off,
82-
output: output_off,
32+
&fbs_elf::ELFLoaderCtxArgs {
33+
elf_data: elf_off,
34+
features: features_off,
35+
deploy_checks: input.deploy_checks,
8336
},
8437
);
85-
fbb.finish(fixture_off, None);
38+
39+
fbb.finish(ctx_off, None);
8640
fbb.finished_data().to_vec()
8741
}
8842

8943
fn read_file(path: &PathBuf) -> io::Result<Vec<u8>> {
9044
fs::read(path)
9145
}
9246

93-
fn decode_fixture(bytes: &[u8]) -> Result<pb::ElfLoaderFixture, prost::DecodeError> {
94-
pb::ElfLoaderFixture::decode(bytes)
47+
fn decode_ctx(bytes: &[u8]) -> Result<pb::ElfLoaderCtx, prost::DecodeError> {
48+
pb::ElfLoaderCtx::decode(bytes)
9549
}
9650

9751
fn process_file(path: &PathBuf, out_dir: &PathBuf) -> i32 {
9852
match read_file(path) {
99-
Ok(bytes) => match decode_fixture(&bytes) {
100-
Ok(fixture) => {
101-
let out = convert_fixture_proto_to_flatbuf(&fixture);
53+
Ok(bytes) => match decode_ctx(&bytes) {
54+
Ok(ctx) => {
55+
let out = convert_ctx_proto_to_flatbuf(&ctx);
10256
// Write to output directory with same filename
10357
if let Err(e) = fs::create_dir_all(out_dir) {
10458
eprintln!(
@@ -129,7 +83,7 @@ fn process_file(path: &PathBuf, out_dir: &PathBuf) -> i32 {
12983
}
13084
Err(e) => {
13185
eprintln!(
132-
"{}: failed to decode protobuf ElfLoaderFixture: {}",
86+
"{}: failed to decode protobuf ElfLoaderCtx: {}",
13387
path.display(),
13488
e
13589
);

0 commit comments

Comments
 (0)