program.rs 3.3 KB

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