sbpf_disassembler/
program.rs

1use 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        // Parse elf header.
24        let elf_header = ELFHeader::from_elf_file(&elf_file)?;
25
26        // Parse program headers.
27        let program_headers = ProgramHeader::from_elf_file(&elf_file)?;
28
29        // Parse section headers and section header entries.
30        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}