sbpf_disassembler/
program.rs1use object::Endianness;
2use object::read::elf::ElfFile64;
3use serde::{Deserialize, Serialize};
4
5use crate::{
6 elf_header::ELFHeader, errors::DisassemblerError, program_header::ProgramHeader,
7 section_header::SectionHeader, section_header_entry::SectionHeaderEntry,
8};
9
10#[derive(Debug, Serialize, Deserialize)]
11pub struct Program {
12 pub elf_header: ELFHeader,
13 pub program_headers: Vec<ProgramHeader>,
14 pub section_headers: Vec<SectionHeader>,
15 pub section_header_entries: Vec<SectionHeaderEntry>,
16}
17
18impl Program {
19 pub fn from_bytes(b: &[u8]) -> Result<Self, DisassemblerError> {
20 let elf_file = ElfFile64::<Endianness>::parse(b)
21 .map_err(|_| DisassemblerError::NonStandardElfHeader)?;
22
23 let elf_header = ELFHeader::from_elf_file(&elf_file)?;
25
26 let program_headers = ProgramHeader::from_elf_file(&elf_file)?;
28
29 let (section_headers, section_header_entries) = SectionHeader::from_elf_file(&elf_file)?;
31
32 Ok(Self {
33 elf_header,
34 program_headers,
35 section_headers,
36 section_header_entries,
37 })
38 }
39}
40
41#[cfg(test)]
42mod tests {
43 use hex_literal::hex;
44
45 use crate::program::Program;
46
47 #[test]
48 fn try_deserialize_program() {
49 let program = Program::from_bytes(&hex!("7F454C460201010000000000000000000300F700010000002001000000000000400000000000000028020000000000000000000040003800030040000600050001000000050000002001000000000000200100000000000020010000000000003000000000000000300000000000000000100000000000000100000004000000C001000000000000C001000000000000C0010000000000003C000000000000003C000000000000000010000000000000020000000600000050010000000000005001000000000000500100000000000070000000000000007000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007912A000000000007911182900000000B7000000010000002D21010000000000B70000000000000095000000000000001E0000000000000004000000000000000600000000000000C0010000000000000B0000000000000018000000000000000500000000000000F0010000000000000A000000000000000C00000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000120001002001000000000000300000000000000000656E747279706F696E7400002E74657874002E64796E737472002E64796E73796D002E64796E616D6963002E73687374727461620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000600000000000000200100000000000020010000000000003000000000000000000000000000000008000000000000000000000000000000170000000600000003000000000000005001000000000000500100000000000070000000000000000400000000000000080000000000000010000000000000000F0000000B0000000200000000000000C001000000000000C001000000000000300000000000000004000000010000000800000000000000180000000000000007000000030000000200000000000000F001000000000000F0010000000000000C00000000000000000000000000000001000000000000000000000000000000200000000300000000000000000000000000000000000000FC010000000000002A00000000000000000000000000000001000000000000000000000000000000")).unwrap();
50 println!("{:?}", program.section_header_entries);
51 }
52}